Libav (ffmpeg) 容器编解码器时基和流时基的目的是什么?

问题描述

我看到了这个答案,Libav (ffmpeg) copying decoded video timestamps to encoder

但我仍然不明白为什么我们需要流时基和编解码器时基。目前我正在尝试编写一些代码来确定在我的解码器的视频中显示帧的时间,所以我认为正确的方法是这样的

aVFrame.best_effort_timestamp * stream.time_base.num * stream.time_base.den 对吗?

解决方法

“为什么我们需要两者”是一个加载语句。我们不需要两者。你的问题应该是为什么我们两者都有。

这不是 ffmpeg/libav 的发明,它是媒体文件工作方式的副作用。一些(但不是全部)编解码器具有将时基编码到编解码器比特流(例如 h.264)中的机制。然后可以将这些比特流写入/混合到一个容器(例如 mp4)中,该容器也对时基进行编码。理论上这些应该匹配,但在实践中它们通常不匹配。 libav 只是解析文件并使用那里的内容填充结构。