本文是 《DangerFFmpeg》系列教程结语,系列完整目录:
开篇
第一节、屏幕截图
第二节、输出到屏幕
第三节、播放声音
第四节、多线程
第五节、视频同步
第六节、同步音频
第七节、快进快退
结语

系列所有代码托管在 GitHub


还有什么?

我们完成了一个可以工作的播放器,但肯定没有想象中那么好。我们做了很多功能,但是还有很多其它的能力可以添加:

  • 让我们面对现实,这个播放器挺糟糕的。我们基于的 ffplay 早就过时了,因此这个系列的教程需要一次大翻修。如果你想更进一步,使用 FFmpeg 完成更加正式的项目,我建议你下一步就去研究最新版的 ffplay。
  • 错误处理。我们代码中的错误处理聊胜于无,这一块有很大的提升空间。
  • 暂停。我们无法暂停,但是暂停显然是一个非常重要的功能。我们可以创建一个暂停标识位,当用户暂停时为其赋值,然后音频视频解码线程也会检查这个变量,停止解码。我们也可以用 av_read_play 支持网络。这很好解释,但是自己可能就不太好理解,可以考虑将这个作为课后作业,如果你打算进一步学习的话。小提示,可以参考 ffplay。
  • 支持硬件加速。
  • 按比特快进快退。如果你以字节而不是秒来计算快进快退的位置,在一些有非连续时间戳的视频上将会更加精确,比如 VOB 文件。
  • 丢弃帧。如果视频进度落后太多,我们应该丢弃下一帧而不是缩短刷新间隔。
  • 支持网络。我们的播放器现在还不支持播放在线资源。
  • 支持原始视频数据,比如 YUV。如果支持 YUV 数据,需要配置一些参数才能播放,因为我们不能猜画面大小和时间基。
  • 全屏播放。
  • 更多选项,比如不同的图像格式;可以查看 ffplay 所支持的命令行参数。

如果你想更进一步了解 FFmpeg,我们已经学习了一部分,下一步应该是要学习编码多媒体文件。FFmpeg 官方示例的 output_example.c 是一个不错的学习起点。我(原作者)也可能编写另一个关于编码的教程,但是现在还没有计划。

UPDATE

距离我上次更新已经过去很久了,音视频领域的软件变得更加成熟。这个教程只需要简单的 API 更新,一些基本概念上几乎没有变化。大多数的更新实际上只是简化了代码。然而,虽然我们重新审查并更新了教程中的代码,但是 ffplay 还是要比这个玩具优秀得多。坦率来说,作为一个真正的播放器,它的可用性几乎为零。所以,如果你或者未来想优化这个教程,去看看 ffplay ,看看我们缺少了那些能力。我猜大概是 ffplay 充分利用了硬件加速,不过我也可能遗漏了一些明显的事情。ffplay 可能发生了翻天覆地的变化,我很久没有看了。

但是我非常自豪,过去这么多年,这个教程还在帮助非常多的人。即使你需要去其它地方才能获取源代码。我非常感谢 chelyaev 将我 8!年前的代码中过时的 API 全部更新。

嗯,我希望这个能够指导一些人并且有趣。如果你对这篇教程有任何建议,发现错误,不同看法或赞誉,请通过 danger@gmail.com 联系我。请不要问我关于你 ffmpeg 项目的问题,因为我收到太多这样的邮件了。

参考文章

原文链接

ffmpeg home page

Martin Bohme’s original tutorial