当编解码器使用p帧时,av_seek_frame中断avcodec_decode_video2

时间:2011-05-21 22:46:48

标签: ffmpeg libavcodec libavformat

我试图理解如何在用p帧编码的视频中寻找(例如H.264) - 现在我只知道如何在用编解码器编码的视频中寻找,其中每个帧都是一个关键帧(例如MJPEG) )。

给定一个时间戳,最终它应该播放该时间戳的帧。 但是现在,我只是想在时间戳附近播放关键帧。所以,首先 -

ret = av_seek_frame(pFormatCtx, videoStream, avTime, 0); 
avcodec_flush_buffers(pCodecCtx);

然后是一些干预代码,包括av_read_frame。然后 -

ret = avcodec_decode_video2(pCodecCtx, captureFrame, &gotPicture, &packet); 

观察:

  • 对于某些视频,这是有效的。对于其他人,avcodec_decode_video2会返回错误(负数)。工作视频示例:here。非工作视频的示例:here

  • 对于MJPEG视频,这是有效的。

  • 如果我取出av_seek_frame,那么它只是依次播放帧,它就可以了。

1 个答案:

答案 0 :(得分:1)

替换此 -

ret = av_seek_frame(pFormatCtx, videoStream, avTime, isPlayingBackward ? AVSEEK_FLAG_BACKWARD : 0); 
avcodec_flush_buffers(pCodecCtx);

用这个 -

ret = avformat_seek_file(pFormatCtx, videoStream, 0, avTime, avTime, 0); 

(警告:avformat_seek_file的文档说:“这是新的搜索API的一部分,它仍在构建中。因此不要使用它。它可能随时改变,不要指望ABI兼容性然而!“)