Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >技术解码| 基于ijkplayer的快直播传输层SDK应用实践

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

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

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

快直播传输层SDK(libLebConnection)只包含了传输层协议模块,包含信令、建联、RTPRTCP、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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
技术解码 | 详解快直播传输层SDK的FFmpeg集成和编译
自从快直播传输层SDK发布以来,越来越多的客户通过快直播传输层SDK libLebConnection接入,其接入便捷性受到客户的肯定。libLebConnection和相应的WebRTC Demuxer实现了多个版本的迭代优化,主要有下面4点: 追求极致性能,提升首帧、开播成功率和卡顿等QoS指标。 提升SDK的易用性、稳定性和完备性。 打磨瘦身,SDK体积减少30%,实现ARM64打包增量不超过500K。 实现Android、iOS、Windows、Linux和Mac全终端平台覆盖。 前面我们已
腾讯云音视频
2022/01/04
1.3K0
快直播传输层SDK内部播控接入实践
快直播传输层SDK自推出来,凭借其便捷接入方式和优异性能,得到快直播客户的肯定。经过2年多的技术积累、迭代、调优和打磨,开播成功率、首帧耗时、卡顿率等指标提升到了一个新的台阶,指标业界领先。越来越多的客户通过传输层SDK接入原有播放器,实现了直播业务的低延时升级。近期快直播传输层SDK2.0版本发布,推出了内部播控模式,进一步降低了接入门槛,增强低延时播放性能。本文延续《基于ijkplayer的快直播传输层SDK应用实践》,详细介绍2.0版本支持的SDK内部播控模式,及其框架和接入方式。
腾讯云音视频
2023/08/11
6700
快直播传输层SDK内部播控接入实践
技术干货:实时视频直播首屏耗时400ms内的优化实践
直播行业的竞争越来越激烈,进过2018年这波洗牌后,已经度过了蛮荒暴力期,剩下的都是在不断追求体验。最近正好在做直播首开优化工作,实践中通过多种方案并行,已经能把首开降到500ms以下,借此机会分享出来,希望能对大家有所启发。
JackJiang
2018/11/22
2.9K0
直播间源码android音视频开发
简介: 随着音视频领域的火热,在很多领域(教育,游戏,娱乐,体育,跑步,餐饮,音乐等)尝试做音视频直播/点播功能,那么作为开发一个小白,如何快速学习音视频基础知识,了解音视频编解码的传输协议,编解码方式,以及如何技术选型,如何解决遇到的坑,本文抛砖引玉,欢迎大咖交流。
云豹短视频嘉兴
2020/08/24
3.7K0
腾讯云快直播低延时播放质量的优化实践
直播已经潜移默化成为许多人日常生活密不可分的一部分。无论是紧张刺激的比赛直播,还是垂涎欲滴的美食直播,亦或者自卖自夸的购物直播,大家都不希望在观看时出现长时间的加载和卡顿,对一些需要观众及时反馈的直播场景,过高的延时也是用户不希望出现的。如何保证直播的快速、清晰、低延时成为各大厂商必须直面的难题。我们很荣幸地邀请到了腾讯云音视频的费伟老师来到LiveVideoStackCon 2022北京站介绍他们的解决办法。 文/费伟 编辑/LiveVideoStack 大家下午好,很高兴能参加LiveVideoStac
LiveVideoStack
2023/04/12
3.8K0
腾讯云快直播低延时播放质量的优化实践
让IjkPlayer支持插入自定义的GPU滤镜
最近因为工作的原因,需要提供一个将我们的AiyaEffectsSDK插入到IjkPlayer中的示例,就不得不好好看了下IjkPlayer的代码。在IjkPlayer中并没有提供设置自定义GPU滤镜的接口,所以最后只能自己动手,以求丰衣足食了。不得不说,Bilibili开源的这个IjkPlayer播放器的确非常强大,代码设计的非常清晰,仔细看看,能学到不少东西。
望天
2019/05/26
1.8K0
如何入门音视屏
保存视频的每一帧,每一个像素没要必要,而且也是不现实的,因为这个数据量太大了,以至于没办法存储和传输,比如说,一个视频大小是 1280×720 像素,一个像素占 12 个比特位,每秒 30 帧,那么一分钟这样的视频就要占 1280×720×12×30×60/8/1024/1024=2.3G 的空间,所以视频数据肯定要进行压缩存储和传输的。 而可以压缩的冗余数据有很多,从空间上来说,一帧图像中的像素之间并不是毫无关系的,相邻像素有很强的相关性,可以利用这些相关性抽象地存储。同样在时间上,相邻的视频帧之间内容相似,也可以压缩。每个像素值出现的概率不同,从编码上也可以压缩。人类视觉系统(HVS)对高频信息不敏感,所以可以丢弃高频信息,只编码低频信息。对高对比度更敏感,可以提高边缘信息的主观质量。对亮度信息比色度信息更敏感,可以降低色度的解析度。对运动的信息更敏感,可以对感兴趣区域(ROI)进行特殊处理。 视频数据压缩和传输的实现与最终将这些数据还原成视频播放出来的实现是紧密相关的,也就是说视频信息的压缩和解压缩需要一个统一标准,即音视频编码标准。
我就是马云飞
2018/10/25
1.1K0
IjkPlayer初始化过程
最近调研做视频秒开,使用B站开源的ijkplayer作为播放器。ijkplayer基于ffmpeg的播放器。
None_Ling
2018/10/24
2K0
IJKPlayer问题集锦之不定时更新
1、IJKPlayer 不像系统播放器会给你旋转视频角度,所以你需要通过onInfo的what == IMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED去获取角度,自己旋转画面;或者开启硬解硬解码,不过硬解码容易造成黑屏无声,诸位慎重啊O__O "…。
GSYTech
2018/08/22
4K0
IJKPlayer问题集锦之不定时更新
基于WebRTC的开源低延时播放器实践
  //   编者按:随着互联网的发展、流量咨询费用的下降,直播互动越来越多的呈现在大众面前。直播带货、游戏主播,亦或者是大型网课,在直播中良好的网络环境与低延时是优质交互体验的关键。在这个各家云服务厂商标准不统一的年代,如何让低延时直播更加便捷稳定呢?本次LiveVideoStackCon 2022音视频技术大会上海站邀请到了毕伟老师为我们介绍网易云信的解决方案。 文/毕伟 整理/LiveVideoStack 大家下午好!我是网易云信资深音视频引擎研发工程师毕伟,今天为大家介绍云信开源低延时播放器的相关
LiveVideoStack
2022/08/31
3.6K0
基于WebRTC的开源低延时播放器实践
ijkplayer 源码分析
ijkplayer 是一款比较出众的开源 Android/iOS 跨平台播放器,基于 ffplay,API 易于集成,可定制编译控制体积。
字节流动
2021/06/09
2.1K0
ijkplayer 源码分析
如何将ijkplayer引入AS工程中进行二次开发
ijkplayer作为业界最有名的播放器开源项目,理论上说可能很多方面都已经做得很优秀了。我们直接拿来用不就完事了吗?为什么还要进行二次开发,这不是自己给自己挖坑吗?
音视频开发进阶
2020/04/30
1.5K0
播放器秒开优化丨音视频工业实战
视频播放时的画面打开速度是播放体验中一个非常重要的指标,如果视频画面打开速度太慢,用户失去耐心可能就直接划走不看了。如果视频速度打开够快,甚至可以带来业务上的收益,字节跳动就曾给出过一份数据:对一部分型号的 Android 手机,播放首帧时长从平均 170ms 优化到 100ms,带来了 0.6% 左右的用户播放时长提升。
关键帧
2023/02/14
3.7K0
播放器秒开优化丨音视频工业实战
4款知名播放器比较:ijkPlayer、VLC、SmartPlayer、ExoPlayer
ijkPlayer是BiliBili公司维护的一个开源工程,基于ffmpeg开发的一个播放器软件,支持Android和iOS平台,整个ijkplayer就是以ffplay为基础,如果只是使用它进行播放,集成也较为简单,使用也和MediaPlayer差不多,但是要定制化需求,就有一定的门槛高度。支持软硬编解码,支持倍速播放,可以定制化集成需要的功能,集成占用体积也很小,更详细的解释参看下面官方介绍:
音视频牛哥
2021/03/18
9.1K0
视频直播APP SDK选型
即构科技由腾讯QQ团队创业,是市面暂时较好的推流SDK,但是费用太高,可以先做个对比。但美颜效果,连麦功能,狼人杀模式等确实相较其他SDK有很大的优势。
走在河边的小鹿
2020/03/05
4.5K0
视频直播APP SDK选型
IjkPlayer 源码阅读一 初始化
1 背景 公司的底层播放器实际上是ffplayer作为基础修改的,当然需要好好学习研究。 记录下来,作为以后备忘。(发觉人老了,就容易忘事)。ps 入坑需谨慎,很容易入门到放弃。 2 分析入口 分析的连接https://github.com/Bilibili/ijkplayer 版本号: 0.8.1.2 android版 基本上IjkPlayer的接口和MediaPlayer接口一致。http://www.jianshu.com/p/55fbfd5b564a 每次我们发觉分析源码总找不到下口的地方,实
用户1127566
2018/06/06
2.3K0
技术福利:最全实时音视频开发要用到的开源工程汇总
实时音视频的开发学习有很多可以参考的开源项目。一个实时音视频应用共包括几个环节:采集、编码、前后处理、传输、解码、缓冲、渲染等很多环节。每一个细分环节,还有更细分的技术模块。比如,前后处理环节有美颜、滤镜、回声消除、噪声抑制等,采集有麦克风阵列等,编解码有VP8、VP9、H.264、H.265等。 
JackJiang
2018/08/29
7.2K1
白嫖ijkplayer
我们要引入ijkplayer播放器的时候,发现一个小小的缺陷就是so库太大了,一般有3个so库:
马上就说
2020/11/11
1.5K0
白嫖ijkplayer
FFmpeg开发笔记(四十八)从0开始搭建直播系统的开源软件架构
​音视频技术的一个主要用途是直播,包括电视直播、电脑直播、手机直播等等,甚至在线课堂、在线问诊、安防监控等应用都属于直播系统的范畴。由于直播系统不仅涉及到音视频数据的编解码,还涉及到音视频数据的实时传输,因此直播领域采用的网络技术标准比较高,实现起来也比一般的WEB系统复杂。
aqi00
2024/08/18
3290
FFmpeg开发笔记(四十八)从0开始搭建直播系统的开源软件架构
Ijkplayer、ExoPlayer、VLC播放器综合比较
VLC 是VideoLAN 计划所研发的工程,最早预1996年开始,是一个完全的跨平台播放器,适合Windows、Mac OS、Linux、Android、iOS等系统,目前完全的跨平台播放器很少,VLC是最受欢迎的一种播放器;目前累计下载13亿次,是真真正正的全球播放器;
马上就说
2020/12/11
9K0
Ijkplayer、ExoPlayer、VLC播放器综合比较
相关推荐
技术解码 | 详解快直播传输层SDK的FFmpeg集成和编译
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档