快直播传输层SDK自推出来,凭借其便捷接入方式和优异性能,得到快直播客户的肯定。经过2年多的技术积累、迭代、调优和打磨,开播成功率、首帧耗时、卡顿率等指标提升到了一个新的台阶,指标业界领先。越来越多的客户通过传输层SDK接入原有播放器,实现了直播业务的低延时升级。近期快直播传输层SDK2.0版本发布,推出了内部播控模式,进一步降低了接入门槛,增强低延时播放性能。本文延续基于ijkplayer的快直播传输层SDK应用实践,详细介绍2.0版本支持的SDK内部播控模式,及其框架和接入方式。
需求背景
在和很多客户联调接入过程中,我们发现不同客户不同设备平台的播放器播控逻辑实现千差万别,不同业务不同网络场景对延时的要求也各有不同,导致低延时播放能力和体验参差不齐。还有播放器层buffer无法利用来作为重传、排序的jitterbuffer,所以会影响低延时下抗弱网抖动的能力。为此,我们提出了SDK内部播控模式,客户在接入快直播时无需再担心低延时播控问题,实现更快更好的接入、提升低延时传输和播放性能。
  • 为不同播放器不同平台(安卓、iOS、Windows、Mac和Linux)提供一致的低延时播放性能和体验。
  • 结合动态伸缩jitterbuffer,根据网络抖动自适应调整jitterbuffer大小和延时,抗丢包率从30%提升至50%,实现弱网下更流畅的播放体验。
播控框架
外部播控
外部播控,即播放器负责播控逻辑,传输层SDK通过demuxer输出音视频裸数据给播放器缓存,播放器根据业务的延迟要求设置缓存大小,再根据缓存状态调整播放速度,以保证缓存保持在一定的区间内。并且由于播放速度的变化,播放器需要对音频数据进行变速不变调的信号处理。
图1. 外部播控播放器框架
内部播控
内部播控就是在传输层SDK内部实现播控逻辑。如图2所示,先由jitterbuffer分别负责音视频数据包的排序、重传、组帧等逻辑,再根据jitterbuffer状态调整播放速度。SDK通过外部注册音频解码器,再通过回调实现内部音频解码,并根据音视频jitterbuffer状态对PCM进行时域伸缩处理和变速不变调处理,然后音视频同步后输出视频数据和音频PCM数据给播放器。播放器层无需再进行播速控制和音频处理(图3)这里SDK采用音频解码器外部注册的方式,主要是为了保持SDK最小体积,Android和iOS ARM64单架构打包增量都保持在500KB左右
图2. 内部播控SDK框架
图3. 内部播控播放器框架
内部播控ijkplayer集成示例
修改WebRTC demuxer,具体改动详见2.0.2版本webrtc_demuxer.c原文件。
1. 增加音频解码回调实现,并设置相关回调函数接口
2. 增加PCM解码器配置,codec_id为AV_CODEC_ID_PCM_S16LE
ijkplayer需要开启pcm_s16le解码器,按如下改动。
3. 设置内部解码相关参数
cfg.enable_play_control = 1 // 开启内部播控
cfg. enable_smoothing_output = 1; //开启平滑输出
cfg.max_jitter_delay_ms = 3000; //SDK内部JitterBuffer上限,可以控制延时上限
cfg.min_jitter_delay_ms = 200; //SDK内部JitterBuffer下限,可以控制延时下限
cfg.max_output_speed = 1.2; //内部播控最快允许追帧倍速
cfg.min_output_speed = 0.9; //内部播控最慢允许慢播倍速
4. 播放器层播放改动,关闭packet_buffering和开启infinite_buffer功能
ijkplayer演示app相关改动
性能测试演示
低延时性能测试
通过obs rtmp推流秒表页面至腾讯云,编码配置如下图,采用720p,baseline,码控CBR,2500kbps,2秒GOP,veryfast,zerolatency模式。
通过快直播ijkplayer demo app拉流播放,对比两端画面,端到端延时在1秒左右。
抗丢包性能测试
为了在相同环境下对比测试,我们在Mac上同时对比H5 WebRTC和传输层SDK的播放器性能。由于在内部播控模式下,不依赖播放器的播控,我们采用ffplay命令行测试,命令为:
ffplay  -fflags nobuffer webrtc://stream/streamid
视频中左为H5 WebRTC播放,右为基于快直播传输层SDK的ffplay播放,丢包率依次设置10%,20%, 30%,40%,50%下行丢包(通过Mac系统工具Network Link Conditioner模拟)。H5 WebRTC在20%丢包率时开始出现明显卡顿,30%丢包开始严重卡顿,40%丢包时画面跳变,声音开始抖动,音画出现不同步,50%丢包时画面几乎卡死;而同时,基于快直播传输层SDK的ffplay在0~50%丢包率下,全程音画同步流畅播放,且两者延时相近。
可见传输层SDK内部播控模式能在正常网络下保持较低延迟,而在弱网下自动增大buffer提高弱网抗性,保持流畅播放,一般单纯30%丢包率,jitterbuffer大小在1秒左右。
欢迎大家扫描下方二维码下载快直播传输层SDK及ijkplayer进行测试体验。

快直播传输层SDK
ijkplayer安卓demo

如果您有相关业务需求或想要进一步了解快直播相关产品内容,欢迎扫描下方二维码添加音视频小姐姐微信,与我们的产研团队深入沟通交流。
腾讯云音视频在音视频领域已有超过21年的技术积累,持续支持国内90%的音视频客户实现云上创新,独家具备腾讯云RT-ONE™全球网络,在此基础上,构建了业界最完整的 PaaS 产品家族,并通过腾讯云视立方 RT-Cube™ 提供All in One 的终端SDK,助力客户一键获取众多腾讯云音视频能力。腾讯云音视频为全真互联时代,提供坚实的数字化助力

继续阅读
阅读原文