整合第三方媒体栈到PJSIP2.x的PJSUA-LIB

    xiaoxiao2021-03-25  157

      对PJSUA-LIB中媒体定制处理在应用中有实际意义,例如:在安卓5.x系统下,硬件编解码、视频预览等功能已被安卓封装的极其方便易用(被封得也很死),且硬件解码设置时同时设定渲染设备的surfaceview,解码后会自动渲染。视频效果很好,且不易受界面线程影响。视频预览、硬件编解码在安卓方实现,编码后的h264媒体流,在定制后的PJSUA-LIB中RTP封包后,调用媒体传输端口的send_rtp功能,发送rtp包到SDP协商对远端UA;在PJSUA-LIB定制后的视频媒体处理中,对媒体传输端口收到RTP的回调做处理:从抖动缓冲区收到RTP包后,不做解码处理,将多个RTP包中相同时间戳的h264数据收齐后,将h264数据传到安卓端做硬件解码、渲染处理。

      PJSUA-LIB是pjproject2.6中提供的高级别API,下图展示了PJSUA-LIB下左侧媒体处理部分和右侧SIP处理部分,及最上端应用程序pjsua对PJSUA-LIB的调用。应用程序调用PJSUA-LIB库中的API方便地实现:注册、呼叫、事件处理、媒体处理等功能。在方便的同时,也会受到PJSUA-LIB实现的体系制约。

    下面的内容中前部分是从pjsip( https://trac.pjsip.org/repos/wiki/3rd_Party_Media)提供的英文文档翻译过来的,可以按下面的说明查看与媒体部分的相关函数,并从PJSUA-LIB的相关C文件中拷贝同名函数内部代码到alt_pjsua_aud.c和alt_pjsua_vid.c中。或者在工程文件中去除这两个文件中的一个文件,同时将pjsip/src/pjsua-lib源代码中pjsua_aud.c与pjsua_vid.c中的包裹全部代码的下列宏定义注释,这样可以保留PJSUA-LIB中的原音频/视频的功能。

      #if defined(PJSUA_MEDIA_HAS_PJMEDIA) && PJSUA_MEDIA_HAS_PJMEDIA!= 0

      #endif /* PJSUA_MEDIA_HAS_PJMEDIA */

     

      从PJSIP2.0开始,加入了将第三方媒体整合到PJSUA-LIB的支持。按下列步骤,应用程序可以使用第三方媒体栈调用音频、视频,同时使用PJSUA_LIB中提供的完整SIP、NAT和安全(包括SRTP)功能。

    下列PJMEDIA中的功能已经在PJSUA-LIB中被屏蔽 (除非由第三方媒体库提供等效实现):

    声卡设备管理 回音抑制 编解码器 抖动缓冲区 RTP和RTCP WAV文件播放和录音 会议桥 RFC 2833定义的DTMF 等等,除了下面提到的功能

    下列功能可以使用:

    完整SIP功能,包括SIP注册等等。 SDP和SDP协商 NAT穿越功能(包括ICE) Security功能包括TLS和SRTP 媒体端口

    下面三个步骤用PJSUA-LIB整合第三方媒体库:

    在文件pjlib/include/pj/config_site.h中添加:

       #definePJSUA_MEDIA_HAS_PJMEDIA    0

      从PJSUA-LIB库排除PJMEDIA具体实现,可以理解为:你会失去在PJSUA-LIB的所有媒体功能(这将在你的第三方媒体栈处理)。

    同时从pjsip-apps/src/3rdparty_media_sample/config_site.h复制建议设置到pjlib/include/pj/config_site.h . 这些设置主要用于从编译过程中排除不需要的媒体组件。 使用以下命令构建库

        $ make lib

      而不是make或make all。这是因为大多数样板程序由于在PJSUA-LIB中由于缺少媒体错误,将不能被构建建。命令 makelib仅构建单元测试需要的库。

    转到pjsip-apps/src/3rdparty_media_sample目录。此处样板程序展示了整合第三方媒体库的切入点。在alt_pjsua_xxx.c文件内的“TODO”处中填加媒体实现。运行 make命令构建应用,完成后,运行alt_pjsua,功能与pjsua相同。
    转载请注明原文地址: https://ju.6miu.com/read-25005.html

    最新回复(0)