来源:Demuxed 2021 主讲:Jean-Baptiste Kempf @ Videolan 翻译:钟宏成 谈谈 FFmpeg 社区的变化,以及 FFmpeg 项目中发生的事情。FFmpeg 5.0 发布、CoC 和其他一些东西。
目录
- FFmpeg history
- Work together
- Work better
- FFmpeg releases
- FFmpeg 5.0 changes
- Dav1d 状态
FFmpeg 在各种场景下被用于各种处理。大多数在线视频生态依赖于 FFmpeg,许多开源、非开源应用使用 FFmpeg,FFmpeg 也用于许多云上的服务,比如编码、在线转码等。许多人围绕 FFmpeg 创建解决方案,因此 FFmpeg 是整个视频工业里的一个关键部分。很奇怪的是,大多数开发者不知道 FFmpeg 被如何使用,因为许多 FFmpeg 的用户并不与他人交流。FFmpeg 作为关键部分被应用在成百上千的应用中,但其核心社区成员缺只有几十个,并且他们不知道应用场景是什么。
大多数为 FFmpeg, x264 等社区贡献的成员都是志愿劳动,没有任何报酬,大多数开源项目也是这样,这很难。
FFmpeg history
FFmpeg 社区的发展有过很多不顺,过去几年的状况并不理想,我们希望能解决问题,与下游的 FFmpeg 用户一起解决这些问题:
- libav 与 FFmpeg 分离几乎十年,现在基本解决了;
- 主要维护者 Michael Niedermayer 在几年前辞职;
- 邮件列表中的语气比较紧张;
- 很多人害怕提交 patch,因为他们不相信自己的代码能被合并,reviewer 都很严格;
- 下游有很多分支,它们固定在特定的版本上,工作在不同场合,并且在其上有很多 patch。这导致了许多重复工作,并且不更新的 FFmpeg 会有一些安全问题。
Work together
对于 FFmpeg 的社区架构,我们现在有:
- General Assembly:由全部活跃开发者组成,负责重要决策;
- Technical Committee:解决技术问题,裁决技术讨论;
- Community Committee:规范人们在邮件列表与 IRC 频道上的行为,维持工作环境。
Work better
我们同样需要改变开发模式,这些都在讨论中,也许可以有固定的发布周期?或者可以维护一些长期维护版本 LTS release?我们同样在讨论提升开发工具,如何帮助持续继承。人们也在讨论迁移到 GitLab,但目前没什么结果,如果您有好的意见,欢迎参与讨论。最后,code of conduct,其他的一些工具和规则也需要更新。在你看到这个视频的同时,也许一些讨论已经有了进展,但我们还不确定。
如果您有任何反馈,任何建设性的意见,请联系我们,我们来将 FFmpeg 做得更好。
FFmpeg releases
FFmpeg 4.4 在 FFmpeg 4.3 几乎一年后推出,主要有以下更新:
- AV1 硬件解码,SVT-AV1 编码器;
- AVS3 解码器, Linux VP9/HEVC 10bit;
- Cineform HD, SpeedHQ, OpenEXR, TTML 编码器;
- RIST 与 Gopher 支持;
- 许多新 filter。
FFmpeg 5.0 的发布(January 17th, 2022, FFmpeg 5.0 "Lorentz"):
- 包含 FFmpeg 历史中最大的 API 改变,大约有 90 个 commit 用于删除废弃的 API 与数据结构;
- swscale threading;
- 新 filter。
FFmpeg 5.0 changes
- FFmpeg 5.0 最大的变化主要是在 avcodec 的 encoding,decoding:
- 现在音频、视频使用同一个 API;
- 编码的输入、输出解耦。
- 新的回调函数允许编码器输出数据到用户管理的 buffer;
- swscale 中的 AVFrame based API;
- 分离 avformat 与 avcodec,demuxer 不再嵌入整个 decoder context;
- 新的 bitstream filtering API,可以用于编码包头分析;
- codec/format 注册 API 被去除了,现在所有格式总是注册的;
- 类型安全:在许多 API 中
int
替换为size_t
; - 一个 API 变化的举例:
// decoding single video packet in old API
while (pkt->size > 0) {
// decode pkt into frame, comsumes <ret> bytets from pkt
int ret = avcodec_decode_video2(decoder, pkt, frame, &got_output);
if (got_output)
<process frame>
// need to manually offset the buffer
pkt->data = ret;
pkt->size -= ret;
}
-------
// decoding single video packet in new API
avcodec_send_packet(decoder, pkt);
ret = 0;
while (ret >= 0) {
ret = avcodec_receive_frame(decoder, frame);
if (ret < 0)
break;
<process frame>
}
Dav1d 状态
Dav1d 的手写汇编代码已经超过 150k 行,现在支持的汇编有:
- ARM32 & ARM64;
- x86 32bit;
- x86 64bit (SSSE3 & AVX2)。
在单线程,几乎所有能做的优化都已经实现了,但在多线程优化上还有提升空间,现在使用的自动多线程模型可以在给定线程数的情况下自动设定 Frame-threads、Slice-threads、Filter-threads。Dav1d 的 1.0 版本即将发布,接下来的工作可能是在 AVX512,PPC 上,或是使用 GPU 加速。
最后,特别需要提到的是,最近 FFmpeg 社区的进展主要有 YouTube 和 Facebook 赞助,许多 dav1d 上的进展由 Netflix 赞助。许多人在他们自己的时间为 FFmpeg 工程贡献,很多时候维护与更新是不容易的,所以对这些开源项目的赞助非常有用!
附上演讲视频:
http://mpvideo.qpic.cn/0b2exuaagaaacaaegya7fvrfbpodao6qaaya.f10002.mp4?dis_k=00a699f7ba795aa9fd686bd2fe6fb447&dis_t=1649674931&vid=wxv_2292154755672129537&format_id=10002&support_redirect=0&mmversion=false