关于ffmpeg解码含有B帧的H264流时的疑惑 按照我从网上查的资料,解码器会重新排序含有B帧的H264数据流:the
关于ffmpeg解码含有B帧的H264流时的疑惑
按照我从网上查的资料,解码器会重新排序含有B帧的H264数据流:
the Input sequence for video decoder
1 4 2 3 7 5 6
I P B B I B B
Let's take 1,2,3.. as PTS for simplification
the out sequence for video decoder
1 2 3 4 5 6 7
I B B P B B I
但是问题是,ffmpeg在解码时,每一帧解码时调用avcodec_decode_video2(),要么得到YUV,要么没得到.
那么,假设我按照上面的帧队列来调用avcodec_decode_video2(),第一次input[0]是I帧肯定解码成功并得到图像,可第二次当我开始解码input[1]也就是PTS为4的P帧时,avcodec_decode_video2()会返回什么?如果它返回成功并得到图像,那网上的说法就不对了.因为它先于PTS为2的B帧的图像返回了.也就是说ffmpeg没有帮我重新排序.经过我验证这是不会发生的,更有可能是下面这样:
它返回的是解码成功,但是没有得到图像失败,那就是说ffmpeg把P帧保存到缓存了,那问题就来了,如果我一共有4帧视频分别为I,B,B,P,编码后顺序:IPBB.我调了四次接口,第一次得到了一张图像,第二次没有得到.第三次得到了.第四次也得到了.也就是说我一共才得到3张图像?如果ffmpeg真的是这样工作的,那我是不是丢失了一帧图像?那缓存里的图像我怎么样才能得到?
[解决办法]参考这个文章试试:http://blog.yikuyiku.com/?tag=avcodec_decode_video2