Как собрать лучшую версию FFmpeg для Windows

Общепринято, что по причинам лицензирования предварительно скомпилированные исполняемые файлы FFmpeg для Windows выпускаются из коробки с кодерами более низкого качества - особенно когда речь идет о кодере AAC по умолчанию и ресамплере по умолчанию.

Согласно этим источникам, решение состоит в том, чтобы скомпилировать программу из источника:

FFmpeg поддерживает два кодера AAC-LC (aac и libfdk_aac) и один кодер HE-AAC (v1/2) (libfdk_aac). Лицензия libfdk_aac не совместима с GPL, поэтому GPL не разрешает распространение двоичных файлов, содержащих несовместимый код, если также включен код, лицензированный по GPL. Поэтому этот кодировщик был обозначен как "несвободный", и вы не можете загрузить предварительно созданный ffmpeg, который его поддерживает. Это можно решить, скомпилировав ffmpeg самостоятельно...

Библиотека кодеков Fraunhofer FDK AAC. В настоящее время это кодер AAC самого высокого качества, доступный с ffmpeg. Требует, чтобы ffmpeg был настроен с --enable-libfdk-aac (и дополнительно --enable-nonfree, если вы также используете --enable-gpl).

...

Если вы хотите FDK-AAC, вы должны сами собрать ручной тормоз. Я сделал это, и звук теперь звучит великолепно.

У меня уже есть Cygwin, доступный на моей машине, и я предпочел бы использовать его для компиляции программы, а не для установки другой программной экосистемы или для записи всего дистрибутива Linux.

Как я могу использовать Cygwin для компиляции FFmpeg с лучшими внешними библиотеками?

2 ответа

Это легче сказать, чем сделать, и мне потребовалось более месяца, чтобы понять, как это сделать без каких-либо проблем, но я потратил достаточно времени на это, и я решил, что достаточно хорошо задокументирую процесс, чтобы практически без проблем выполнить его. Кто-нибудь следит за мной.

К сожалению, набор инструментов Cygwin по умолчанию (т.е. gcc-core пакет, включенный в установщик Cygwin) по своей сути нарушен для целей кросс-компиляции, и, похоже, у сопровождающих Cygwin нет намерения это исправить, поэтому в настоящее время единственный способ компилировать программное обеспечение для Windows с Cygwin - это установить до набора инструментов MinGW-w64 под ним. К счастью, это так же просто, как установить несколько пакетов. После этого мы будем компилировать оставшиеся пакеты, прежде чем использовать комбинацию обоих для компиляции самого FFmpeg.

Используя это руководство

Следуя этому руководству, мы создадим статическую установку FFmpeg размером примерно 200 МБ с внешними библиотеками, такими как fdk-aac, libopus, x265 и SOX ресэмплер включен. Я могу рассмотреть возможность добавления инструкций по компиляции определенных внешних библиотек в руководство, если получу достаточно запросов для конкретной библиотеки.

Зависимости, используемые в этом руководстве - составлены из самой кросс-компиляции MinGW-w64, все пакеты установлены apt-cyg и все пакеты, скомпилированные из исходного кода, будут занимать до 2,8 ГБ дискового пространства, хотя в руководство также включены команды для очистки всего, кроме установки FFmpeg после завершения. Сама установка, состоящая из двоичных файлов и документации, занимает чуть более 200 МБ дискового пространства.

Это руководство создаст папку в вашем домашнем каталоге с именем ffmpeg_sourcesгде он будет загружать и компилировать все пакеты, создаваемые из исходного кода. FFmpeg будет установлен в /usr/localгде стандарт FHS рекомендует устанавливать программное обеспечение, скомпилированное пользователем. У этого местоположения также есть вторичное преимущество того, чтобы быть в системе PATH по умолчанию в Cygwin, и поэтому не требует $PATH переменная для обновления.

Установить зависимости менеджера пакетов

Для начала загрузите последнюю версию установщика Cygwin для установки wget, tar, gawk а также git пакеты. Хорошей новостью является то, что эти пакеты являются зависимостями для инструмента, который может помешать вам когда-либо снова использовать установщик Cygwin.

Установите apt-cyg менеджер пакетов

Затем установите вилку kou1okada менеджера пакетов apt-cyg. Если вы в настоящее время не используете менеджер пакетов для Cygwin, этот шаг не только облегчит работу с остальной частью руководства, но и сделает ваш опыт работы с Cygwin конкурентом любого дистрибутива Linux.

Даже если вы уже используете менеджер пакетов для Cygwin, такой как другой форк оригинала apt-cygЯ настоятельно рекомендую вам заменить его на этот, который является гораздо более полноценным программным обеспечением по сравнению с оригинальным, а также единственным диспетчером пакетов для Cygwin, который в настоящее время находится в активной разработке.

Для установки коуокады apt-cyg:

mkdir -p /usr/local/src &&
cd /usr/local/src &&
git clone https://github.com/kou1okada/apt-cyg.git &&
ln -s "$(realpath apt-cyg/apt-cyg)" /usr/local/bin/

Установите зависимости и настройте кросс-компилятор MinGW-w64

apt-cyg install \
autoconf \
automake \
binutils \
cmake \
doxygen \
git \
libtool \
make \
mercurial \
mingw64-x86_64-SDL2 \
mingw64-x86_64-binutils \
mingw64-x86_64-fribidi \
mingw64-x86_64-gcc-core \
mingw64-x86_64-gcc-g++ \
mingw64-x86_64-headers \
mingw64-x86_64-libtheora \
mingw64-x86_64-libvpx \
mingw64-x86_64-runtime \
mingw64-x86_64-win-iconv \
mingw64-x86_64-windows-default-manifest \
mingw64-x86_64-zlib \
nasm \
pkg-config \
subversion \
texinfo \
yasm

Скомпилируйте оставшиеся зависимости

Каждый раздел ниже компилирует внешнюю библиотеку, которая позволит вам скомпилировать FFmpeg с включенной поддержкой этой библиотеки. Скопируйте и вставьте все команды в вашу оболочку.

Если вы решили, что сборка FFmpeg не требуется для поддержки данной библиотеки, пропустите ее раздел и удалите соответствующую --enable-package строка при компиляции FFmpeg на заключительном этапе этого руководства.

Во-первых, создайте каталог в корне вашей установки Cygwin со следующим:

rm -rf /ffmpeg_sources &&
mkdir -p /ffmpeg_sources

Это каталог, в который мы будем загружать наш исходный код и компилировать его.

libmp3lame

Чтобы скомпилировать аудиокодек LAME для MP3:

cd /ffmpeg_sources && rm -rf lame-svn &&
svn checkout https://svn.code.sf.net/p/lame/svn/trunk/lame lame-svn &&
cd lame-svn &&
./configure --host=x86_64-w64-mingw32 --prefix="/usr/x86_64-w64-mingw32/sys-root/mingw" \
--enable-static --disable-shared &&
make -j$(nproc) &&
make install 

libx264

Чтобы скомпилировать видеокодек x264:

cd /ffmpeg_sources && rm -rf x264 && 
git clone --depth 1 https://git.videolan.org/git/x264 && 
cd x264 &&
./configure --cross-prefix=x86_64-w64-mingw32- --host=x86_64-w64-mingw32 \
--prefix="/usr/x86_64-w64-mingw32/sys-root/mingw" --enable-static &&
make -j$(nproc) &&
make install 

libx265

Чтобы скомпилировать видеокодек x265:

cd /ffmpeg_sources && rm -rf x265 && 
hg clone https://bitbucket.org/multicoreware/x265 &&
cd x265/build/linux &&
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="/usr/x86_64-w64-mingw32/sys-root/mingw" \
-DENABLE_SHARED=OFF -DCMAKE_EXE_LINKER_FLAGS="-static" ../../source \
-DCMAKE_TOOLCHAIN_FILE="/ffmpeg_sources/x265/build/msys/toolchain-x86_64-w64-mingw32.cmake" &&
make -j$(nproc) &&
make install

libogg / libvorbis

Формат Ogg является зависимостью для аудиокодека Vorbis, поэтому его необходимо скомпилировать перед этим:

cd /ffmpeg_sources && rm -rf ogg &&
git clone --depth 1 https://gitlab.xiph.org/xiph/ogg.git &&
cd ogg && 
./autogen.sh &&
./configure --host=x86_64-w64-mingw32 --prefix="/usr/x86_64-w64-mingw32/sys-root/mingw" \
--enable-static --disable-shared &&
make -j$(nproc) &&
make install

Затем скомпилируйте Vorbis как обычно:

cd /ffmpeg_sources && rm -rf vorbis && 
git clone --depth 1 https://gitlab.xiph.org/xiph/vorbis.git &&
cd vorbis && 
./autogen.sh &&
./configure --host=x86_64-w64-mingw32 --prefix="/usr/x86_64-w64-mingw32/sys-root/mingw" \
--enable-static --disable-shared &&
make -j$(nproc) &&
make install

libaom

Чтобы скомпилировать видеокодер AV1:

cd /ffmpeg_sources && rm -rf aom && 
git clone --depth 1 https://aomedia.googlesource.com/aom &&
mkdir -p /ffmpeg_sources/aom_build && cd /ffmpeg_sources/aom_build &&
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="/usr/x86_64-w64-mingw32/sys-root/mingw" \ 
-DCMAKE_EXE_LINKER_FLAGS="-static" ../aom \
-DCMAKE_TOOLCHAIN_FILE="/ffmpeg_sources/aom/build/cmake/toolchains/x86_64-mingw-gcc.cmake" &&
make -j$(nproc) &&
make install

libopus

Чтобы скомпилировать аудиокодер Opus:

cd /ffmpeg_sources && rm -rf opus && 
git clone --depth 1 https://github.com/xiph/opus.git &&
cd opus && ./autogen.sh &&
./configure --host=x86_64-w64-mingw32 --prefix="/usr/x86_64-w64-mingw32/sys-root/mingw" \
--enable-static --disable-shared &&
make -j$(nproc) &&
make install

libfdk-ААС

Чтобы скомпилировать кодировщик Fraunhofer FDK для AAC:

cd /ffmpeg_sources && rm -rf fdk-aac && 
git clone --depth 1 https://github.com/mstorsjo/fdk-aac &&
cd fdk-aac && autoreconf -fiv &&
./configure --host=x86_64-w64-mingw32 --prefix="/usr/x86_64-w64-mingw32/sys-root/mingw" \
--enable-static --disable-shared &&
make -j$(nproc) &&
make install 

libsoxr

Чтобы скомпилировать библиотеку SOX Resampler, вам сначала нужно создать файл цепочки инструментов CMAKE для цепочки инструментов MinGW-w64, так как проект не включает его по умолчанию.

Создайте новый файл в корневом каталоге Cygwin и назовите его toolchain-x86_64-mingw32.cmake (убедитесь, что Windows показывает расширения, и что расширение .cmake).

Скопируйте и вставьте в файл следующее:

SET(CMAKE_SYSTEM_NAME Windows)
SET(CMAKE_C_COMPILER /usr/bin/x86_64-w64-mingw32-gcc)
SET(CMAKE_CXX_COMPILER /usr/bin/x86_64-w64-mingw32-g++)
SET(CMAKE_RC_COMPILER /usr/bin/x86_64-w64-mingw32-windres)
SET(CMAKE_Fortran_COMPILER /usr/bin/x86_64-w64-mingw32-gfortran)
SET(CMAKE_AR:FILEPATH /usr/bin/x86_64-w64-mingw32-ar)
SET(CMAKE_RANLIB:FILEPATH /usr/bin/x86_64-w64-mingw32-ranlib)
SET(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(QT_BINARY_DIR /usr/x86_64-w64-mingw32/bin /usr/bin)
SET(Boost_COMPILER -gcc47)

Теперь вы можете скомпилировать ресэмплер SOX как обычно:

cd /ffmpeg_sources && rm -rf soxr &&  
git clone --depth 1 https://git.code.sf.net/p/soxr/code soxr &&
mkdir -p soxr/build && cd soxr/build &&
cmake -Wno-dev -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX="/usr/x86_64-w64-mingw32/sys-root/mingw" \
-DBUILD_SHARED_LIBS=OFF .. -DCMAKE_TOOLCHAIN_FILE="/toolchain-x86_64-mingw32.cmake" &&
make -j$(nproc) &&
make install

Скомпилируйте бинарный файл FFmpeg

Осталось только скомпилировать FFmpeg, используя библиотеки, загруженные или скомпилированные выше:

cd /ffmpeg_sources && rm -rf ffmpeg &&
wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 &&
tar xvf ffmpeg-snapshot.tar.bz2 && rm -f ffmpeg-snapshot.tar.bz2 && cd ffmpeg &&
CFLAGS=-I/usr/x86_64-w64-mingw32/sys-root/mingw/include &&
LDFLAGS=-L/usr/x86_64-w64-mingw32/sys-root/mingw/lib &&
export PKG_CONFIG_PATH= &&
export PKG_CONFIG_LIBDIR=/usr/x86_64-w64-mingw32/sys-root/mingw/lib/pkgconfig &&
./configure \
--arch=x86_64 \
--target-os=mingw32 \
--cross-prefix=x86_64-w64-mingw32- \
--prefix=/usr/local \
--pkg-config=pkg-config \
--pkg-config-flags=--static \
--extra-cflags=-static \
--extra-ldflags=-static \
--extra-libs="-lm -lz -fopenmp" \
--enable-static \
--disable-shared \
--enable-nonfree \
--enable-gpl \
--enable-avisynth \
--enable-libaom \
--enable-libfdk-aac \
--enable-libfribidi \
--enable-libmp3lame \
--enable-libopus \
--enable-libsoxr \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-libx265 &&
make -j$(nproc) &&
make install

Не забудьте удалить --enable-\*package\* строки для каждого пакета в списке выше, для которого вы не загружали и не компилировали библиотеку.

Компиляция FFmpeg займет намного больше времени, чем компиляция внешних библиотек, но как только это будет сделано, у вас должен быть включен полностью работающий двоичный файл со всеми библиотеками, с которыми вы его скомпилировали. Чтобы запустить его, просто запустите ffmpeg в терминале Cygwin.

Очистить / удалить

К этому моменту в руководстве вы загрузите, установите и скомпилируете около 2,8 ГБ дискового пространства. Большая часть этого теперь избыточна, и должна быть очищена. Более 2,6 ГБ можно безопасно удалить, что позволяет сократить общую площадь установки FFmpeg до 200 МБ.

Очистка после установки

Запуск следующего освободит более 2,3 ГБ дискового пространства:

apt-cyg remove \
cmake \
doxygen \
git \
mercurial \
subversion \
texinfo \
yasm &&
rm -rf /ffmpeg_sources &&
rm -rf /usr/local/lib/{libav*,libpost*,libsw*} &&
rm -rf /usr/local/lib/pkgconfig/{libav*,libpost*,libsw*} &&
rm -rf /usr/local/include/{libav*,libpost*,libsw*} &&
rm -rf /toolchain-x86_64-mingw32.cmake

А также удаление ffmpeg_sources каталог и ненужные статические библиотеки, это также удалит все ранее установленные пакеты, которые больше не нужны, за исключением тех, которые обычно необходимы для сборки инструментов на Cygwin/Linux.

Удалить кросс-компилятор

Если вы больше не намерены компилировать какие-либо другие программы с использованием кросс-компиляции MinGW-w64, созданной ранее в этом руководстве, вы можете безопасно удалить его, а также все остальные пакеты, установленные ранее:

apt-cyg remove \
autoconf \
automake \
gcc-core \
gcc-g++ \
pkg-config \
libtool \
make \
nasm \
mingw64-x86_64-SDL2 \
mingw64-x86_64-binutils \
mingw64-x86_64-fribidi \
mingw64-x86_64-gcc-core \
mingw64-x86_64-gcc-g++ \
mingw64-x86_64-headers \
mingw64-x86_64-libtheora \
mingw64-x86_64-libvpx \
mingw64-x86_64-runtime \
mingw64-x86_64-win-iconv \
mingw64-x86_64-windows-default-manifest \
mingw64-x86_64-zlib &&
rm -rf /usr/x86_64-w64-mingw32

Это освободит дополнительные ~450 МБ пространства.

Удаление FFmpeg

Если вам когда-нибудь понадобится отменить все шаги в этом руководстве и удалить двоичные файлы FFmpeg из вашей системы, просто выполните следующее:

apt-cyg remove \
autoconf \
automake \
binutils \
cmake \
doxygen \
gcc-core \
gcc-g++ \
git \
libtool \
make \
mercurial \
mingw64-x86_64-SDL2 \
mingw64-x86_64-binutils \
mingw64-x86_64-fribidi \
mingw64-x86_64-gcc-core \
mingw64-x86_64-gcc-g++ \
mingw64-x86_64-headers \
mingw64-x86_64-libtheora \
mingw64-x86_64-libvpx \
mingw64-x86_64-runtime \
mingw64-x86_64-win-iconv \
mingw64-x86_64-windows-default-manifest \
mingw64-x86_64-zlib \
nasm \
pkg-config \
subversion \
texinfo \
yasm &&
rm -rf /ffmpeg_sources &&
rm -rf /usr/local/bin{ffmpeg,ffprobe,ffplay} &&
rm -rf /usr/local/lib/{libav*,libpost*,libsw*} &&
rm -rf /usr/local/lib/pkgconfig/{libav*,libpost*,libsw*} &&
rm -rf /usr/local/include/{libav*,libpost*,libsw*} &&
rm -rf /usr/local/share/doc/ffmpeg &&
rm -rf /usr/local/share/ffmpeg &&
rm -rf /usr/local/share/man/man1/ff* &&
rm -rf /usr/local/share/man/man3/{libav*,libpost*,libsw*} &&
rm -rf /usr/x86_64-w64-mingw32/ &&
rm -rf /toolchain-x86_64-mingw32.cmake 

Это удалит все, что было установлено в процессе работы с этим руководством, и вернет вашу систему в точности так, как это было до ее запуска.

Вместо того, чтобы делать все вручную, вы можете использоватьmedia-autobuild_suiteдля Windows, которая собирает FFmpeg почти со всеми его зависимостями:

Этот пакетный скрипт Windows настраивает среду компилятора MinGW/GCC для создания ffmpeg и других медиа-инструментов под Windows. После создания среды он извлекает и компилирует все инструменты. Все инструменты компилируются статически, внешние .dll не нужны (за некоторыми необязательными исключениями).

Сценарий постоянно обновляется, и для большинства пользователей это будет предпочтительный способ компиляции FFmpeg под Windows.

Другие вопросы по тегам