我试图使用ffmpeg的av_seek_frame方法在电影中寻找,但是我在确定如何生成时间戳以寻找时遇到的最麻烦.假设我想向前或向后寻找x个帧,我知道电影目前在哪个帧,我该怎么做呢?
我是这样做的:
// Duration of one frame in AV_TIME_BASE units int64_t timeBase; void open(const char* fpath){ ... timeBase = (int64_t(pCodecCtx->time_base.num) * AV_TIME_BASE) / int64_t(pCodecCtx->time_base.den); ... } bool seek(int frameIndex){ if(!pFormatCtx) return false; int64_t seekTarget = int64_t(frameIndex) * timeBase; if(av_seek_frame(pFormatCtx, -1, seekTarget, AVSEEK_FLAG_ANY) < 0) mexErrMsgTxt("av_seek_frame failed."); }
AVSEEK_FLAG_ANY可以搜索每个帧而不仅仅是关键帧.
答案很简单:你应该有一个AVFormatContext对象.它的duration
属性告诉你文件在av_seek_frame中可以使用的时间戳乘以1000的时间长度,因此将其视为100%.然后,您可以计算您想要寻找的视频的距离.
如果你想前进一帧,只需调用av_read_frame和avcodec_decode_video,直到它用非零值填充got_picture_ptr.在调用avcodec_decode_video之前,请确保来自av_read_frame的数据包来自视频流.avcodec_decode_video然后将填充AVFrame结构,您可以使用它来执行任何操作.