PJSIP 2.8 android 8 pjsua2编译、运行教程

PJSIP2.8 下载地址https://www.pjsip.org/download.htm

sdk更新 安卓26

ndk用 android-ndk-r15c 

你要觉得麻烦或难解决错误可到https://item.taobao.com/item.htm?id=618486196283获取源码。源码功能性更好、更完善。

想测试apk请加群261074724 

=>官方编译说明
https://trac.pjsip.org/repos/wiki/Getting-Started/Android

1.创建文件:vim pjlib/include/pj/config_site.h 

#define PJ_CONFIG_ANDROID 1
#include <pj/config_site_sample.h>

2.NDK_TOOLCHAIN_VERSION=4.9  APP_PLATFORM=android-26  TARGET_ABI=arm64-v8a ./configure-android --use-ndk-cflags 
make dep && make clean && make

cd pjsip-apps/src/swig=> make

3.把pjsip-apps/src/swig/java/android 项目东西考出来

4.创建一个安卓项目基于8的 包含c++的

创建一个模块包pjsua 把主工程的CMakeLists.txt 及build.gradle里的

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
    cmake {
        cppFlags "-frtti -fexceptions"
        abiFilters 'arm64-v8a'
    }
}
externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}
sourceSets {
    main {
        jniLibs.srcDirs = ['src/main/jniLibs']
    }
}

移到模块下  主工程去掉这些  同时页面main里的cpp移过去

在src /main下的创建一个目录jniLibs/arm64-v8a  导入libpjsua2.so

在cmakelist.txt添加

add_library( libpjsua2 SHARED IMPORTED)
set_target_properties( libpjsua2
                       PROPERTIES IMPORTED_LOCATION
                       ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libpjsua2.so)
target_link_libraries( # Specifies the target library.
                       native-lib
                       libpjsua2 

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

 

在java目录导入包 除了app里的activity 同时吧MyApp类改成public 里面的类我把它考到了my里 结果如下

 

好了在主工程的布局文件添加一个按钮点击注册并添加权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

在oncreate 添加

if (PermissionsUtil.hasPermission(this, new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission. CAMERA  ,Manifest.permission. PROCESS_OUTGOING_CALLS ,Manifest.permission. READ_PHONE_STATE ,Manifest.permission. WRITE_EXTERNAL_STORAGE  })) {
    //有
    start();
} else {
    PermissionsUtil.requestPermission(this, new PermissionListener() {

        public void permissionGranted(@NonNull String[] permissions) {
            //用户授予了
            start();
        }
        public void permissionDenied(@NonNull String[] permissions) {
            //用户拒绝了访问摄像头的申请
            Toast.makeText(MainActivity.this, "您没有授权将无法启用网络电话!", Toast.LENGTH_LONG).show();
        }
    }, new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission. CAMERA ,Manifest.permission. PROCESS_OUTGOING_CALLS ,Manifest.permission. READ_PHONE_STATE ,Manifest.permission. WRITE_EXTERNAL_STORAGE });
}

 

private void start() {

    if (app == null) {
        app = new MyApp();
        /**Wait for GDB to init, for native debugging only
         if (false &&   (getApplicationInfo().flags &   ApplicationInfo.FLAG_DEBUGGABLE) != 0)
         {
         try {
         Thread.sleep(5000);
         } catch (InterruptedException e) {}
         }**/
        app.init(this, getFilesDir().getAbsolutePath());
    }
}

这块是初始化的可以参考编译生成项目的actity

在点击按钮添加

accCfg = new AccountConfig();
accCfg.setIdUri("sip:"+username+"@"+ipport);
accCfg.getRegConfig().setRegistrarUri("sip:"+username+"@"+ipport);
AuthCredInfoVector creds = accCfg.getSipConfig().    getAuthCreds();
creds.clear();

creds.add(new AuthCredInfo("Digest", "*", username, 0, password));

StringVector proxies = accCfg.getSipConfig().getProxies();
proxies.clear();
//  proxies.add(proxy);
/* Enable ICE */
//accCfg.getNatConfig().setIceEnabled(true);
//accCfg.getVideoConfig( ).setAutoTransmitOutgoing(false );
accCfg.getVideoConfig( ).setAutoShowIncoming(true);
try {
    for(MyAccount m : app.accList){
        app.delAcc(m);
    }
    account = app.addAcc(accCfg);
    account.modify(accCfg);

} catch (Exception e) {}

并且让actity实现MyAppObserver

好了 现在就可以点击注册   注册成功后在现实的方法添加输出

@Override
public void notifyRegState(pjsip_status_code code, String reason, int expiration) {
    Log.e("notifyRegState",""+reason);
    if( code==pjsip_status_code. PJSIP_SC_OK){
CodecInfoVector  a = MyApp.ep.codecEnum();
String audioinfo = "";
for( int i=0;i<a.size() ;i++  ){ //可用编码输出
    CodecInfo x= a.get(i);
    audioinfo+=x.getCodecId()+"("+x.getPriority()+")_"; 
}

好了  其他的参考编译的项目的actity了

后面将会讲到gcb729、opus、h264的编译

交流群261074724 

linphone 版教程https://blog.youkuaiyun.com/Java_lilin/article/details/80539116

 

### 如何在 PJSIP 中使用 OpenH264 编解码器 要在 PJSIP 中成功集成并使用 OpenH264 编解码器,需要完成以下几个方面的配置和操作: #### 1. 准备开发环境 为了构建支持 OpenH264 的 PJSIP 库,首先需要准备好必要的工具链和依赖项。以下是所需的资源及其版本要求[^3]: - **Linux 系统**: 提供编译环境。 - **Android SDK 和 NDK**: 版本分别为 `android-sdk_r24.4.1` 和 `android-ndk-r13b`。注意不要使用更高版本的 NDK (如 r14b),因为可能会导致头文件缺失的问题。 - **OpenH264**: 至少需要 v1.6.0 或更新版本。推荐使用稳定版 v1.8.0。 - **SWIG**: 脚本绑定生成器,建议使用 v3.0.12 或以上版本。 #### 2. 获取源代码 分别下载以下项目的最新稳定版本: - **PJSIP**: 可通过官方链接获取 `pjproject-2.8.tar.bz2` 文件[^3]。 - **OpenH264**: 推荐从 GitHub 下载 v1.8.0 源码压缩包[^3]。 #### 3. 构建 OpenH264 按照官方指南,在 Linux 平台上编译 OpenH264。如果目标平台为 Windows,则可以参考 VS2012 的具体编译方法[^4]。主要步骤如下: - 修改批处理脚本中的路径变量 (`MinGWPath`, `MsysPath`, `GitPath`, `Vc11Path`)。 - 执行自动化构建命令以生成动态或静态库文件。 #### 4. 配置 PJSIP 支持 OpenH264 编辑 PJSIP 的配置选项来启用 H.264 功能。这通常涉及修改 `configure.ac` 或其他相关脚本文件,并指定外部 OpenH264 库的位置。例如: ```bash ./configure --with-openh264=/path/to/openh264/installation/ ``` 随后运行常规的 Make 流程完成整个项目的编译过程。 #### 5. 实现动态码率调整功能 得益于 OpenH264 的设计特点,可以在不重启编码实例的前提下更改比特率设置[^1]。此行为由内部 API 控制,允许调用者灵活适应网络条件变化的需求。 下面是一个简单的 Python 示例演示如何利用这些特性管理视频会议场景下的质量调节逻辑: ```python import pjsua as pj class MyAccountCallback(pj.AccountCallback): def on_incoming_call(self, call): # Handle incoming calls here... pass def adjust_bitrate(new_rate_kbps): """Adjust the bitrate dynamically.""" codec_param = pj.MediaCodecParam() codec_param.bitrate = new_rate_kbps * 1000 # Convert to bits per second. lib = pj.Lib.instance() media_config = lib.media_config media_config.codec_prio_list.append(("H264", codec_param)) lib.set_media_config(media_config) # Initialize library and other components before calling this function. adjust_bitrate(500) # Example: Set target rate at 500 kbps. ``` 上述片段展示了怎样定义回调类继承自 `pjsua.AccountCallback` 来响应事件通知;同时提供了一个辅助函数用于即时改变传输速率参数[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值