Can the ffmpeg av libs return an accurate PTS?

后端 未结 3 719
無奈伤痛
無奈伤痛 2020-12-29 14:28

I\'m working with an mpeg stream that uses a IBBP... GOP sequence. The (DTS,PTS) values returned for the first 4 AVPackets are as follows: I=(0,3) B=(1,1)

3条回答
  •  星月不相逢
    2020-12-29 14:59

    I think I finally figured out what's going on based on a comment made in http://www.dranger.com/ffmpeg/tutorial05.html:

    ffmpeg reorders the packets so that the DTS of the packet being processed by avcodec_decode_video() will always be the same as the PTS of the frame it returns

    Translation: If I feed a packet into avcodec_decode_video() that has a PTS of 12, avcodec_decode_video() will not return the decoded frame contained in that packet until I feed it a later packet that has a DTS of 12. If the packet's PTS is the same as its DTS, then the packet given is the same as the frame returned. If the packet's PTS is 2 frames later than its DTS, then avcodec_decode_video() will delay the frame and not return it until I provide 2 more packets.

    Based on this behavior, I'm guessing that av_read_frame() is maybe reordering the packets from IPBB to IBBP so that avcodec_decode_video() only has to buffer the P frames for 3 frames instead of 5. For example, the difference between the input and the output of the P frame with this ordering is 3 (6 - 3):

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

    vs. a difference of 5 with the standard ordering (6 - 1):

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

    but that is pure conjecture.

提交回复
热议问题