前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >技术解码| 基于ijkplayer的快直播传输层SDK应用实践

技术解码| 基于ijkplayer的快直播传输层SDK应用实践

作者头像
腾讯云音视频
发布2021-07-12 12:41:18
3.2K0
发布2021-07-12 12:41:18
举报
文章被收录于专栏:音视频咖

导语 | 快直播是对标准直播边缘进行WebRTC改造的一种低延迟直播产品方案,在低延迟的同时,完全兼容标准直播的推流、云端媒体处理能力,并具有CDN强大的分发能力。客户可以从现有的标准直播平滑地迁移到快直播上来,快速实现低迟时直播场景应用[1][2]。快直播接入方式主要有两种:第一种通过浏览器和H5接入标准WebRTC,第二种通过SDK接入升级扩展的WebRTC。一般WebRTC SDK包含全套拉流、解码、渲染等功能,而在传统标准直播的客户中,往往已经有一套播放器和相应的业务逻辑,如何基于现有播放器快速接入快直播低延迟播放能力,成为普遍的客户需求。本文基于使用广泛的具有代表性开源播放器ijkplayer,介绍接入快直播传输层SDK和相关低延迟播放优化。

快直播传输层SDK(libLebConnection)只包含了传输层协议模块,包含信令、建联、RTP、RTCP、NACK和FEC等,并通过前后端配合对传输质量进行优化,实现了较好的QoS/QoE性能[1][2]。主要功能包含AAC和OPUS音频拉流、H.264和H.265视频拉流、并支持视频B帧。同时简化了SDK接口,使用非常方便,如下图所示:

快直播传输层SDK输出是音视频裸数据,非常容易封装成demuxer集成到传统播放器中。下图给出了ijkplayer集成快直播传输层SDK的工作流程,集成工作主要分为两步,第一步将libLebConnection封装实现webrtc_demuxer,第二步根据业务要求实现低延迟播控逻辑。下面以Android arm64为例,介绍具体集成工作。

FFmpeg webrtc demuxer

FFmpeg webrtc demuxer 只要按 FFmpeg 的 AVInputFormat 接口定义来实现ff_webrtc_demuxer,接口包括webrtc_probe,webrtc_read_header,webrtc_read_packet和webrtc_close。具体实现可以见我们SDK提供的webrtc_demuxer.c 源文件。

webrtc demuxer集成到ijkplayer有两种方式:

第一种 不改动FFmpeg,通过外部注册的方式集成。ijkplayer目前的FFmpeg是老版本的4.0,支持外部注册的方式注册第三方demuxer,我们可以不改动FFmpeg代码的情况下,使ijkplayer编译webrtc_demuxer.c源文件和链接libLebConnection库,在ff_ffplay.c使用快直播时注册ff_webrtc_demuxer。具体步骤如下:

1. 把头文件leb_conntion_api.h拷贝到ijkplayer/android/contrib/build/ffmpeg-arm64/output/include/下面,再把动态库文件libLebConnection_so.so拷贝到ijkplayer/android/contrib/build/ffmpeg-arm64/output/下面。

2. 修改 ijkplayer/android/ijkplayer/ijkplayer-arm64/src/main/jni/ffmpeg/Android.mk(ijkplayer项目中,此文件软连接到ijkplayer/android/ijkplayer/ijkplayer-armv7a/src/main/jni/ffmpeg/Android.mk)

3. 拷贝webrtc_demuxer.c放入到ijkplayer/ijkmedia/ijkplayer目录下。

4. 修改ijkplayer/ijkmedia/ijkplayer/Android.mk文件,添加webrtc_demuxer.c编译和libLebConnection链接

5. 修改ijkplayer/android/ijkplayer/ijkplayer-arm64/src/main/jni/Application.mk,APP_STL改为c++_shared,这是由于libLebConnection 依赖了 libc++_shared 动态库。

6. 修改ijkmedia/ijkplayer/ff_ffplay.c,添加播放快直播url打开逻辑,注册ff_webrtc_demuxer,并指定 ff_webrtc_demuxer 为 input format 。

第二种 新版本FFmpeg已经废弃外部注册demuxer,可以直接修改FFmpeg代码加入webrtc_demuxer到libavformat,编译webrtc_demuxer.c和链接libLebConnection_so.so。

1. 直接将webrtc_demuxer.c拷贝到FFmpeg/libavformat文件夹下,并修改libavformat/Makefile,加入webrtc_demuxer.o编译。

2. 修改libavformat/allformats.c,加入ff_webrtc_demuxer

3. 此时FFmpeg configure需要加入libLebConnection头文件和库的依赖的选项:

“--extra-cflags=-I/path/libLebConnection/include --extra-ldflags=-L/path/libLebConnection/lib/ --extra-libs='-lLebConnection_so -lc++_shared”

4. 修改ijkmedia/ijkplayer/ff_ffplay.c,添加播放快直播url逻辑,注册ff_webrtc_demuxer并指定为 input format 。同第一种方法的第5和6步。

在完成上面集成工作后,ijkplayer就能播放webrtc://开头的快直播url。在ijkplayer demo播放list中添加快直播url,如下图所示:

3.1 低延迟播控优化

由于FFmpeg和ijkplayer有较大buffer缓冲,端到端的延迟依旧比较大,需要针对低延迟进行播控优化,优化分为两部分。

第一部分优化,修改ijkplayer配置,使其适合低延迟播放场景。

1. 直播场景时实时推流,可以开启无限制buffer,这样可以尽可能快的读取数据,避免出现网络拥塞恢复后延迟累积的情况。

ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "infbuf", 1);

2. ijkplayer中的buffering逻辑不适合低延迟直播场景,可以关闭。快直播传输层SDK是基于webrtc增强的半可靠传输协议,在一般弱网(20%)下能保证音视频正常播放,极端弱网(50%丢包)场景下,也可以保证音频正常播放,视频低帧率播放。

ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 0);

3. 需要根据buffer水位调整播放速率,同时开启soundtouch对倍速播放下对PCM进行处理,实现变速不变调。ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER,"soundtouch", 1);

第二部分优化,需要实现根据buffer水位调整播放速率。

下面代码是一个简单的示例,原理就是

  1. 当buffer时长大于目标高水位时加快播放速率进行追帧
  2. 当buffer时长小于目标低水位时降低播放速率等待新数据
  3. 当buffer时长在高低水位区间之内保持正常播放速率

示例中目标高水位为500ms,目标低水位为200ms,实际可以根据业务的延迟要求设置具体阈值。

由于关闭了buffering,那如何来统计卡顿次数和卡顿时长呢。可以通过统计渲染刷新时间间隔来统计。当视频渲染时间间隔大于一定阈值,记一次卡顿次数,并累计进卡顿时长。

3.2 端到端延迟测试

先通过OBS推流时间秒表页面,并进行低延迟编码设置:GOP设2秒,编码模式veryfast,Profile为baseline,并采用zerolatency降低编码延时。

ijkplayer目标buffer水位设置200~300ms,可以稳定流畅播放快直播流,对两端画面的比秒表时间间隔,端到端延迟稳定在800ms左右。当然我们的低延时播控优化示例只是抛砖引玉,客户可能需要在各自的业务场景下进行具体的优化适配。

快直播优异的低延迟性和弱网抗性能已经得到了广泛的认可。我们专门实现了快直播传输层SDK,不仅通过前后端配合优化实现了较好的传输质量,而且简化了使用接口,提升易用性,方便客户在各种场景下应用。本文以传统播放器ijkplayer为例,给出了详细快直播传输层SDK集成方法和播控优化示例,测试结果显示,jikplayer播放快直播,在端到端延迟在800ms下实现稳定流畅的播放。客户可以参考本示例,对原有播放器进行较小改动就可以实现低延迟播放能力。在当下低延迟直播互动潮流中,传统播放器可以借助快直播焕发新的生命力,更好的满足低延迟直播需求。

快直播官网地址:

https://cloud.tencent.com/product/leb

快直播传输层SDK支持Android、IOS、Windows三个终端平台,可以从这里获取:

https://github.com/tencentyun/libLebConnectionSDK

参考

1. 快直播-基于WebRTC升级的低延时直播

https://cloud.tencent.com/developer/article/1760040

2. 腾讯云快直播——超低延迟直播技术方案及应用

https://cloud.tencent.com/developer/article/1736846

腾讯云音视频在音视频领域已有超过21年的技术积累,持续支持国内90%的音视频客户实现云上创新,独家具备 RT-ONETM 全球网络,在此基础上,构建了业界最完整的 PaaS 产品家族,并以 All in One SDK 的创新方式为客户服务。腾讯云音视频为全真互联网时代,提供坚实的数字化助力。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云音视频 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • FFmpeg webrtc demuxer
  • 3.1 低延迟播控优化
  • 3.2 端到端延迟测试
  • 参考
相关产品与服务
云直播
云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档