Хотел бы поделиться своим маленьким опытом по работе с видеостримингом и обраткой видео/аудио. В предыдущих статьях шла речь о установке wowza для стриминга живых трансляций, но многим клиентам нужна трансляция видео файлов (VOD) в различных битрейтах с различным резолюшеном, чтобы можно было проигрывать видео/аудио на различных устройства в хорошем качестве. Для этого нужно настроить транскодирование видео/аудио файлов в различные форматы. Удобным инструментом в данной ситуации будет ffmpeg с поддержкой целого ряда библиотек, о чем и пойдет речь в данной статье.
Если установить ffmpeg из репозиторий, то у нас не буде поддержки многих форматов, к примеру *.webm, *.vob, *.ogv. По этому буде собирать из исходников. Будем собирать последний, на данный момент, ffmpeg-2.4 пакет на 64-разрядной Ubuntu 12.04. Для начала установим пакеты разработчика
root@ubuntu:~# apt-get install build-essential checkinstall
Теперь нам нужно скачать ряд библиотек, чтобы ffmpeg можно было собрать со всеми возможными либами для транскодирования все поддерживаемых видео и аудио форматов. Для этого нужно скачать:
- yasm-1.3.0.tar.gz
- faad2-2.7.tar.gz
- faac-1.28.tar.gz
- lame-3.99.5.tar.gz
- libvorbis-1.3.4.tar.gz
- libtheora-1.1.1.tar.bz2
- libvpx-master.zip
- last_x264.tar.bz2
- opencore-amr-0.1.3.tar.gz
- xvidcore_1.3.3.orig.tar.gz
На данный момент это самые последние версии тарболов. Мы будем собирать из них *.deb пакеты, которые можно будет потом установить на любой другой системе, не мучаясь со сборкой. Для этого будем использовать checkinstall. Все бинарники пакетов будем ложить в папку deb.
Линки на нужные пакеты можете найти здесь:
Имя пакета |
Сайт |
Прямая ссылка |
yasm-1.3.0.tar.gz | ссылка | ссылка |
faad2-2.7.tar.gz | ссылка | ссылка |
faac-1.28.tar.gz | ссылка | ссылка |
lame-3.99.5.tar.gz | ссылка | ссылка |
libvorbis-1.3.4.tar.gz | ссылка | ссылка |
libtheora-1.1.1.tar.bz2 | ссылка | ссылка |
libvpx-master.zip | ссылка | ссылка |
last_x264.tar.bz2 | ссылка | ссылка |
opencore-amr-0.1.3.tar.gz | ссылка | ссылка |
xvidcore_1.3.3.orig.tar.gz | ссылка | ссылка |
ffmpeg-2.4.tar.bz2 | ссылка | ссылка |
Начнем с первого. Качаем yasm и делаем сборку пакета. Yasm нам нужен для компиляции x264 библиотеки.
root@ubuntu:~# wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz root@ubuntu:~# tar xzvf yasm-1.3.0.tar.gz root@ubuntu:~# cd yasm-1.3.0/ root@ubuntu:~/yasm-1.3.0# ./configure root@ubuntu:~/yasm-1.3.0# make root@ubuntu:~/yasm-1.3.0# checkinstall --pkgname="yasm" --pkgversion=1.3.0 --deldoc="yes" --type="debian" --install="no" --default --pakdir="../deb/"
Теперь у нас в папке deb лежит первый пакет, который нужен для сборки ffmpeg-а в целом.
root@ubuntu:~/yasm-1.3.0# ls ../deb/ yasm_1.3.0-1_amd64.deb
Далее таким же образом устанавливаем faad2 и faac. AAC энкодер FAAC и декодер FAAD2 для аудио файлов.
root@ubuntu:~/yasm-1.3.0# cd .. root@ubuntu:~# wget http://downloads.sourceforge.net/faac/faad2-2.7.tar.gz root@ubuntu:~# tar xzfv faad2-2.7.tar.gz root@ubuntu:~# cd faad2-2.7/ root@ubuntu:~/faad2-2.7# ./configure --with-mp4v2 root@ubuntu:~/faad2-2.7# make root@ubuntu:~/faad2-2.7# checkinstall --pkgname="faad" --pkgversion=2.7 --deldoc="yes" --type="debian" --install="no" --default --pakdir="../deb/"
Теперь качаем и собираем faac.
root@ubuntu:~# wget http://downloads.sourceforge.net/faac/faac-1.28.tar.gz root@ubuntu:~# tar xzvf faac-1.28.tar.gz root@ubuntu:~# cd faac-1.28/ root@ubuntu:~/faac-1.28# ./configure --with-mp4v2 root@ubuntu:~/faac-1.28# make
При сборке данного пакета будет ошибка типа
mpeg4ip.h:126:58: error: new declaration ‘char* strcasestr(const char*, const char*)’ /usr/include/string.h:369:28: error: ambiguates old declaration ‘const char* strcasestr(const char*, const char*)’ make[3]: *** [3gp.o] Error 1 make[3]: Leaving directory `/home/alex/faac-1.28/common/mp4v2' make[2]: *** [all-recursive] Error 1 make[2]: Leaving directory `/home/alex/faac-1.28/common' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/home/alex/faac-1.28' make: *** [all] Error 2
Чтобы исправить эту ошибку, нужно подправить код в файле common/mp4v2/mpeg4ip.h в 126 строке. Вы можете ее убрать вообще или же подправить так:
root@ubuntu:~/faac-1.28# vim common/mp4v2/mpeg4ip.h … #ifdef __cplusplus extern “C” { #endif #ifndef _STRING_H //char *strcasestr(const char *haystack, const char *needle); #endif #ifdef __cplusplus } #endif …
Теперь чистим собранные бинарники и запускаем еще раз сборку.
root@ubuntu:~/faac-1.28# make clean root@ubuntu:~/faac-1.28# ./configure --with-mp4v2 root@ubuntu:~/faac-1.28# make root@ubuntu:~/faac-1.28# checkinstall --pkgname="faac" --pkgversion=1.28 --deldoc="yes" --type="debian" --install="no" --default --pakdir="../deb/"
Далее собираем lame. Это бесплатный кодек (free software), который используется для кодирование/декодирования MP3 аудио файлов.
root@ubuntu:~# wget http://switch.dl.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz root@ubuntu:~# tar xzfv lame-3.99.5.tar.gz root@ubuntu:~# cd lame-3.99.5/ root@ubuntu:~/lame-3.99.5# ./configure root@ubuntu:~/lame-3.99.5# make root@ubuntu:~/lame-3.99.5# checkinstall --pkgname="lame" --pkgversion=3.99.5 --deldoc="yes" --type="debian" --install="no" --default --pakdir="../deb/"
На подходе libvorbis. Этот пакет нужен для vorbis аудио форматов (свободный формат сжатия звука с потерями ). Служит для сжатия звука на средних и высоких битрейтах (16-500 (кбит/c)/канал)
root@ubuntu:~# wget http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.4.tar.gz root@ubuntu:~# tar xzvf libvorbis-1.3.4.tar.gz root@ubuntu:~# cd libvorbis-1.3.4/ root@ubuntu:~/libvorbis-1.3.4# ./configure
Мы получим ошибку:
checking for Ogg... no *** Could not run Ogg test program, checking why... *** The test program failed to compile or link. See the file config.log for the *** exact error that occured. This usually means Ogg was incorrectly installed *** or that you have moved Ogg since it was installed. configure: error: must have Ogg installed!
Чтобы её исправить, нужно установить дополнительный пакет и продолжить сборку пакета.
root@ubuntu:~/libvorbis-1.3.4# apt-get install libogg-dev root@ubuntu:~/libvorbis-1.3.4# ./configure root@ubuntu:~/libvorbis-1.3.4# make root@ubuntu:~/libvorbis-1.3.4# checkinstall --pkgname="libvorbis" --pkgversion=1.3.4 --deldoc="yes" --type="debian" --install="no" --default --pakdir="../deb/"
Беремся за libtheora. Это видеокодек, для поддержки Theora форматов сжатия видео (*.ogv, *.ogg)
root@ubuntu:~# wget http://downloads.xiph.org/releases/theora/libtheora-1.1.1.tar.bz2 root@ubuntu:~# tar xjvf libtheora-1.1.1.tar.bz2 root@ubuntu:~# cd libtheora-1.1.1/ root@ubuntu:~/libtheora-1.1.1# ./configure root@ubuntu:~/libtheora-1.1.1# make root@ubuntu:~/libtheora-1.1.1# checkinstall --pkgname="libtheora" --pkgversion=1.1.1 --deldoc="yes" --type="debian" --install="no" --default --pakdir="../deb/"
Далее ставим libvpx для поддержки Googl-овского формата видео — *.webm, основанном на открытом видеокодеке VP8, аудиокодеке Vorbis.
root@ubuntu:~# wget https://github.com/webmproject/libvpx/archive/master.zip root@ubuntu:~# unzip master.zip root@ubuntu:~# cd libvpx-master/ root@ubuntu:~/libvpx-master# ./configure --enable-pic --enable-vp8 --enable-shared root@ubuntu:~/libvpx-master# make root@ubuntu:~/libvpx-master# checkinstall --pkgname="libvpx" --pkgversion=2.1.0 --deldoc="yes" --type="debian" --install="no" --default --pakdir="../deb/"
Теперь устанавливаем x264. Свободная библиотека программных компонентов для кодирования видеопотоков H.264 (лицензируемый стандарт сжатия видео, предназначенный для достижения высокой степени сжатия видеопотока при сохранении высокого качества).
root@ubuntu:~# wget ftp://ftp.videolan.org/pub/x264/snapshots/last_x264.tar.bz2 root@ubuntu:~# tar xjvf last_x264.tar.bz2 root@ubuntu:~# cd x264-snapshot-20140920-2245/ root@ubuntu:~/x264-snapshot-20140920-2245# ./configure --enable-shared --enable-static root@ubuntu:~/x264-snapshot-20140920-2245# make root@ubuntu:~/x264-snapshot-20140920-2245# ./version.sh #define X264_VERSION "" #define X264_POINTVER "0.142.x" root@ubuntu:~/x264-snapshot-20140920-2245# checkinstall --pkgname="x264" --pkgversion=0.142 --deldoc="yes" --type="debian" --install="no" --default --pakdir="../deb/"
Далее ставим opencore-amr. Аудиокодек для адаптивного кодирования с переменной скоростью. Это стандарт кодирования звуковых файлов, специально предназначенный для сжатия сигнала в речевом диапазоне частот. Формат звуковых файлов *.arm
root@ubuntu:~# wget http://garr.dl.sourceforge.net/project/opencore-amr/opencore-amr/opencore-amr-0.1.3.tar.gz root@ubuntu:~# tar -xzvf opencore-amr-0.1.3.tar.gz root@ubuntu:~# cd opencore-amr-0.1.3/ root@ubuntu:~/opencore-amr-0.1.3# ./configure root@ubuntu:~/opencore-amr-0.1.3# make root@ubuntu:~/opencore-amr-0.1.3# checkinstall --pkgversion=0.1.3 --deldoc="yes" --type="debian" --install="no" --default --pakdir="../deb/"
Далее ставим xvidcore (библиотека сжатия видео стандарта MPEG-4 Part 2).
root@ubuntu:~# wget http://ftp.br.debian.org/debian-multimedia/pool/main/x/xvidcore/xvidcore_1.3.3.orig.tar.gz root@ubuntu:~# tar xzvf xvidcore_1.3.3.orig.tar.gz root@ubuntu:~# cd xvidcore-1.3.3/build/generic/ root@ubuntu:~/xvidcore-1.3.3/build/generic# ./configure root@ubuntu:~/xvidcore-1.3.3/build/generic# make root@ubuntu:~/xvidcore-1.3.3/build/generic# checkinstall --pkgname="xvidcore" --pkgversion=1.3.3 --deldoc="yes" --type="debian" --install="no" --default --pakdir="~/deb/"
Теперь остался последний, главный пакет, ради которого мы это все делали – ffmpeg. Эго нужно собрать с поддержкой всех либ и кодеков, которые мы собирали до этого.
root@ubuntu:~# wget http://ffmpeg.org/releases/ffmpeg-2.4.tar.bz2 root@ubuntu:~# tar xjvf ffmpeg-2.4.tar.bz2 root@ubuntu:~# cd ffmpeg-2.4/ root@ubuntu:~/ffmpeg-2.4# ./configure --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libvpx --enable-libxvid --enable-x11grab
Мы получим ошибку.
root@ubuntu:~/ffmpeg-2.4# ./configure --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libvpx --enable-libxvid --enable-x11grab ERROR: Xext not found
Для фикса нужно установить libxext-dev пакет и снова запустить сборку
root@ubuntu:~/ffmpeg-2.4# apt-get install libxext-dev root@ubuntu:~/ffmpeg-2.4# ./configure --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libvpx --enable-libxvid --enable-x11grab ERROR: Xfixes not found
Как видим мы получили еще одну ошибку. Чтобы ее исправить нужно установить еще один пакет libxfixes и запустить еще раз сборку.
root@ubuntu:~/ffmpeg-2.4# apt-get install libxfixes-dev root@ubuntu:~/ffmpeg-2.4# ./configure --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libvpx --enable-libxvid --enable-x11grab root@ubuntu:~/ffmpeg-2.4# make root@ubuntu:~/ffmpeg-2.4# checkinstall --pkgname="ffmpeg" --pkgversion=2.4 --deldoc="yes" --type="debian" --install="no" --default --pakdir="../deb/"
Теперь устанавливаем все собранные пакеты.
root@ubuntu:~# ls -1 deb/ faac_1.28-1_amd64.deb faad_2.7-1_amd64.deb ffmpeg_2.4-1_amd64.deb lame_3.99.5-1_amd64.deb libtheora_1.1.1-1_amd64.deb libvorbis_1.3.4-1_amd64.deb libvpx_2.1.0-1_amd64.deb opencore-amr_0.1.3-1_amd64.deb x264_0.142.x-1_amd64.deb xvidcore_1.3.3-1_amd64.deb yasm_1.3.0-1_amd64.deb root@ubuntu:~# ls -1 deb/ | grep -v ffmpeg | xargs -i dpkg -i deb/{} Selecting previously unselected package faac. (Reading database ... 58191 files and directories currently installed.) Unpacking faac (from deb/faac_1.28-1_amd64.deb) ... Setting up faac (1.28-1) ... Processing triggers for man-db ... Selecting previously unselected package faad. (Reading database ... 58219 files and directories currently installed.) Unpacking faad (from deb/faad_2.7-1_amd64.deb) ... Setting up faad (2.7-1) ... Processing triggers for man-db ... Selecting previously unselected package lame. (Reading database ... 58244 files and directories currently installed.) Unpacking lame (from deb/lame_3.99.5-1_amd64.deb) ... Setting up lame (3.99.5-1) ... Processing triggers for man-db ... Selecting previously unselected package libtheora. (Reading database ... 58307 files and directories currently installed.) Unpacking libtheora (from .../libtheora_1.1.1-1_amd64.deb) ... Setting up libtheora (1.1.1-1) ... Selecting previously unselected package libvorbis. (Reading database ... 58529 files and directories currently installed.) Unpacking libvorbis (from .../libvorbis_1.3.4-1_amd64.deb) ... Setting up libvorbis (1.3.4-1) ... Selecting previously unselected package libvpx. (Reading database ... 58896 files and directories currently installed.) Unpacking libvpx (from deb/libvpx_2.1.0-1_amd64.deb) ... Setting up libvpx (2.1.0-1) ... Selecting previously unselected package opencore-amr. (Reading database ... 58921 files and directories currently installed.) Unpacking opencore-amr (from .../opencore-amr_0.1.3-1_amd64.deb) ... Setting up opencore-amr (0.1.3-1) ... Selecting previously unselected package x264. (Reading database ... 58947 files and directories currently installed.) Unpacking x264 (from deb/x264_0.142.x-1_amd64.deb) ... Setting up x264 (0.142.x-1) ... Selecting previously unselected package xvidcore. (Reading database ... 58963 files and directories currently installed.) Unpacking xvidcore (from deb/xvidcore_1.3.3-1_amd64.deb) ... Setting up xvidcore (1.3.3-1) ... Selecting previously unselected package yasm. (Reading database ... 58968 files and directories currently installed.) Unpacking yasm (from deb/yasm_1.3.0-1_amd64.deb) ... Setting up yasm (1.3.0-1) ... Processing triggers for man-db ...
Теперь ставим ffmpeg.
root@ubuntu:~# dpkg -i deb/ffmpeg_2.4-1_amd64.deb Selecting previously unselected package ffmpeg. (Reading database ... 59016 files and directories currently installed.) Unpacking ffmpeg (from deb/ffmpeg_2.4-1_amd64.deb) ... Setting up ffmpeg (2.4-1) ... Processing triggers for man-db ...
Все готово. В следующий раз будем тестировать собранный ffmpeg и поговорим об опциях транскодинга.
После команды
~/ffmpeg-2.4 $ ./configure —enable-gpl —enable-version3 —enable-nonfree —enable-postproc —enable-libfaac —enable-libmp3lame —enable-libopencore-amrnb —enable-libopencore-amrwb —enable-libvorbis —enable-libx264 —enable-libvpx —enable-libxvid —enable-x11grab
Пишет это:
License: nonfree and unredistributable
Creating config.mak, config.h, and doc/config.texi…
config.h is unchanged
config.asm is unchanged
libavutil/avconfig.h is unchanged
и deb-файл с ffmpeg не создается. К чему бы это?
Ну все гуд — создался файл конфигураций. Теперь нужно запустить make для компиляции модулей и checkinstall для создания deb-пакета, как написано в инструкции.
Спасибо за ответ. Сделал, но в конце снова повылазили ошибки. Кинул эт дело, и скачал из репозиториев готовую сборку.