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

10-08 02:42