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.mzph.cn/news/130003.shtml

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

相关文章

【jvm】虚拟机栈

目录 一、背景二、栈与堆三、声明周期四、作用五、特点(优点)六、可能出现的异常七、设置栈内存大小八、栈的存储单位九、栈运行原理十、栈帧的内部结构10.1 说明10.2 局部变量表10.3 操作数栈10.4 动态链接10.5 方法返回地址10.6 一些附加信息 十一、代…

整理10个地推拉新app接单平台,免费一手推广渠道平台干货分享

1. 聚量推客: “聚量推客”汇聚了众多市场上有的和没有的地推网推拉新接单项目,目前比较火热,我们做地推和网推从业者如果长期在这行业去做推广可以使用这个平台,价格高数据也好,大部分拉新项目也都是官签一手资源 一…

关于Intel Press出版的《Bedyong BIOS》第2版的观后感

文章目录 此书的背景UEFI运行时DXE基础CPU架构协议PCI协议UEFI驱动的初始化串口DXE驱动示例 《Beyond BIOS》首先介绍一个简单的UEFI应用程序模块,用于展示UEFI应用程序的行为。作者为Waldo。该模块名为“InitializeHelloApplication”,它接受两个参数&a…

Leetcode—101.对称二叉树【简单】

2023每日刷题(十九) Leetcode—101.对称二叉树 利用Leetcode101.对称二叉树的思想的实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isSa…

【深度学习基础】Pytorch框架CV开发(1)基础铺垫

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

3 — NLP 中的标记化:分解文本数据的艺术

一、说明 这是一个系列文章的第三篇文章, 文章前半部分分别是: 1 、NLP 的文本预处理技术 2、NLP文本预处理技术:词干提取和词形还原 在本文中,我们将介绍标记化主题。在开始之前,我建议您阅读我之前介绍的关…

Docker的简单安装

安装环境 CentOS Linux release 8.1.1911 (Core)内核4.18.0-147.el8.x86_64Mini Installation 安装前的准备工作 切换国内源 由于centos源已经过期,所以切换为阿里云的yum源,第二个是docker的仓库 wget -O /etc/yum.repos.d/CentOS-Base.repo https:…

云闪付app拉新推广一手渠道 附详细教程

云闪付推广拉新可以通过“聚量推客”申请 云闪付是什么呢?是中国银联出的支付平台,在地推和网推项目里也算是比较火热的app拉新产品,属于地推和网推的百搭项目,操作也简单 只需要动账就算一个数据,目前主要招收地推、…

重新思考边缘负载均衡

本文介绍了Netflix在基于轮询的负载均衡的基础上,集成了包括服务器使用率在内的多因素指标,并对冷启动服务器进行了特殊处理,从而优化了负载均衡逻辑,提升了整体业务性能。原文: Rethinking Netflix’s Edge Load Balancing[1] 我…

第十五章 EM期望极大算法及其推广

文章目录 导读符号说明混合模型伯努利混合模型(三硬币模型)问题描述三硬币模型的EM算法1.初值2.E步3.M步初值影响p,q 含义 EM算法另外视角Q 函数BMM的EM算法目标函数LEM算法导出 高斯混合模型GMM的EM算法1. 明确隐变量, 初值2. E步,确定Q函数3. M步4. 停止条件 如何应用GMM在聚…

软测推荐第二期:10本高质量测试书籍

在不断发展的软件开发领域,测试是质量的守护者,确保产品不仅满足功能要求,而且提供无缝的用户体验。随着软件复杂性的增加,对完善的测试方法和见解的需求也随之增加。 上次给大家推荐了五本书,获得了大家的积极反馈&a…

RT-Thread系统使用常见问题处理记录

1.使用telnet连接系统时发送help指令显示不全的问题。 原因:telnet发送缓存太小。 解决办法:更改agile_telnet软件包里Set agile_telnet tx buffer size的大小。 2.使用Paho MQTT软件包过一段时间报错hard fault on thread: mqtt0 解决办法&#xff1…

UE5加载websocket模块为空

今天测试UE 发现工程启动不了,后来看到原来是websocket模块无法加载。 解决的它的方法很简单,这种问题一般会出现在源码版本的引擎或者是停电了,导致UElaunch版本损坏,解决方法是来到源码版本的引擎 这个目录下: D:\…

稳定性测试—fastboot和monkey区别

一、什么是稳定性测试 稳定性测试是指检验程序在一定时间内能否稳定地运行,在不同的场景下能否正常地工作的过程。主要目的是检测崩溃、内存泄漏、堆栈错误等缺陷。 二、Monkey 1.什么是Monkey 是一个命令行工具,通常在adb安卓调试运行,模…

ABAP简单的队列设置QRFC

场景:用job的方式在接口里启用job,如果接口调用比较频繁,存在同一时间启动相同job的情况,会导致锁表锁程序这种情况。 查阅job函数,发现在JOB_CLOSE函数里自带了类似队列的参数,但是因为是接口&#xff0c…

如何卸载干净 IDEA(图文讲解)windows和Mac教程

大家好,我是sun~ 很多小伙伴会问 Windows / Mac 系统上要怎么彻底卸载 IDEA 呢? 本文通过图片文字,详细讲解具体步骤: 如何卸载干净 IDEA(图文讲解) Windows1、卸载 IDEA 程序2、注册表清理3、残留清理 M…

重生奇迹mu下载后仅仅只是挂机吗?

挂挂机、聊聊天,打打怪,如此简单、轻松的游戏或许有,但绝对不是重生奇迹mu!因为重生奇迹mu挂机也不是那么容易,即便是多名高端玩家组队挂机,也有可能是全队惨灭,这样的情况时常发生在游戏中。 …

【入门Flink】- 05Flink运行时架构以及一些核心概念

系统架构 Flink运行时架构Standalone会话模式为例 1)作业管理器(JobManager) JobManager 是一个 Flink 集群中任务管理和调度的核心,是控制应用执行的主进程。每个应用都应该被唯一的 JobManager 所控制执行。 JobManger 又包含…

聚观早报 |盒马参战双11;真我GT5 Pro将压轴登场

【聚观365】11月4日消息 盒马参战双11 真我GT5 Pro将压轴登场 奇瑞汽车10月销量创新高 iQOO 12系列将首发电竞芯片Q1 苹果CEO库克称正改善供需平衡 盒马参战双11 不少消费者反映,今年盒马的双11已悄然开始:10月20日起,盒马APP很多商品页…

【3D图像分割】基于 Pytorch 的 VNet 3D 图像分割3(3D UNet 模型篇)

在本文中,主要是对3D UNet 进行一个学习和梳理。对于3D UNet 网上的资料和GitHub直接获取的代码很多,不需要自己从0开始。那么本文的目的是啥呢? 本文就是想拆解下其中的结构,看看对于一个3D的UNet,和2D的UNet&#x…