Мне нужно быстро найти H.264
закодированный видеопоток в MP4
контейнере. Я использую libav для декодирования кадров, поэтому я наткнулся на метод avformat_seek_file()
.
Моя проблема в том, что если предположить, что поток H.264
начинается с ключевого кадра, когда я ищу метку времени 0 (независимо от time_base), я должен быть в начале потока. Но не я. Я обычно получаю несколько секунд в видео. Кроме того, если я стремлюсь, например, к 10 секундам, я обычно получаю около 12 или около того. Возможно ли, чтобы ключевые кадры были такими «редкими»? Кажется, что AVSEEK_FLAG_ANY
не влияет на результат поиска. Проверено на нескольких FullHD H.264 MP4
видео.
Код:
unsigned long seekTo = 0;
//Doesen´t actually matter for 0 since it will be also 0
seekTo = av_rescale_q(seekTo, AVRational{1, AV_TIME_BASE}, pFormatCtx->streams[videoStream]->time_base);
int result = avformat_seek_file(pFormatCtx, videoStream, INT_FAST64_MIN, seekTo, seekTo, AVSEEK_FLAG_ANY);
avcodec_flush_buffers(pCodecCtx);