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,但时间戳看起来是正确的。
| 归档时间: |
|
| 查看次数: |
10166 次 |
| 最近记录: |