Я пытаюсь получить продолжительность и количество кадров из файла WebM, используя FFMPEG и libavformat. Я адаптирую некоторый код, который был изначально написан для работы с MP4, и при передаче MP4, кажется, работает нормально.
У меня есть FFMPEG 2.1, скомпилированный с парсером и декодером vp8 и демодулятором Matroska.
у меня есть AVStream
указатель на видеопоток, *video_st
, Код ищет количество кадров в video_st->nb_frames
и на время в video_st->duration
, Они оба кажутся равными 0.
Документы API для для video_st->duration
(https://ffmpeg.org/doxygen/trunk/structAVStream.html#a4e04af7a5a4d8298649850df798dd0b) говорят, что «если исходный файл не указывает длительность, но указывает битрейт, это значение будет оцениваться по битрейту и размеру файла». Я могу подтвердить, что этот файл указывает длительность и битрейт (как я тестировал его на своем рабочем столе с ffmpeg -i
). Так что кажется странным, что это возвращает 0. Возможно, моя конфигурация сборки FFMPEG неверна?
Что касается nb_frames
, документы говорят «количество кадров в этом потоке, если известно или 0». Могу ли я что-нибудь сделать, если это вернет 0? Снова, ffmpeg -i
возвращает оценку для fps; это было бы достаточно хорошо, так как я мог бы оценить количество кадров с этим и продолжительность.
Спасибо!
Почему nb_frames 0?
Файлы Mp4 могут иметь полные индексы всех кадров в потоке, что позволяет точно знать количество кадров. AVI делает это тоже. WebM допускает индексы только интересующих кадров, например, ключевые кадры, что означает, что индекс меньше (то есть меньший файл), но это также означает, что вы не знаете количество кадров, пока не проанализируете весь файл.
Как узнать продолжительность?
AVStream.продолжительность это за потоком продолжительность. Для многих типов файлов, включая WebM, только продолжительность весь файл указывается в заголовке, а не на продолжительность для каждого потока. Таким образом, использование AVFormatContext.продолжительность, который в AV_TIME_BASE единицы (микросекунды). Чтобы получить приблизительный FPS, используйте AVStream.avg_frame_rate, и тогда nb_frames может быть аппроксимирован оттуда.