проблема: FFMPEG, ищущий с av_seek_frame с помощью положений байта

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

av_seek_frame( pFormatCtx, videoStream, 110285594, AVSEEK_FLAG_BYTE);

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

14
задан Bill the Lizard 22 April 2011 в 12:58
поделиться

1 ответ

Для интересующихся нашел решение. После нескольких часов поиска в 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, в промывке нет необходимости.

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

10
ответ дан 1 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: