当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《ffmpegavlibs可以返回准确的PTS吗?》经验,为你挑选了1个好方法。

我正在使用一个使用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?如果没有,那么同步音频的最佳方式是什么呢?



1> hobb0001..:

我想我终于根据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

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

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有