2

我试图了解如何在用 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返回错误(负数)。工作视频示例:此处。非工作视频示例:此处

  • 对于 MJPEG 视频,这是可行的。

  • 如果我取出av_seek_frame, 以便它按顺序播放帧,它就可以工作。

4

1 回答 1

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 兼容性!”)

于 2011-05-22T18:09:22.677 回答