我试图用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_标志_any允许搜索每个帧,而不仅仅是关键帧。