ffmpeg av libs 可以返回准确的 PTS 吗?

2023-11-22

我正在使用使用 IBBP...GOP 序列的 mpeg 流。这(DTS,PTS)前 4 个 AVPacket 返回的值如下:I=(0,3) B=(1,1) B=(2,2) P=(3,6)

I 帧上的 PTS 看起来是合法的,但 B 帧上的 PTS 不可能是正确的,因为 B 帧不应该在 I 帧之前显示,正如它们的 PTS 值所指示的那样。我还尝试解码数据包并使用生成的 AVFrame 中的 pts 值,将 PTS 始终设置为零。

有没有办法从 ffmpeg 中获得准确的 PTS?如果不是,那么同步音频的最佳方法是什么?


我想我终于根据评论中的评论弄清楚发生了什么http://www.dranger.com/ffmpeg/tutorial05.html:

ffmpeg 对数据包重新排序,以便 avcodec_decode_video() 处理的数据包的 DTS 将总是一样作为它返回的帧的 PTS

翻译:如果我向 avcodec_decode_video() 提供一个 PTS 为 12 的数据包,avcodec_decode_video() 将不会返回该数据包中包含的解码帧,直到我向它提供一个laterDTS 为 12 的数据包。如果数据包的 PTS 与其 DTS 相同,则给出的数据包与返回的帧相同。如果数据包的 PTS 比其 DTS 晚 2 帧,则 avcodec_decode_video() 将延迟该帧并且不会返回它,直到我再提供 2 个数据包。

基于这种行为,我猜测 av_read_frame() 可能会将数据包从 IPBB 重新排序到 IBBP,以便 avcodec_decode_video() 只需缓冲 3 帧而不是 5 帧的 P 帧。例如,输入和具有此排序的 P 帧的输出为 3 (6 - 3):

|                  I B B P B B P
|             DTS: 0 1 2 3 4 5 6
| decode() result:       I B B P

与标准排序 (6 - 1) 相差 5 的情况相比:

|                  I P B B P B B
|             DTS: 0 1 2 3 4 5 6
| decode() result:       I B B P

但这纯粹是猜测。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ffmpeg av libs 可以返回准确的 PTS 吗? 的相关文章

随机推荐