Видео и аудио транскодинг. Мульти-версионность ffmpeg

ffmpegВ предыдущей статье шла речь о сборке ffmpeg-а с поддержкой различных видео и аудио форматов. Так как транскодингом наша компания занимается уже долгое время, а прогресс не стоит на месте – возникает потребность в обновлении программного обеспечения. Эти обновления не всегда проходят гладко при переходе с одной версии продукта на более новую. Когда я пришел работать на данный проект, у нас использовался ffmpeg-0.10-1. Все устраивало до тех пор, пока не пришел таск на конкатенацию видео файлов (concat). Данный demuxer появился в ffmpeg версии 1.1. После недолгих размышлений было принято решение собирать последний ffmpeg с поддержкой мульти-версионности, т.е. на одном сервере должны работать несколько версий ffmpeg-a. Это было связано с тем, что последний ffmpeg (на данный момент — это версия 3.1.1) поменял названия и синтаксис многих опций и переписывать все возможные варианты команд было накладно. Вот решил поделиться опытом по решению такой задачи.

Сборка ffmpeg-3.1.1

В предыдущей статье мы компилили ffmpeg-2.4.1 и с тех пор мало какие библиотеки обновились, почти все остались на прежних версиях. Будем считать, что вы скачали все нужные либы. Приступаем к сборке. Сборка ffmpeg-3.1.1 будет проводиться под дистрибутивом Ubuntu 16.04.
Устанавливаем нужные для сборки пакеты.

root@16:~# apt-get install build-essential checkinstall libogg-dev unzip yasm libx11-dev libxext-dev libxfixes-dev --no-install-recommends

Будим считать, что все распакованные библиотеки лежат в папке sources, а собранные deb-пакеты будут лежать в папке sources/deb.

root@16:~# ls -1 sources/
deb
faac-1.28
faad2-2.7
ffmpeg-3.1.1
lame-3.99.5
libtheora-1.1.1
libvorbis-1.3.5
libvpx-master
opencore-amr-0.1.3
x264-snapshot-20160517-2245
xvidcore-1.3.3
yasm-1.3.0

У меня компиляция каждой библиотеки, кроме faac, прошла успешно. Фикс faac заключается в удалении строки “strcasestr(const char*, const char*)”:

root@16:~# sed -i -e '126d;' sources/faac-1.28/common/mp4v2/mpeg4ip.h

Мульти-версионности я добился путем добавления префикса ко всем собранным пакетам. Список команд выглядит следующим образом.

BUILD_DIR="/home/alex/sources"
PACKAGE_INSTALL_PREFIX="/opt/ffmpeg-3.1.1"
PACKAGE_MAINTAINER="oleksandr@sysadm.pp.ua"
PACKAGE_DOC_DIR="${PACKAGE_INSTALL_PREFIX}_doc"
PACKAGE_COMPILED_DIR="${BUILD_DIR}/deb/"
FFMPEG_VERSION="ff311"

mkdir -vp /opt/ffmpeg-3.1.1{,_doc}

cd ${BUILD_DIR}/yasm-1.3.0/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX}
make
checkinstall --pkgname="yasm-${FFMPEG_VERSION}" --pkgversion=1.3.0 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

cd ${BUILD_DIR}/faad2-2.7/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX} --with-mp4v2
make
checkinstall --pkgname="faad-${FFMPEG_VERSION}" --pkgversion=2.7 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

cd ${BUILD_DIR}/faac-1.28/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX} --with-mp4v2
make
checkinstall --pkgname="faac-${FFMPEG_VERSION}" --pkgversion=1.28 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

cd ${BUILD_DIR}/lame-3.99.5/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX}
make
checkinstall --pkgname="lame-${FFMPEG_VERSION}" --pkgversion=3.99.5 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

cd ${BUILD_DIR}/libvorbis-1.3.5/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX}
make
checkinstall --pkgname="libvorbis-${FFMPEG_VERSION}" --pkgversion=1.3.5 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

cd ${BUILD_DIR}/libtheora-1.1.1/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX}
make
checkinstall --pkgname="libtheora-${FFMPEG_VERSION}" --pkgversion=1.1.1 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

cd ${BUILD_DIR}/libvpx-master/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX} --enable-pic --enable-vp8 --enable-shared
make
checkinstall --pkgname="libvpx-${FFMPEG_VERSION}" --pkgversion=1.5.0 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

cd ${BUILD_DIR}/x264-snapshot-20160517-2245/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX} --enable-shared --enable-static --disable-asm
make
checkinstall --pkgname="x264-${FFMPEG_VERSION}" --pkgversion=0.148 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

cd ${BUILD_DIR}/opencore-amr-0.1.3/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX} 
make
checkinstall --pkgname="opencore-amr-${FFMPEG_VERSION}" --pkgversion=0.1.3 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

cd ${BUILD_DIR}/xvidcore-1.3.3/build/generic/
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX} 
make
checkinstall --pkgname="xvidcore-${FFMPEG_VERSION}" --pkgversion=1.3.3 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

sleep 10

export LD_LIBRARY_PATH=${PACKAGE_INSTALL_PREFIX}:$LD_LIBRARY_PATH
export LDFLAGS="-L${PACKAGE_INSTALL_PREFIX}/lib"
export CFLAGS="-I${PACKAGE_INSTALL_PREFIX}/include"
cd ${BUILD_DIR}/ffmpeg-3.1.1
make clean
./configure --prefix=${PACKAGE_INSTALL_PREFIX} --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
make
checkinstall --pkgname="ffmpeg-${FFMPEG_VERSION}" --pkgversion=3.1.1 --deldoc="yes" --type="debian" --install="no" --default --pakdir="${PACKAGE_COMPILED_DIR}" --maintainer="${PACKAGE_MAINTAINER}" --docdir="${PACKAGE_DOC_DIR}"

В итоге у нас будет такой набор пакетов.

root@16:~# ls -1 sources/deb/                            
faac-ff311_1.28-1_amd64.deb
faad-ff311_2.7-1_amd64.deb
ffmpeg-ff311_3.1.1-1_amd64.deb
lame-ff311_3.99.5-1_amd64.deb
libtheora-ff311_1.1.1-1_amd64.deb
libvorbis-ff311_1.3.5-1_amd64.deb
libvpx-ff311_1.5.0-1_amd64.deb
opencore-amr-ff311_0.1.3-1_amd64.deb
x264-ff311_0.148-1_amd64.deb
xvidcore-ff311_1.3.3-1_amd64.deb
yasm-ff311_1.3.0-1_amd64.deb

Установка ffmpeg-3.1.1

Пакетики у нас есть, теперь можно перейти на другой сервер и установить новый ffmpeg-3.1.1.
Сначала установим дополнительные пакеты.

root@ffmpeg-server:~# apt-get install libogg-dev yasm libx11-dev libxext-dev libxfixes-dev --no-install-recommends

Теперь устанавливаем либы и сам ffmpeg

root@ffmpeg-server:~/deb# ls -1 | grep -v ffmpeg | xargs -i dpkg -i {}
root@ffmpeg-server:~/deb# dpkg -i ffmpeg-ff311_3.1.1-1_amd64.deb

В папке opt у нас должен появиться новый ffmpeg-3.1.1 и соответствующая документация.

root@ffmpeg-server:~/deb# ls -1 /opt/
ffmpeg-2.4.1  
ffmpeg-2.4.1_doc
ffmpeg-3.1.1  
ffmpeg-3.1.1_doc

Теперь проверяем работает ли новый ffmpeg

root@ffmpeg-server:~/deb# /opt/ffmpeg-3.1.1/bin/ffmpeg -h
/opt/ffmpeg-3.1.1/bin/ffmpeg: error while loading shared libraries: libxvidcore.so.4: cannot open shared object file: No such file or directory

Как видим, ffmpeg не может найти нужные библиотеки, ему нужно помочь с этим делом.

root@ffmpeg-server:~/deb# export LD_LIBRARY_PATH=/opt/ffmpeg-3.1.1/lib
root@ffmpeg-server:~/deb# /opt/ffmpeg-3.1.1/bin/ffmpeg -version 
ffmpeg version 3.1.1 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.1) 20160609
configuration: --prefix=/opt/ffmpeg-3.1.1 --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
libavutil      55. 28.100 / 55. 28.100
libavcodec     57. 48.101 / 57. 48.101
libavformat    57. 41.100 / 57. 41.100
libavdevice    57.  0.101 / 57.  0.101
libavfilter     6. 47.100 /  6. 47.100
libswscale      4.  1.100 /  4.  1.100
libswresample   2.  1.100 /  2.  1.100
libpostproc    54.  0.100 / 54.  0.100

Теперь все работает.
Как Вы могли заметить, в opt папке также лежит ffmpeg-2.4.1, у которого свой набор библиотек и другое название deb-пакета. Чтобы ним пользоваться нужно просто сменить путь LD_LIBRARY_PATH.

root@ffmpeg-server:~/deb# export LD_LIBRARY_PATH=/opt/ffmpeg-2.4.1/lib
root@ffmpeg-server:~/deb# /opt/ffmpeg-2.4.1/bin/ffmpeg -version 
ffmpeg version 2.4.1 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
configuration: --prefix=/opt/vimmi_packages/ffmpeg --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
libavutil      55. 17.103 / 55. 17.103
libavcodec     57. 24.102 / 57. 24.102
libavformat    57. 25.100 / 57. 25.100
libavdevice    57.  0.101 / 57.  0.101
libavfilter     6. 31.100 /  6. 31.100
libswscale      4.  0.100 /  4.  0.100
libswresample   2.  0.101 /  2.  0.101
libpostproc    54.  0.100 / 54.  0.100

Еще покажу список установленных ffmpeg пакетов.

root@ffmpeg-server:~/deb# dpkg -l | grep ffmpeg
ii  ffmpeg-ff311                       3.1.1-1                         amd64        Package created with checkinstall 1.6.2
ii  ffmpeg-ff241                       2.4.1-1                         amd64        Package created with checkinstall 1.6.2

Если бы пакеты имели одинаковое название при установке старая версия перетиралась бы новой.
Вот и все.

Автор: admin, 30 июля 2016
Рубрики: Видеопотоки
Метки:

Написать комментарий

Последние статьи

Яндекс.Метрика
?>