WebRTC SDK API封装(3)-Android/iOS平台

前面两篇已经讲了如何手动编译并封装WebRTC Native C/C++ API的方法及思路,本篇继续对封装的API进行进一步使用,将此功能使用在移动端进行演示,这种使用方式,更适合于即时通讯类产品应用.

打入补丁文件

由于目前版本的WebRTC提供的api封装已经高度集中化,而我这边自己进行封装比较偏向于底层,目的在于解耦,因此底层的封装库就应该完全包含音视频的采集,降噪,编解码,传输功能,这样才能与上层的https/DTLS/ICE等完全解耦,通过研究源码发现,对于音频这块,底层还有各个跨平台的支持,但是对于视频的采集,渲染等,由于WebRTC团队的其他因素考虑(大概是将这部分功能移到APP层去实现,可参考这个说明),从r51版本开始移除视频渲染模块,从r46开始移除视频采集模块,因此这部分需要我们手动将补丁打进去,以方便我们从底层解耦,通过Java jni/Object-C方式调用移动设备的硬件部分功能,这部分的主要修改增加在src/modules/下增加video_capture和video_render子模块,并增加对android/ios平台支持,代码清单部分如下,全部源码请参考我的github下的webrtc_r67_patch子目录:
WebRTC SDK API封装(3)-Android/iOS平台_第1张图片

创建工程

关于Android/iOS平台的操作方法,不再分别进行操作,为简化叙述,以下命令均为Linux平台下编译Android平台目标文件为例,iOS平台的操作基本雷同,请参考前面环境搭建部分描述,不再赘述.

在src/下使用gn gen创建工程,

$gn gen out/Debug --args='target_os="android" target_cpu="arm"'

准备编译

1. 修改编译文件

这里主要修改主目录src/BUILD.gn文件,此文件为编译整个WebRTC系统的入口文件,类似于Makefile文件,用于指定编译目标,我这里是在group(“default”)这个target下进行手动修改的(大约位于82行左右),添加Android/iOS平台所要编译的目标文件,如下:

    if(is_android) {
      deps += [
        #项目中添加wtkrtc_mediaengine/wtkrtc_mediaengine_ios_android目录下
        #BUILD.gn文件中定义的WtkMediaEngineJni目标
        "wtkrtc_mediaengine/wtkrtc_mediaengine_ios_android:WtkMediaEngineJni",
      ]
    } else if(is_ios) {
      deps += [
        #根据需要进行选择编译目标
        #生成*.framework格式
        "wtkrtc_mediaengine/wtkrtc_mediaengine_ios_android:WtkMediaEngineObjC",
        #生成libwtkmediaengineobjc.dylib格式动态库
        "wtkrtc_mediaengine/wtkrtc_mediaengine_ios_android:wtkmediaengineobjc",
      ]
    } else {
      deps += [
        "wtkrtc_linux_mac_loopback:wtkrtc_api_test"
      ]
    }

2. 添加封装库的源码文件

封装代码的思路前一篇文章已经大致讲过,具体不再叙述,源码可在我的github下wtkrtc_mediaengine子目录找到,大致说明一下文件目录结构及用法,方便有兴趣的人研究,想直接使用的可以直接拿我编译好的库文件测试(内网测试,除了手机客户端以外,由于signal部分使用IAX2协议,所以可以自己架设一台asterisk服务器进行测试,关于服务器端,稍后进行说明).
将github上源码的wtkrtc_mediaengine目录整个复制到WebRTC的src/下,其中目录结构说明如下:

  • Android: Android Demo APP
  • iOS: iOS Demo APP
  • wtkrtc_mediaengine_ios_android: 封装库代码
    • BUILD.gn: 定义编译目标代码
    • wtk_engine_sdk: 跨平台封装层,支持android(c/c++ jni)与ios(oc实现)
    • wtk_rtc_api: WebRTC底层音视频引擎封装
    • wtk_service_client: IAX2协议层,用于与Asterisk Server进行通话状态机控制

编译生成目标文件

接下来直接编译我们移动端APP运行需要的库文件,直接编译上面定义的WtkMediaEngineJni,这样可以节省编译时间,不会编译我们不需要的功能代码,如下操作:

$ninja -C out/Debug/ WtkMediaEngineJni

编译完成之后,会在out/Debug/下生成目标文件libWtkMediaEngineJni.so,大小6.5M左右,如下:
WebRTC SDK API封装(3)-Android/iOS平台_第2张图片

Media Server搭建

服务器端的Media Server这部分可根据需要灵活选择,常见的协议有很多如SIP、IAX2等,可选的开源软件也很多,如FreeSwitch、Asterisk等,当然选择一种的时候,相应的客户端库也应该同步支持。
由于我使用的是WebRTC底层的解耦封装,等于说是只提取出了WebRTC的音视频采集、优化处理(降噪回声抑制等)、压缩、编码、解码、传输等核心功能,因此在这之上的Signal部分,可以随意选择,只需要实现VoIP通话的状态机控制即可,如发起通话、转接、挂断等逻辑,我的系统使用Asterisk,Asterisk系统的安装配置方法,网上有很多,大家自行搜索使用,主要就是iax.conf增加的opus编码以及分配的账户,dialplain中添加拨号规则即可,详细代码也可参考我的github下的wtkrtc_server子目录,其中是基于官方asterisk-11.16.0版本,添加了以下功能补丁:

  • 增加opus/vp8 codec;
  • 添加支持JsSIP 功能测试;
  • 添加会议室控制逻辑;
  • 添加断线重连机制;

Demo APP测试

使用已经编译出来的libWtkMediaEngineJni.so库文件,接下来进行APP Demo的测试,代码位于wtkrtc_mediaengine/Android/wtkrtc_demo_app子目录下,在android studio中直接import 这个应用程序,同步之后,jniLibs/armeabi-v7a下已经存在我自己编译的so库文件,直接运行到手机上即可,登陆之后,直接拔打在Server中分配的对方账户。
效果如下:
Audio
WebRTC SDK API封装(3)-Android/iOS平台_第3张图片
Video
WebRTC SDK API封装(3)-Android/iOS平台_第4张图片
至此,移动端平台的WebRTC使用方法完结,本人水平一般,能力有限,欢迎大家指正留言交流!

你可能感兴趣的:(VoIP,Media,Engine,webrtc,voip,webrtc,sdk,webrtc,封装)