Я пытаюсь заставить av_seek_frame () функция переходить к положению байта, которое я указываю. Я реализую кадр точный механизм поиска для моего приложения и способ, которым я вижу его, я просканирую весь видеофайл и сохраню положения байта для каждого ключевого кадра в структуре. Я узнал, где получить текущее положение байта: AVPacket.pos. Я теперь тестирую это положение с av_seek_frame
как это:
av_seek_frame( pFormatCtx, videoStream, 110285594, AVSEEK_FLAG_BYTE);
Однако это, кажется, не делает правильную вещь, когда я звоню av_read_frame
, это только запускается с кадра 23. Если я не ищу, это запускается в кадре 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, в промывке нет необходимости.
С уважением, Ник Верлинден