Libav — библиотека для работы с видео и аудио


Libav — набор бесплатных библиотек и программ для работы с видео и аудио.  Позволяет просматривать видео и слушать музыку. Понимает все доступные форматы. Конвертирует из одного в другой. Работает в Linux и Windows.


История

Проект Libav был создан в 2011 году, когда часть разработчиков пакета FFmpeg ушла из проекта и начала свое дело. Уход был связан с разногласиями между разработчиками и руководством. Проект Libav начался не с нуля, а с текущей версии FFmpeg (девелоперы ушли не с пустыми руками 🙂 ). Работали над тем же самым, только делали, как им захочется. Все утилиты по работе с медиа переименовали на свой лад:

  • ffmpeg -> avconv
  • ffplay -> avplay
  • ffprobe -> avprobe

Названия библиотек остались прежними:

  • libavcodec.a
  • libavdevice.a
  • libavfilter.a
  • libavformat.a
  • libavutil.a
  • libswresample.a
  • libswscale.a

Правда logo у FFmpeg другое (добавили трехмерности) 🙂

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

  • Хочется отточенного и выверенного кода — бери Libav.
  • Хочется новых фишек и фильтров — бери FFmpeg.

Теперь FFmpeg и Libav существуют параллельно и работают, так как им захочется. Все довольны. Но есть один нюанс. FFmpeg берет к себе все разработки из Libav. А почему бы и нет? Это мир бесплатного софта с открытым исходным кодом. Если лицензия позволяет, чего же не взять.

Установка

Рассмотрим два классических способа установки софта в Linux: установка с помощью менеджера пакетов и установка из исходников.

Менеджер пакетов

sudo apt-get install libav-tools

Установка из исходников

Установка из исходников может потребоваться в ряде случаев, например:

  • у вас уже настроенная система и вы не хотите нарушать ее целостность;
  • для вашего дистрибутива Linux (устаревшая версия, но по каким-то причинам вы не хотите ее обновлять) нет самой свежей версии Libav;
  • нет прав root пользователя;
  • вы хотите собрать Libav, только с одним или несколькими кодеками (ну не нужны вам все), чтобы минимизировать размер исполняемых файлов (например, нужно для различных Raspberry PI или систем видеонаблюдения).

Для того, чтобы собрать Libav из исходников нужно выполнить стандартную цепочку действий:

Скачиваем сами исходники. Тут есть два пути.
1. Качаем архив исходников:
Идем на страницу https://libav.org/download/ и выбираем архив с нужной версией, например:
https://libav.org/releases/libav-12.2.tar.gz
2. Используем git:

git clone git://git.libav.org/libav.git

Если вы хотите работать со стабильной веткой Libav, то в принципе, без разницы какой из вышеописанных способов получения исходников использовать. Я предпочитаю, качать исходники через git.

Ну а дальше классическое для Linux:

./configure
make
make install

После того, как процесс сборки и установки завершится получаем следующую структуру папок (я намеренно раскрыл bin/ и lib/, как самые важные):

bin — утилиты для просмотра, конвертации и получении информации о медиафайле;

include — *.h файлы для разработки

lib — библиотеки

share — настройки и presets

Весь Libav был проинсталлирован в папку libav-from-git/ в домашней директории, можно пользоваться.

При сборке Libav из исходников нужно учитывать еще один очень важный вопрос. Нужно выбрать, как мы будем собирать — со статической (static libraries) или динамической (shared libraries) компоновкой библиотек.

Static libraries

Данный тип сборки Libav необходим тогда, когда необходимо убрать все зависимости (ну почти все зависимости) от внешних библиотек и получить «все в одном флаконе». То есть, сделав static build, вы получите на выходе avconv, avplay и avprobe, которые не зависят ни от чего. Вы можете отправить avplay другу и он с помощью лишь одного этого файла сможет смотреть кино и слушать музыку. Никаких драйверов ему устанавливать не придется.

Выполняем все ту же цепочку по сборке (configure, make, make install), только на этапе конфигурации укажем несколько ключей:

./configure --prefix=/home/user/libav-from-git --enable-static --enable-nonfree --disable-yasm

—prefix — куда ставить;

—enable-static — собирать статически;

—disaable-yasm — у меня старый комп (не все пакеты присутствуют в системе), поэтому я указал этот ключ.

После работы всех команд в папке /home/user/libav-from-git-shared будет проинсталлирован статический билд Libav. Посмотрим повнимательней, что значит «статический».

Исполняемые файлы avconv, avplay и avprobe «весят» почти что 60 Mb каждый. Это означает, что все кодеки по работе с различными медиаформатами и фильтры были «вкомпилированы» непосредственно файл, чтобы он потом не зависел ни от чего и был самодостаточным.

Для того, чтобы удостовериться, что статическая сборка является «самодостотачной» можно взглянуть не только на размер исполняемого файла, но и посмотреть от чего он зависит. Для этого воспользуемся командой ldd. Запускаем

ldd ./avconv

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

> ldd ./avconv
linux-vdso.so.1 (0x00007ffdaf5d7000)
libm.so.6 => /lib64/libm.so.6 (0x00007fac1b598000)
libasound.so.2 => /usr/lib64/libasound.so.2 (0x00007fac1b2b6000)
libbz2.so.1 => /usr/lib64/libbz2.so.1 (0x00007fac1b0a7000)
libz.so.1 => /lib64/libz.so.1 (0x00007fac1ae91000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fac1ac73000)
libc.so.6 => /lib64/libc.so.6 (0x00007fac1a8c5000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fac1a6c1000)
librt.so.1 => /lib64/librt.so.1 (0x00007fac1a4b9000)
/lib64/ld-linux-x86-64.so.2 (0x00007fac1b89b000)

Shared libraries

Этот метод сборки Libav полностью противоположен статическому. Здесь все кодеки и фильтры вытащены наружу и сложены в отдельные файлы (*.so). Из-за этого размер исполняемого модуля уменьшился ( меньше 1 Mb).

Для сборки shared воспользуемся следующими командами:

./configure --prefix=/home/user/libav-from-git-shared --enable-shared --enable-nonfree --disable-yasm
make
make install

И сразу же проверяем зависимости:

> ldd ./avconv
linux-vdso.so.1 (0x00007ffd573d1000)
libavdevice.so.57 => /home/user/libav-from-git-shared/lib/libavdevice.so.57 (0x00007f38dd1f6000)
libavfilter.so.7 => /home/user/libav-from-git-shared/lib/libavfilter.so.7 (0x00007f38dcfb7000)
libavformat.so.58 => /home/user/libav-from-git-shared/lib/libavformat.so.58 (0x00007f38dcc4e000)
libavcodec.so.58 => /home/user/libav-from-git-shared/lib/libavcodec.so.58 (0x00007f38dbc17000)
libavresample.so.4 => /home/user/libav-from-git-shared/lib/libavresample.so.4 (0x00007f38dba05000)
libswscale.so.5 => /home/user/libav-from-git-shared/lib/libswscale.so.5 (0x00007f38db7c2000)
libavutil.so.56 => /home/user/libav-from-git-shared/lib/libavutil.so.56 (0x00007f38db58d000)
libm.so.6 => /lib64/libm.so.6 (0x00007f38db28a000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f38db06c000)
libc.so.6 => /lib64/libc.so.6 (0x00007f38dacbe000)
libasound.so.2 => /usr/lib64/libasound.so.2 (0x00007f38da9dc000)
libbz2.so.1 => /usr/lib64/libbz2.so.1 (0x00007f38da7cd000)
libz.so.1 => /lib64/libz.so.1 (0x00007f38da5b7000)
/lib64/ld-linux-x86-64.so.2 (0x00007f38dd3ff000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f38da3b3000)
librt.so.1 => /lib64/librt.so.1 (0x00007f38da1ab000)

Сравнивая с зависиомстями из static build мы видим, что появились несколько динамических библиотек:

libavdevice.so.57
libavfilter.so.7
libavformat.so.58
libavcodec.so.58
libavresample.so.4
libswscale.so.5
libavutil.so.56

Без них avconv, avplay и avprobe уже не запустятся. То есть, если вы заходите передать кому-то avplay, чтобы посмотреть киношку, не забудьте «завернуть» в архив еще все *.so файлы из папки lib.

Установка в Windows

Для установки Libav под Windows можно воспользоваться готовыми сборками:

http://builds.libav.org/windows/release-gpl/ — стабильные сборки

http://builds.libav.org/windows/nightly-lgpl/ — ночные сборки (все само свежее здесь)

Проверка сборки

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

Для этого выполните:

avconv -codecs

На выходе выдается подробнейшая информация по кодекам:

> ./avconv -codecs
avconv version v13_dev0-1445-g6829a07, Copyright (c) 2000-2018 the Libav developers
built on Jan 27 2018 13:28:47 with gcc 4.8 (SUSE Linux)
Codecs:
D..... = Decoding supported
.E.... = Encoding supported
..V... = Video codec
..A... = Audio codec
..S... = Subtitle codec
...I.. = Intra frame-only codec
....L. = Lossy compression
.....S = Lossless compression
-------
DEV.L. mpeg1video           MPEG-1 video
DEV.L. mpeg2video           MPEG-2 video
DEV.L. h261                 H.261
DEV.L. h263                 H.263 / H.263-1996, H.263+ / H.263-1998 / H.263 version 2
DEV.L. rv10                 RealVideo 1.0
DEV.L. rv20                 RealVideo 2.0
DEVIL. mjpeg                Motion JPEG
D.VIL. mjpegb               Apple MJPEG-B
DEV.L. mpeg4                MPEG-4 part 2
D..... = умеет раскодировать
.E.... = умеет кодировать
..V... = работает с видео
..A... = работает со звуком
..S... = понимает субтитры
...I.. = Intra frame-only codec
....L. = сжимает с потерей качества
.....S = сжимает без потери качества

Например, рассмотрим широко известный кодек HuffYUV, который позволяет сжимать видеопоток без потери качества.

./avconv -codecs | egrep huffyuv

получим следующую информацию:

DEVI.S huffyuv              HuffYUV

что означает:

D — avconv (avplayer) прочитает (поймет) файл в таком формате;

E — avconv (avplayer) сумеет записать видеопоток в таком формате;

V — avconv (avplayer) определил его, как видеопоток;

S — запись (avplayer) будет сделана без потерь.

Примеры работы

Конвертируем mp4 в mkv

avconv -i input.mp4 output.mkv

Перевод audio из mp3 в wav

avconv -i input.mp3 output.wav

Объединить audio и video

avconv -i input_audio.wav -i input_video.mp4 output.mkv

Как видно, синтаксис команд avconv в 99% случаев не отличается от синтаксиса ffmpeg. Если вы нашли в сети какую-то команду для работы с FFmpeg, то она подойдет и для Libav.

Выводы

Libav был создан в 2011 командой энтузиастов, покинувших проект FFmpeg. Проект был создан не с нуля, а с текущей на тот момент времени образ FFmpeg. Libav умеет работать с любым типом видео и аудио. То есть он умеет показывать видео, слушать аудио и конвертировать медиафайлы из одного формата в другой. Но самое главное предназначение Libav — это его библиотеки, все остальное это уже следствие. Эти библиотеки содержат функции для работы с медиаконтентом, кодирование/раскодирование, фильтры, манипуляции с видео/аудио потоками и многое другое. С использованием этих библиотек вы сможете построить свой медиаплеер, написать программу обработки видео/аудиопотоков (например в видеонаблюдении), создать навороченный конвертер. А затем продать это приложение:-)