проблема: поиск FFMPEG с av_seek_frame с использованием позиций байтов - PullRequest
13 голосов
/ 13 июня 2010

Я пытаюсь заставить функцию av_seek_frame () перейти в указанную мной байтовую позицию.Я реализую механизм поиска с точностью до кадра для своего приложения, и, как я его вижу, я отсканирую весь видеофайл и сохраню байтовые позиции для каждого ключевого кадра в структуре.Я узнал, где взять текущую позицию байта: AVPacket.pos.Теперь я проверяю эту позицию с помощью av_seek_frame следующим образом:

av_seek_frame( pFormatCtx, videoStream, 110285594, AVSEEK_FLAG_BYTE);

Однако, похоже, это не правильно, когда я вызываю av_read_frame, оно просто начинается с кадра 23. Если яне искать, он начинается в кадре 1.

Ответы [ 2 ]

10 голосов
/ 17 июня 2010

Для тех, кому интересно, я нашел решение. После нескольких часов поиска в Google и некоторой упрощенной формы обратного инжиниринга я нашел, как получить и установить байтовое местоположение открытого видео.

Чтобы получить позицию файла: AVFormatContext.pb.pos

например:

int64_t byteposition = pFormatCtx->pb->pos;

Чтобы установить положение файла: url_seek (AVFormatContext.pb, Position, SEEK_SET);

например:

url_seek(pFormatCtx->pb, 27909056, SEEK_SET);

Не забудьте очистить буферы, если вы меняете местоположение во время игры. Если вы делаете это до первого выполнения av_read_frame, очистка не требуется.

С уважением, Ник Верлинден

3 голосов
/ 16 июля 2012

В последних версиях libav, url_seek стала внутренней функцией. Теперь нужно использовать следующую функцию:

/**
* fseek() equivalent for AVIOContext.
* @return new position or AVERROR.
*/
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence);
...