18

ffmpeg の av_seek_frame メソッドを使用してムービーをシークしようとしていますが、シークするタイムスタンプを生成する方法を決定するのに最も苦労しています。x フレームを前方または後方にシークしたいと仮定し、映画が現在どのフレームにあるかを知っているとしたら、どうすればこれを行うことができますか?

4

3 に答える 3

18

これが私がそれをした方法です:

// 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 は、キーフレームだけでなく、すべてのフレームへのシークを有効にします。

于 2012-01-05T07:59:32.080 に答える