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

hob*_*001 8 dts mpeg ffmpeg pts

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

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

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

hob*_*001 11

我想我终于根据http://www.dranger.com/ffmpeg/tutorial05.html中的评论想出了正在发生的事情:

ffmpeg重新排序数据包,以便avcodec_decode_video()处理的数据包的DTS将始终与它返回的帧的PTS 相同

翻译:如果我将数据包输入到具有12的PTS的avcodec_decode_video()中,avcodec_decode_video()将不会返回该数据包中包含的解码帧,直到我将其提供给DTS为12 的后续数据包.如果数据包的PTS是与其DTS相同,则给出的包与返回的帧相同.如果数据包的PTS比其DTS晚2帧,那么avcodec_decode_video()将延迟帧并且不再返回它,直到我再提供2个数据包.

基于这种行为,我猜测av_read_frame()可能会将数据包从IPBB重新排序到IBBP,这样avcodec_decode_video()只需将P帧缓冲3帧而不是5帧.例如,输入和输入之间的差异.此排序的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
Run Code Online (Sandbox Code Playgroud)

与标准排序(6 - 1)的差值为5:

|                  I P B B P B B
|             DTS: 0 1 2 3 4 5 6
| decode() result:       I B B P
Run Code Online (Sandbox Code Playgroud)

<耸肩/>但这是纯粹的猜想.


小智 2

好吧,把我之前困惑的回复划掉。

对于 IBBPBBI 电影,您希望 PTS 看起来像这样(按解码顺序)

0, 3, 1, 2, 6, 4, 5, ...
Run Code Online (Sandbox Code Playgroud)

对应于帧

I, P, B, B, I, B, B, ...
Run Code Online (Sandbox Code Playgroud)

因此,您似乎在序列开头缺少一个 I,但时间戳看起来是正确的。