В предыдущей статье шла речь о сборке 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
Если бы пакеты имели одинаковое название при установке старая версия перетиралась бы новой.
Вот и все.