2010-06-13 2 views
12

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

av_seek_frame(pFormatCtx, videoStream, 110285594, AVSEEK_FLAG_BYTE); 

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

+0

Проблема в том, что вы пытаетесь найти фрейм, который не является ключевым фреймом? – dmazzoni

+0

Привет, Dmazzoni, я не убедился, что позиция была ключевой. Я могу добавить к этому, что это видео h264. –

ответ

9

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

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

, например:

int64_t byteposition = pFormatCtx->pb->pos; 

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

, например:

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

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

С наилучшими пожеланиями, Ник Верлинден

3

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

/** 
* fseek() equivalent for AVIOContext. 
* @return new position or AVERROR. 
*/ 
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence); 
Смежные вопросы