目录

  • FFmpeg history
  • Work together
  • Work better
  • FFmpeg releases
  • FFmpeg 5.0 changes
  • Dav1d 状态

FFmpeg 和自由软件社区的更新_大数据


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 工程贡献,很多时候维护与更新是不容易的,所以对这些开源项目的赞助非常有用!