ffmpeg av_seek_frame - PullRequest
       9

ffmpeg av_seek_frame

17 голосов
/ 02 февраля 2009

Я пытаюсь искать в фильме, используя метод ffmpeg av_seek_frame, однако у меня больше всего проблем с определением того, как сгенерировать метку времени для поиска. Предполагая, что я хочу искать x количество кадров в прямом или обратном направлении, и я знаю, в каком кадре находится фильм в данный момент, как мне поступить?

Ответы [ 2 ]

16 голосов
/ 05 января 2012

Вот как я это сделал:

// 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 позволяет выполнять поиск по каждому кадру, а не только по ключевым.

9 голосов
/ 09 февраля 2009

Простой ответ: у вас должен быть объект AVFormatContext. Его свойство duration сообщает вам, как долго ваш файл выражается в метке времени, умноженной на 1000, которая может использоваться в av_seek_frame, поэтому относитесь к нему как к 100%. Затем вы можете рассчитать, как далеко в видео вы хотите искать.

если вы хотите перейти вперед на один кадр, просто вызовите av_read_frame и avcodec_decode_video, пока он не заполнит got_picture_ptr ненулевым значением. Перед вызовом avcodec_decode_video убедитесь, что пакет из av_read_frame взят из видеопотока. Затем avcodec_decode_video заполнит структуру AVFrame, с которой вы можете делать что угодно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...