2015-09-11 2 views
1

Я пытаюсь получить продолжительность и количество кадров из файла WebM с помощью FFMPEG и libavformat. Я адаптирую некоторый код, который изначально был написан для работы с MP4, а при передаче MP4 он работает нормально.Поиск продолжительности/количества кадров WebM с использованием FFMPEG/libavformat

У меня есть FFMPEG 2.1, скомпилированный с помощью синтаксического анализатора и декодера vp8 и демультиплексора matroska.

У меня есть указательна видеопоток, *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; это было бы достаточно хорошим, так как я мог бы оценить количество кадров с этим и продолжительностью.

Спасибо!

ответ

5

Почему nb_frames 0?

Файлы Mp4 могут иметь полные индексы всех кадров в потоке, что позволяет точно знать количество кадров. AVI тоже это делает. WebM позволяет показывать только индексы, представляющие интерес, например. ключевыми кадрами, что означает, что индекс меньше (т. е. файл меньшего размера), но это также означает, что вы не знаете количество кадров, если вы не разобрали весь файл.

Как получить продолжительность?

AVStream. duration - в потоке продолжительность. Для многих типов файлов, включая WebM, в заголовке указывается только длительность всего файла , а не продолжительность для потока. Таким образом, используйте AVFormatContext. duration, который находится в AV_TIME_BASE единицах (микросекундах). Чтобы получить приблизительный FPS, используйте AVStream. avg_frame_rate, а затем nb_frames можно приблизить.

+0

Спасибо! Отличное объяснение. Использование частоты кадров для оценки количества кадров достаточно для моих целей, и ваше предложение о продолжительности работы. Мне просто нужно выяснить, как оценивать немного более точно, поскольку я иногда вижу пару черных кадров в конце или последнюю пару кадров отключается. – gcgrant