Сайты по умеренным ценам, разработка, сопровождение

Статьи / Декодирование видео FFmpeg

Декодирование видео FFmpeg


Отправить ссылку:

Декодирование видео с помощью FFmpeg
Если вы хотите узнать о том как записывать файл с помощью ffmpeg, то этому посвящена эта статья.

Введение

При написании мультимедийных программ часто возникает необходимость декодирования (чтения) видеофайлов. Предположим, вам необходимо написать мультимедиа плеер или проиграть видеоролик в игре. Решение задачи должно быть максимально кроссплатформенное. Для решения данной задачи идеально подходит FFmpeg.

О библиотеке FFmpeg

FFmpeg - кроссплатформенная библиотека, созданная для декодирования и кодирования мультимедийных файлов. Библиотека имеет открытый исходный код и распространяется под лицензией GPL и LGPL. Следовательно, библиотеку можно использовать в коммерческих проектах.

FFmpeg используется в таких проектах как: ffmpeg2theora, VLC, MPlayer, Handbrake, Blender, Google Chrome и многих других.

Подготовка FFmpeg

Для использования FFmpeg необходимо проделать подготовительные действия. Есть несколько путей подготовки FFmpeg:

Первый из них - это скачивание исходных файлов ffmpeg-а и компиляцию их в с помощью gcc. Компиляция может быть утомительной, но с другой стороны вы можете точно знать с какими параметрами скомпилированы библиотеки.

Второй путь, который выбрал автор этой статьи, это скачивание сторонних билдов, их можно найти на сайте: http://ffmpeg.arrozcru.org/. FFmpeg включает в себя следующие библиотеки: avcodec, avdevice, avformat, avutil, swscale.

Для использования библиотек в Visual Studio возможно динамически загрузить функции или использовать lib файлы. Как по dll файлам получить lib файлы можно узнать, если прочитаете статью по использованию LibVLC. Также необходимо скачать исходный файл для получения h-файлов с прототипами функций.

Заголовочные файлы необходимо модифицировать, добавив в файлы код:

Чтобы мы смогли их использовать в проекте на C++.

Теперь для использования FFmpeg у нас есть все, перейдём к декодированию. Забегая вперёд скажу, что в конце статьи вы сможете найти пример, где все эти действия уже проделаны.

Кратко о видеофайлах

Видеофайлы могут иметь различные форматы, например avi, wmv, ogg. Формат - это контейнер, который определяет внутреннюю структуру файла. В общем виде видеофайл можно представить в следующем виде:

Заголовок видео файлаПакетПакетПакетПакетПакетПакетИндексы

Заголовок файла содержит информацию о разрешении картинки, о кодеках, которые используются для сжатия, о количестве потоков и многое другое.

Пакеты - это закодированные данные. Пакеты могут содержать сжатое изображение или его часть (т.е. ту часть, которая отличается от предыдущего кадра), а могут сжатый звук. Пакеты не имеют определенного порядка и могут чередоваться.

Индексы содержат информацию о ключевых кадрах. Для улучшения сжатия в видеофайлах пакеты могут содержать не весь кадр, а только изменившуюся часть. Ключевыми же кадрами являются те кадры, которые полностью содержатся в пакете.

Стоит заметить, что видеофайл может содержать несколько аудиодорожек, например, для разных языков. Хотя видеодорожек тоже может быть несколько, но это редкий случай.

Декодирование видеофайлов с помощью FFmpeg

Декодирование видеофайла будет описано по шагам. В общем видео процесс можно описать так: инициализация FFmpeg, открытие файла, получение информации о файле, считывание и декодирование пакетов, закрытие файла. Рассмотрим каждый шаг более подробно:

Шаг 0: Инициализация FFmpeg

Шаг 1: Открытие файла

Открываем файл и получаем его контекст. По имени файла мы открываем его и проверяем, что файл открылся успешно:

Шаг 2: Поиск потоков и открытие декодеров

Поиск потоков видео и звука, а также поиск декодеров для них. Если файл закодирован неизвестным декодером, то произойдет ошибка открытия декодера.

Поиск видеопотока и открытие декодера:

Поиск аудиопотока и открытие декодера отличается от поиска потока видео только константой CODEC_TYPE_AUDIO.

Шаг 3: Получение информации о потоках

Мы получаем информацию о потоках, такую как разрешение, длина, количество кадров в секунду.

Получение информации о видеопотоке:

Получение информации о аудиопотоке очень похоже. Только высоты и ширины у него нет.




При полном или частичном копировании необходимо указывать ссылку на данную статью.

Олег (Дата )

Все вопросы и предложения высылайте на адрес soft_support@list.ru. Необходимо в заголовке указать название статьи.

Оставь свой отзыв


Ответьте на вопрос (ответ маленькими буквами)* :
Название нашей планеты

Олег
e-mail: soft_support@list.ru
Дата: 18.07.10
Я проверил и у меня получилось создать lib файл. Возможно у вы не правильно отредактировали def файл. Прилагаю свой def файл, что бы вы могли сравнить.
Обратите внимание, что файл начинается с EXPORTS и также мне пришлось удалить функции типа:
x264_sub8x8_dct8_mmx.skip_prologue (forwarded to x264_sub8x8_dct8_mmx.skip_prologue)
x264_sub8x8_dct8_sse2.skip_prologue (forwarded to x264_sub8x8_dct8_sse2.skip_prologue)
....
Так как они, видимо, нарушают синтаксис.
К статье также прилагается пример, в котором уже есть lib файлы.

С уважением Олег.
========
Def файл можно сказать http://unick-soft.ru/art/files/avcodec-52.dll.def

Алексей
e-mail: achuglazov@yandex.ru
Дата: 18.06.10
тут:
\"Для использования библиотек в Visual Studio возможно динамически загрузить функции или использовать lib файлы. Как по dll файлам получить lib файлы можно узнать, если прочитаете статью по использованию LibVLC. Также необходимо скачать исходный файл для получения h-файлов с прототипами функций. \"

Для acodec-52.dll не работает. выдаёт ошибки типа :\" warning LNK4017: оператор (название функции) не поддерживается на конечной платформе; пропущен\"
Вот, и в итоге никакого либа не получается.
Скажите как у вас это получилось.