web-dev-qa-db-ja.com

Windows用のFFmpegの最適なバージョンをコンパイルする方法

一般に受け入れられている 、ライセンス上の理由により、FFmpegの事前にコンパイルされたWindows実行可能ファイルは、特に デフォルトのAACエンコーダーデフォルトのリサンプラー

これらのソースによると、解決策はソースからプログラムをコンパイルすることです:

FFmpegは、2つのAAC-LCエンコーダー(aacおよびlibfdk_aac)および1つのHE-AAC(v1/2)エンコーダー(libfdk_aac)をサポートします。 libfdk_aacのライセンスはGPLと互換性がないため、GPLライセンスコードも含まれている場合、GPLは互換性のないコードを含むバイナリの配布を許可しません。したがって、このエンコーダーは「非フリー」として指定されており、それをサポートするビルド済みのffmpegをダウンロードすることはできません。 これは、ffmpegを自分でコンパイルすることで解決できます...

フラウンホーファーFDK AACコーデックライブラリ。これは現在、ffmpegで利用可能な最高品質のAACエンコーダーです。 ffmpegを--enable-libfdk-aacで構成する必要があります(さらに--enable-gplを使用している場合は--enable-nonfreeも必要です) )。

...

FDK-AACが必要な場合は、ハンドブレーキを自分でコンパイルする必要があります。私はそれをしました、そして、オーディオは今素晴らしい音です。

私のマシンではすでにCygwinを利用できます。別のソフトウェアエコシステムをセットアップしたり、Linuxディストリビューション全体を焼き付けたりするのではなく、それを使用してプログラムをコンパイルします。

Cygwinを使用して、より優れた外部ライブラリでFFmpegをコンパイルするにはどうすればよいですか?

6
Hashim

これは言うより簡単で、問題なく実行する方法を見つけるのに1か月以上かかりましたが、十分に時間をかけて、私をフォローしている人。

残念ながら、Cygwinのデフォルトのツールチェーン(つまり、Cygwinインストーラーに含まれているgcc-coreパッケージ)はクロスコンパイルの目的で本質的に壊れており、Cygwinのメンテナーからこれを修正する意図はないようです。現在、 Cygwinを使用してWindows用のソフトウェアをコンパイルする唯一の方法は、その下にMinGW-w64ツールチェーンを設定することです。ありがたいことに、これはいくつかのパッケージをインストールするのと同じくらい簡単です。この後、残りのパッケージをコンパイルしてから、両方の組み合わせを使用してFFmpeg自体をコンパイルします。

このガイドの使用

このガイド全体に従って、fdk-aaclibopusx265などの外部ライブラリとSOXリサンプラーを含む静的FFmpegインストールをビルドします。特定の外部ライブラリをコンパイルするための手順をガイドに追加することを検討するかもしれませんif特定のライブラリに対してそうするために十分なリクエストを受け取ります。

このガイドで使用されている依存関係-MinGW-w64クロスコンパイルツールチェーン自体、apt-cygによってインストールされたすべてのパッケージ、およびソースからコンパイルされたすべてのパッケージで構成されている-は、ガイドで最大2.8GBのディスク容量を消費しますすべてをクリーンアップするコマンドが含まれていますが、FFmpegのインストールは一度実行すると完了です。バイナリとドキュメントで構成されるインストール自体は、200MBをわずかに超えるディスク容量しか使用しません。

このガイドは、ホームディレクトリにffmpeg_sourcesというフォルダーを作成します。このフォルダーには、ソースからビルドされているすべてのパッケージをダウンロードしてコンパイルします。 FFmpegは/usr/localにインストールされます。FHS標準 推奨 ユーザーがコンパイルしたソフトウェアのインストール先です。この場所には、CygwinのデフォルトでシステムPATHにあるという副次的な利点もあるため、$PATH環境変数を更新する必要はありません。

パッケージマネージャーの依存関係をインストールする

まず、最新バージョンの Cygwinインストーラー をダウンロードして、wgettargawkおよびgitパッケージをインストールします。良いニュースは、これらのパッケージが、Cygwinインストーラーを再度使用する必要がなくなるツールの依存関係であることです。

apt-cygパッケージマネージャーをインストールする

次に apt-cygパッケージマネージャーのkou1okadaのフォーク をインストールします。現在Cygwinのパッケージマネージャーを使用していない場合、この手順により、ガイドの残りの部分が簡単になるだけでなく、Cygwinのエクスペリエンスが他のLinuxディストリビューションに匹敵するようになります。

元のapt-cygの別のフォークなど、Cygwinのパッケージマネージャーを既に使用している場合でも、元のパッケージと比べてはるかに本格的なソフトウェアであるこのパッケージに置き換えることを強くお勧めします。だけでなく、現在活発に開発されているCygwinの唯一のパッケージマネージャーです。

Kou1okadaの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のビルドを必要としない場合は、そのセクションをスキップして、このガイドの最終段階でFFmpegをコンパイルするときに対応する--enable-package行を削除してください。

Cygwinインストールのルートに次のディレクトリを作成します。

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

これは、ソースコードをダウンロードしてコンパイルするディレクトリです。

libmp3lame

MP3用のLAMEオーディオコーデックをコンパイルするには:

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://code.videolan.org/videolan/x264.git && 
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

自由

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" .. \
-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 CFLAGS="-I/usr/local/llsp" --Host=x86_64-w64-mingw32 --prefix="/usr/x86_64-w64-mingw32/sys-root/mingw" \
--enable-static --disable-shared &&
make -j$(nproc) &&
make install

libfdk-aac

フラウンホーファー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リサンプラーライブラリをコンパイルするには、プロジェクトにはデフォルトで含まれていないため、最初にMinGW-w64ツールチェーン用のCMAKEツールチェーンファイルを作成する必要があります。

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のコンパイルは、外部ライブラリのコンパイルよりもはるかに時間がかかりますが、完了したら、コンパイルに使用したすべてのライブラリで完全に機能するバイナリを有効にする必要があります。実行するには、Cygwinターミナルでffmpegを実行します。

クリーンアップ/アンインストール

ガイドのこの時点までに、ダウンロード、インストール、およびコンパイルに約2.8 GBのディスク領域を使用していることになります。これの大部分は現在冗長であり、クリーンアップする必要があります。 2.6 GBを超えるファイルは安全にパージできるため、FFmpegのインストールの合計フットプリントは200MBにまで減少します。

インストール後のクリーンアップ

以下を実行すると、2.3GBを超えるディスク領域が解放されます。

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ディレクトリと不要な静的ライブラリを削除するだけでなく、これにより、以前にインストールされた不要になったパッケージも削除されますexceptfor 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 MBのスペースが解放されます。

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 

これにより、このガイドの処理中にインストールされたすべてが削除され、システムが起動前の状態に戻ります。

5
Hashim

すべてを手動で行う代わりに、 media-autobuild_suite Windowsの場合、ほとんどすべての依存関係でFFmpegをビルドします。

このWindows Batchscriptは、Windowsでffmpegおよびその他のメディアツールを構築するためのMinGW/GCCコンパイラ環境をセットアップします。環境を構築した後、すべてのツールを取得してコンパイルします。すべてのツールは静的にコンパイルされ、外部.dllは必要ありません(一部のオプションの例外を除く)

スクリプトは継続的に更新され、ほとんどのユーザーにとって、これはWindowsでFFmpegをコンパイルするための推奨される方法です。

2
slhck