ffmpeg

Поскольку документации по ffmpeg почти никакой (то есть вообще никакой), а тем более на русском языке, то я решил немного написать о том, что сам выяснил, работая с библиотекой. Речь идёт об использовании API ffmpeg, а не о параметрах командной строки, этой-то информации навалом.

Общая информация

ffmpeg vs. libav

Раньше была одна библиотека — ffmpeg, теперь их стало две, причём libav это форк ffmpeg, сделанный главным разработчиком последней. Что-то там не поделили ребята из руководства проектом, и биг босс ушёл, хлопнув дверью. А теперь троллит оставшихся ребят копирайтами на логотип. Я думаю по этому случаю, что он тот ещё козлина, но в любом случае, сейчас библиотеки мало чем отличаются, разве что названием и логотипом. Ну и на сайте libav в горизонтальном меню нет вертикальных полосок между ссылками :) Ну вот буквально на днях в libav переименовали все инструменты из пакета, заменив ff на av, а ffmpeg объявили deprecated и заменили на avconv, дескать новая, более мощная утилита. Исходники avconv.c и ffmpeg.c мало отличаются, даже FIXME те же остались. В общем чисто политические выебоны.

Назначение

Собственно, ffmpeg это в первую очередь консольная утилита (точнее, целый набор: ffmpeg, ffplay, ffprobe, ffserver) для работы с видео и аудио. По сути, единственной задачей ffmpeg является перегонка между форматами, перекодирование и т.д. ffplay это простенький плеер на libsdl, ffprobe показывает разную информацию о медиафайлах, а ffserver может транслировать медиапотоки по сети (в том числе поток, захваченный с вебкамеры). Сила ffmpeg в лютом количестве кодеков (не все работают в обе стороны, к примеру проприетарный On2 VP6 только декодируется, не все кодеки легально использовать без покупки лицензии), форматов (тут вроде патентных троллей нет), опций и т.д. Поддерживается даже RTMP и прочие UDP. Т.е. если нужно полноценное стабильное решение для некоего ПО, желающего работать с видео-аудио, то это единственный бесплатный вариант. Тем более, что ffmpeg — штука модульная, и сами утилиты никак не связаны с ядром библиотеки.

Ядро

Состоит из нескольких связанных библиотек: libavcodec (все кодеки), libavformat (все доступные форматы ввода-вывода: контейнеры, сетевые потоки, устройства видео- и аудиозахвата), libavutil (всякие разные финтифлюшки для сишной натуры ffmpeg), libswscale (преобразовывает разные форматы видеокадров друг в друга с масштабированием), libavfilter (всякие фильтры, как следует из названия), libpostproc (постобработка). Реально нужны обычно только первые четыре. Все эти библиотеки распространяются под LGPL, то есть линкуем динамически и горя не знаем (обязательно стоит прочесть страничку, посвящённую лицензированию на сайте ffmpeg). Либо если хотите открыть свои исходники, то можно линковать и статически, под GPL.

Задница

Неужели всё так прекрасно? Отнюдь нет. Есть две большие проблемы.

Проблема 1. Уёбищная… нет, просто люто уебанская документация. По сути, вся документация сводится к курению исходников. Всё, никакой другой информации нет. Это конечно позволяет понять каким образом вызывать функции, но разобраться в том, как это правильно делать и в каком порядке — нет. За 10 лет существования проекта никто не озаботился даже минимальной документацией. На сайте ffmpeg есть hall of shame, там проекты, нарушающие лицензию. Но сам ffmpeg следует по праву поместить в hall of shame всех open-source проектов, страдающих от плохой документации, и отдать ему почётное первое место.

Проблема 2. Подключение проприетарных сторонних кодеков. К этому вопросу я позднее вернусь, и расскажу, как можно подключить некоторые сторонние кодеки, основанные на VFW. Этот способ точно работает на Windows и вроде бы должен работать на Linux через библиотеки Wine (по крайней мере mencoder/mplayer это делают). Mplayer, кстати, крупнейший проект, использующий и дорабатывающий ffmpeg.

Мини-проблема
. Библиотека на чистом C, причём стандарта C99, который нихера не поддерживается MSVC-компиляторами. Поэтому собрать под Windows можно только MinGW/Cygwin/Clang. Лучше всего не париться и слить свежий билд от Zeranoe если вам нужны только бинарники dll для подключения к проекту. Правда тут тоже есть нюанс с h-файлами, но о нём позднее. Если вы намерены менять исходники (нахрена? там чёрт ногу сломит, несмотря на уверения разработчиков в высокомодульности и чистоте кода, это ведь C), то рекомендую либо MinGW, либо Clang (если знаете, как обращаться с последним).