我正在使用一个使用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?如果没有,那么同步音频的最佳方式是什么呢?
我想我终于根据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
与标准排序(6 - 1)的差值为5:
| I P B B P B B | DTS: 0 1 2 3 4 5 6 | decode() result: I B B P
<耸肩/>但这是纯粹的猜想.