FFmpeg直播能力更新计划与新版本发布

  //  

编者按:客户端作为直接面向用户大众的接口,随着技术的发展进化与时俱进,实现更好的服务是十分必要的。FFmpeg作为最受欢迎的视频和图像处理开源软件,被相关行业的大量用户青睐,而随着HEVC标准的发布到广泛使用,相信国内很多网络流媒体从业者都在长期关注FFmpeg FLV支持HEVC的官方更新。LiveVideoStackCon 2023 上海站邀请了来自快手的音视频首席架构师刘歧,为大家带来他关于FFmpeg 直播能力的更新计划。

文/刘歧

整理/LiveVideoStack

大家好,下面由我和大家分享近期FFmpeg的最新技术、部分未来的发展方向以及一些我个人的经验思考。

5a12ff6bf8c3ba4028592164555eb137.png

首先向大家做一个自我介绍,本人浸淫音视频行业多年,目前是FFmpeg/SRS社区委员会的成员,曾参与编写《FFmpeg 从入门到精通》一书,也是腾讯云最具价值专家TVP。

我于2007年参加工作,早期曾从事图形图像库、Flash解析引擎开发工作。2011年我正式参与音视频流媒体技术开发。2016年受邀成为FFmpeg维护者。2017年成为FFmpeg官方顾问,创业成立了OnVideo。2019年成为FFmpeg决策委员会委员,并开始担任FFmpeg GSoC Mentor。2020年,OnVideo被快手收购,我也随之进入快手工作。

6493f5f439a620d9062b739e12775622.png

接下来简单介绍我做出本次分享的契机。

首先,FFmpeg FFplay的官方版本目前仍然无法实现FLV对封装HEVC、VVC、VP9、AV1、OPUS等现代化编码格式的支持,随着音视频技术的发展,FLV需要随之改变。

第二,业界有声音提出重视HLS、DASH、LLHLS、LLDASH等协议。但目前看来,这些协议的实时性还很差。在CDN分发过程中,链路稍有卡顿就很容易影响广域用户的观看体验。

第三是WebRTC等低延迟协议对当前大规模使用的RTMP、FLV发出了挑战。

8244d102ef91eb180f4703ef4f25e95f.png

基于前述的问题和我们开展的工作,本次分享分为以下四部分:一是介绍FFmpeg支持Enhanced FLV的有关情况;二是介绍FFmpeg支持WHIP的进展;最后是关于未来一些更多有趣的事情。

-01-

FFmpeg支持Enhanced FLV

4598fbe93c1a10ea9a0c0d5caf6c4ae8.png

首先,从官方标准来看,目前FLV的视频Codec ID不包括HEVC,但现有Codec ID可从8拓展到15。

3f1801d37879469f5968b1a95a9fc5a3.png

目前国内一些大厂出于业务需要会拓展官方标准。例如上图,其中视频codec ID增加了12对应的HEVC。但这种方式不适用同时引入多个编码格式,且各企业、厂商对codec ID不同的自定义风格容易导致公共环境混乱。

fbe59750557cbd45fb9c370a0569df5a.png

官方标准内音频编码的定义已经被占满,引入OPUS等新格式的难度较大。

92d34273146f66034126864ec263c6e0.png

我也曾进行过类似尝试,于2014年向FFmpeg team提交了关于FLV支持HEVC编码格式的补丁,但由于没有可供参考的公认标准遭到了反对,实际上该版本也无法播放泛式的FLV视频。

55b9b25f98cabf57280d856de224e808.png

2021年,一位活跃的开发者James Almer做了同样的工作,但由于相同的问题最终未能实现合并。

18d1b5027047924d73064ecb7c14e8a8.png

SRS作为国内主要的CDN服务供应端,早期已经实现了对HEVC编码的支持,并曾向FFmpeg team发出了相关呼吁。可以看到,很多音视频从业者都曾为HEVC over HTTP-FLV的官方化做出努力。

d5c65741cfe2e95fa06f0a46bb0f9d66.png

后来我们意识到,推动Adobe修订现有参考标准才是关键。于是在接下来一段时间里,我们与Adobe的相关人员积极沟通,询问关于参考标准的修订计划。虽然得到了积极回复,但一直没有实质性的进展。

153cd89de33d94ca51110b1688ccea86.png

期间我们也对可用在直播场景的其他网络协议进行了检讨。但目前看来,HLS、DASH、HDS的延迟远大于RTMP/FLV。LLHLS、LLDASH仅在技术上有优于RTMP/FLV的可能,经过实际测试效果并不好。SRT的延迟足够低,但在PC、手机端等多平台的可用性还有不足。

e8187b62d7d0e09696f7b9a3525b4201.png

为了加快实现我们的目标,经过查访,我们与RTMP、FLV的实际维护方,Adobe旗下的Veriskope建立了联系。

f6999f283fd38fcbff0aebc9f0e1bbd5.png

与此同时,从更好地兼容现状这一角度出发。在和Veriskope沟通前,我们利用FourCC代码完成了Enhanced FLV方案。该方案解决了仅依靠修改视频Codec ID可拓展的编码格式数量有限这一缺陷,可实现无限制数量的拓展。

ab3ca703d9e896e0f934b970543fa668.png

相较于传统参考标准,我们针对FrameType增加了拓展模式,以定义对应的读包方式和编码格式。

a852c08b8091e300bf7124e29c6e49f0.png

针对不同FourCC值指向的编码格式,可以对其HVCC和VPCC进行拓展读取。

921f2de0306a19aadf29927b5bb0d9ef.png

在我们向FFmpeg team提交Enhanced FLV补丁的过程中,有videoline的开发者提出疑问:在拓展RTMP时如何明确服务端支持的编码格式。

我们查找了Enhanced RTMP标准,发现只要在conncet command内加入FourCClist即可解决这个问题。

68db7db933aaf30185d30addceb1a915.png

开发完成后,我使用RTMP通过Youtube测试了AV1推流。但发现无论推流何种格式,最终得到的都是VP9格式的流。针对该现象目前我还在等待Youtube开发者的回复解释。

fb343f80f4db5dae28dc266e2bb3d85e.png

相较于HLS和DASH,RTMP/FLV的延迟虽然较低,但链路质量变化或推流抖动等因素同样会引起播放的卡顿和延迟累加,因此我们考虑引入WebRTC进行推流。

-02-

FFmpeg支持WHIP

4f05bf5bf731878d9107df280406370c.png

FFmpeg 支持WHIP这一项目的诞生起于SRS作者杨成立的倡导。当时,现场演示端到端普通推流的延迟仅有500毫秒,可以推定,引入WebRTC是十分可行的。

f6347a24f95fa7dbd158de69a4634927.png

WHIP易于实施。为了建立推流会话,WHIP客户端将向WHIP终端发送包括SDP Offer的HTTP POST请求,返回“201 Created”响应,建立一个SDP。随后WHIP客户端和媒体服务器之间建立ICE/DTLS会话,通过RTP/RTCP开始视频、音频流传输。推流结束后,执行HTTP DELETE请求即可结束ICE/DTLS会话,整个过程只需要实现如上所示的四个简单标准。

47a8ca47ea2e69a4a60086da5aa6bff7.png

我在2023年5月发布了第一版补丁,具体的代码大家可以在Github上找到,Cloudflare的工程师首先响应宣布了支持。

e27a39526cb5b3a48a3de9191e28cbe1.png

Pion随后也反馈宣布支持。

7ab1a62879f760e1139f6a706043e475.png

经过测试,我们发现Janus、Millicast、TRTC等开源服务器均可支持。目前FFmpeg WebRTC可以直接对接这些服务器进行推流。

1d19626576eab4c24706d9ccffdfa410.png

使用WebRTC从采集、推流到播放的延迟经实测约为132毫秒。

4a26f76dd5bd0e897e33bae430657d15.png

但引入WebRTC也带来了一些风险。首先是有可能导致五花八门的网络传输优化算法泛滥,其次是大幅增加了代码量,提高了维护的难度。

-03-

更多有趣的事情

791ffa4b01835999211fc69d5e0c548d.png

最后和大家分享一些有趣的事情。首先是关于FFmpeg,6.1准备发布了,当然也可能会跳过。主要的操作包含实现了Muxer和Demuxer的拆分,实现了format和commandline层的多线程支持,相较于历史版本单线程处理DASH、HLS、MXF等大数据量音视频封装的方式进一步提升了速度;scale支持切slice多线程处理,缩放、色彩转换的性能得到大幅提升;支持了VVC解码;支持了软件无线电(Software Defined Radio),可以收听一些广播节目;支持了Enhanced FLV和Enhanced RTMP。

然后,我同其他作者共同编写了《深入理解FFmpeg》一书,此次在介绍FFmpeg基本组成的基础上进一步结合实例讲解了API的使用,目前已经全渠道开售了,大家可以在京东、当当、淘宝买到。

2ceeeffcd54750bb74900c3eaa7e1913.png

我本次的分享就到这里,谢谢大家!


f56a8af95dff0fc12f6c0ab1d0283dce.png

▼点击下方阅读原文 ▼

进入LiveVideoStackCon 2023深圳站官网 了解更多精彩演讲

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/162764.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ClickHouse开发系列

一、 ClickHouse详解、安装教程_clickhouse源码安装 二、ClickHouse 语法详解_clickhouse讲解 三、ClickHouse SQL 操作语句详解 四、ClickHouse 高级教程—官方原版 五、ClickHouse主键索引最佳实践 六、MySQL与ClickHouse集成 七、ClickHouse 集成MongoDB、Re…

制造业企业设备管理常见的三个问题及对应的解决方案

当今的市场如同茫茫大海,既充满机遇,也伴随着波动的风险。在现代制造业中,企业常常面临着各种挑战,这些挑战可能妨碍其发展和竞争力。但制造企业往往具备能够解决挑战的能力,借助软件工具的力量,可以更好地…

微信小程序-form表单-获取用户输入文本框的值

微信小程序-form表单-获取用户输入文本框的值 data: {userName: ,userPwd:""},//获取用户输入的用户名 userNameInput:function(e) {this.setData({userName: e.detail.value}) }, passWdInput:function(e) {this.setData({userPwd: e.detail.value}) }, //获取用户输…

美国Embarcadero产品经理Marco Cantù谈Delphi/C++ Builder目前开发应用领域

美国Embarcadero产品经理Marco Cant 日前在欧洲的一次信息技术会议上谈到了Delphi/C Builder目前开发应用领域:RAD Studio Delphi/C Builder目前应用于哪些开发领域?使用 Delphi 和 CBuilder 进行开发为当今众多企业提供了动力。 航空航天 大型数据采集 …

WPF中的Binding的常见知识点与技巧

完全来源于十月的寒流,感谢大佬讲解 在XAML中,可以绑定到许多不同类型的数据源和属性。以下是一些可以绑定的常见数据源和属性: 属性:可以绑定到对象的属性,例如控件的Text、Visibility、IsEnabled等属性。 集合&am…

鳄鱼指标的3颜色线都代表什么?澳福官网一段话明白了

投资者一直在使用鳄鱼指标进行交易,但是对指标上面的3种颜色的K线都代表什么不明白?直到看到澳福官网一段话才明白,原来这么简单! 鳄鱼指标,这一工具是由三条移动平均线组合而成。具体来说,蓝线&#xff0…

行情分析——加密货币市场大盘走势(11.6)

大饼昨日下跌过后开始有回调的迹象,现在还是在做指标修复,大饼的策略保持逢低做多。稳健的依然是不碰,目前涨不上去,跌不下来。 以太周五给的策略,入场的已经止盈了,现在已经达到1884,已经全部吃…

java 之数据类型的转换

文章目录 package javastudy;public class arraytest{public void ad(int a,int b) {System.out.printf("ab is %f",ab);}public static void main(String[] args) {arraytest arr new arraytest();arr.ad(1.0, 2);//arr.ad(1 , 2);} }当我们的方法的数据类型是int …

Python实现Labelme的Json标注文件与YOLO格式的TXT标注文件相互转换

Python实现Labelme的Json标注文件与YOLO格式的TXT标注文件相互转换 前言前提条件相关介绍实验环境Labelme的Json标注文件与YOLO格式的TXT标注文件相互转换convert_labelme_json_to_txtjsons/000000000009.json代码实现输出结果labels/000000000009.txt convert_txt_to_labelme_…

Webpack 中 Plugin 的作用是什么?常用 plugin 有哪些?

说说webpack中常见的Plugin?解决了什么问题?- 题目详情 - 前端面试题宝典 1、plugin 的作用 Plugin 是一种计算机应用程序,它和主应用程序互相交互,以提供特定的功能。 是一种遵循一定规范的应用程序接口编写出来的程序&#…

【大模型应用开发教程】04_大模型开发整体流程 基于个人知识库的问答助手 项目流程架构解析

大模型开发整体流程 & 基于个人知识库的问答助手 项目流程架构解析 一、大模型开发整体流程1. 何为大模型开发定义核心点核心能力 2. 大模型开发的整体流程1. 设计2. 架构搭建3. Prompt Engineering4. 验证迭代5. 前后端搭建 二、项目流程简析步骤一:项目规划与…

模拟IC经典面试题目及答案汇总,这些经典题目你刷到过几个?

有不少小伙伴说还想要更多模拟IC方向的面试题目,这不就来了!(文末可领全部面试题目) 请描述一下 CMOS 的工艺流程 1)光刻形成 well 阱区:在 p 型硅衬底上生长一层氧化层,涂光刻胶&#xff0c…