ffmpeg-windows-build-helpers で Windows 版 ffmpeg をビルドする

この記事は最終更新日から1年以上が経過しています。情報が古くなっている可能性があります。

Windows 版 ffmpeg を ffmpeg-windows-build-helpers でビルドするメモ(いつも忘れるので…)

2021/07/01追記:この記事では WSL 1 での手順について説明しています。WSL 2 ではおそらく変わってくる、というより通常の Linux と変わらない手順でビルドできるように思います(試していませんが)。
Sponsored Link

WSL (Windows Subsystem for Linux) を入れる

導入済みの人は飛ばしてください。
詳しくは解説しません(他の記事をあたってください)が、

  1. [コントロールパネル]-[プログラムと機能]-[Windowsの機能]ダイアログを開き、[Windowsの機能の有効化または無効化]をクリックし、「Windows Subsystem for Linux」にチェックを入れて、PC を再起動する
  2. Microsoft ストア(過疎)を開き、検索窓に「Ubuntu」と入れ、Ubuntu をインストールする
  3. ショートカットがデスクトップに作成されるので、開いてプロンプトの通りにパスワードとかを設定する
  4. sudo apt update && sudo apt upgrade

    をしておく

  5. 山程パッケージがアップデートされるので待つ

これで WSL が使える状態になっているはずです。

注意

以下は WSL 1 での情報です。WSL 2 では WSL 内のファイルは仮想ディスクイメージ (vhdx) に格納されるため、\\wsl$\Ubuntu 以外からアクセスすることはできません。

予め、ノートンなどのセキュリティソフトはオフにするか、後述の通りセキュリティスキャンから WSL のあるフォルダを除外しておいてください。
(ビルド中にセキュリティソフトが誤判定して途中でビルドが失敗してしまった事があります)

WSL がインストールされている場所は

C:\Users\(ユーザー名)\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_(ランダム(?)のハッシュ値)

にあるので( WSL は特殊なファイルシステムが使われているため、ファイルの中身を編集したり移動させたりしないようにしてください)、そのフォルダをスキャンから除外しておくと良いでしょう。

Windows10 1809 からは、エクスプローラーに \\wsl$\Ubuntu\ と入力すると、正規の手段で Ubuntu 内のファイルが弄れるようになりました(ネットワークドライブ的な扱いのようです)。

ffmpeg-windows-build-helpers を入れる

WSLのプロンプトを開き、予め

sudo apt update && sudo apt upgrade

しておきます。
次に、ffmpeg-windows-build-helpers をダウンロードします。

cd ~
git clone https://github.com/rdp/ffmpeg-windows-build-helpers.git
cd ffmpeg-windows-build-helpers

ビルドする

下記のコマンドを実行し、ffmpeg をビルドします。

–ffmpeg-git-checkout-version=n4.2.1 の 4.2.1 の部分は、ビルド時点でのffmpegの最新安定版 (もし4.2.2が出ていれば –ffmpeg-git-checkout-version=n4.2.2 など) を指定しておきましょう。
指定しない場合開発中の最新のものがダウンロードされますが、不具合を抱えている事もあるためおすすめはしません。

ビルドオプション

下記の --build-ffmpeg-static=y の部分を --build-ffmpeg-shared=y に変更すると、Shared 版でビルドすることができます。
Shared 版はライブラリ類を dll 化する( exe 内に取り込まない)するタイプです。
ファイルが多くなるというデメリットはあるものの、ffmpeg・ffprobe・ffplay の3つで同じ dll を共有するため、ファイルサイズを大幅に減らす事ができます(逆に、ffmpeg しか使わない場合は Static 版の方がいいかもしれません)。
また、 --build-ffmpeg-static=y--build-ffmpeg-shared=y を両方記述すると両方同時にビルドできるみたいです。

--build-intel-qsv=y は Intel QSV をビルドする、--build-amd-amf=y は AMD AMF (VCE) をビルドする設定です。
このほか、下記にプラスして --build-lsw=y と追記すると、L-smash Works( AviUtl で使われているアレ)も一緒にビルドできます。
その他、dvbtee・libmxf・mp4box・mplayer・vlc を一緒にビルドできます(上記同様 --build-mp4box=y のように指定)。
--disable-nonfree=n にしているのは fdk-aac 入りにするためです。y に設定すると fdk-aac などの non-free なライブラリを除いてビルドされます。

./cross_compile_ffmpeg.sh --build-ffmpeg-static=y --build-intel-qsv=y  --build-amd-amf=y --disable-nonfree=n --ffmpeg-git-checkout-version=n4.2.1

必要なソフトを入れておく

Could not find the following execs (svn is actually package subversion, makeinfo is actually package texinfo, hg is actually package mercurial if you're missing them): libtoolize nasm unzip pax hg g++ makeinfo bison flex cvs yasm automake autoconf gcc cmake svn make pkg-config
Install the missing packages before running this script.
for ubuntu: $ sudo apt-get install subversion curl texinfo g++ bison flex cvs yasm automake libtool autoconf gcc cmake git make pkg-config zlib1g-dev mercurial unzip pax nasm ragel gperf autogen bzip2 autoconf-archive p7zip-full meson python3-distutils -y

と出る場合、必要なソフトが WSL にインストールされていません。

sudo apt install -y subversion curl texinfo g++ bison flex cvs yasm automake libtool autoconf gcc cmake git make pkg-config zlib1g-dev mercurial unzip pax nasm ragel gperf autogen bzip2 autoconf-archive p7zip-full meson python3-distutils 

と実行し、一括でソフトをインストールしておきましょう。
以前よりも必要とするソフトが増えたようです。注意してください。

meson のバージョン問題

ffmpeg-windows-build-helpers は meson というソフトのバージョン 0.47 以降を必要とします。

your meson version is too old 0.45.1 wanted 0.47

ただし、何故か Ubuntu 18.04 では meson は 0.45 以降のパッケージが用意されていないため、そのままでは上記のようなエラーが出てしまい、実行することができません。

そこで、Ubuntu 19.10 用のパッケージを別途ダウンロードし、それを直接インストールすることとします。

wget http://archive.ubuntu.com/ubuntu/pool/universe/m/meson/meson_0.49.0-2ubuntu1_all.deb
dpkg -i meson_0.49.0-2ubuntu1_all.deb

まずは meson 0.49 のパッケージ(拡張子は .deb)をダウンロードし、その後 dpkg でインストールします。

その他

最近の ffmpeg-windows-build-helpers では、

windows WSL detected: you must first disable 'binfmt' by running this 
sudo bash -c 'echo 0 > /proc/sys/fs/binfmt_misc/WSLInterop'
then try again

そのままではWSL 環境だとこのようなエラーが出てしまいます。
どうも binfmt という Wine の実行に使われたりする系のソフトがビルド中に干渉してしまうらしい(?)ので、

sudo bash -c 'echo 0 > /proc/sys/fs/binfmt_misc/WSLInterop'

一度上記のように実行し、binfmt を無効化(?)してからビルドに移ります。
ちなみに PC を再起動すると元に戻るみたいです。

ビルド

最初に、

What version of MinGW-w64 would you like to build or update?
1. Both Win32 and Win64
2. Win32 (32-bit only)
3. Win64 (64-bit only)
4. Exit
Input your choice [1-4]:

と聞かれるので、64bit 環境であれば 3 を入力します(ffmpeg の 64bit 版をビルドします)
1 を入力すると ffmpeg の 32bit 版・64bit 版両方ビルドできるようですが、後述のようにビルドには非常に時間がかかるので、3 を入力して 64bit版 のみビルドすることをお勧めします。

Enter を押すと、ビルドが始まります。
エラーが出るかもしれませんが、エラーでストップしていなければ大丈夫(のはず)です。

ビルドには非常に時間がかかります(2時間半以上は確実に…)
他の作業でもして待ちましょう…

ビルドできたのを取り出す

ビルドした ffmpeg.exe などは、

C:\Users\(ユーザー名)\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_(ランダム?のハッシュ値)\LocalState\rootfs\root\ffmpeg-windows-build-helpers\sandbox\(64bitならwin64・32bitならwin32?)\ffmpeg_git_with_fdk_aac_n(ビルド時に入れたバージョン 例:4.2.1)

または Windows 10 1809 以降の場合は、

\\wsl$\Ubuntu\root\ffmpeg-windows-build-helpers\sandbox\(64bitならwin64・32bitならwin32?)\ffmpeg_git_with_fdk_aac_n(ビルド時に入れたバージョン 例:4.2.1)

にあります。
(Shared 版の場合はフォルダ名が ffmpeg_git_with_fdk_aac_n4.2.1_shared のようになります)

  • ffmpeg.exe
  • ffplay.exe
  • ffprobe.exe

を、適当なフォルダにコピーして取り出します。

Shared 版の場合は中に bin フォルダがあるので、それをフォルダごと取り出してください。
(直下にも何故か ffmpeg.exe などが置いてありますが、dll 類は exe と一緒に bin フォルダに置かれているのでそっちを取り出しましょう・.lib ファイルはビルド時に使った残りなので削除してください)

この他にも、

  • ffmpeg_g.exe
  • ffplay_g.exe
  • ffprobe_g.exe

など _g がついたファイルがありますが、どうもデバッグ情報を含んだものらしいです
普通に使う分には Static 版の場合容量が2.8倍( ffmpeg.exe 単体で 220MB 以上)もある上、特に機能としては変わらないのでコピーしなくても大丈夫です…

あとは適当にパス(環境変数)の通った場所に置けば終了です。
ffmpeg はビルド手順がかなり複雑なので、ここまで簡単にビルド出来る事に驚きました…

コメント

  1. 初めまして、こんにちは。こちらの記事を参考にさせていただいております。

    「./cross_compile_ffmpeg.sh」の部分を実行しようとした所、

    your meson version is too old 0.45.1 wanted 0.47

    というメッセージが出てしまします。

    必要なソフトを~についても、「ragel gperf autogen bzip2 autoconf-archive p7zip-full meson python3-distutils」これらが増えているようです。

    meson を0.47にする方法がわからなく悩んでいます。

    お手数ですがご教示いただけないでしょうか?

    • meson のエラーに関しては私の環境でも出ていましたが、共通のものでしたか…
      ffmpeg-windows-build-helpers は meson 0.47 以降を必要としますが、meson は何故か Ubuntu 18.04 では0.45 までしか apt でインストールできないようで、
      19.10 用の meson 0.49 のパッケージ(.deb)を https://ubuntu.pkgs.org/19.04/ubuntu-universe-amd64/meson_0.49.0-2ubuntu1_all.deb.html からダウンロードし、
      dpkg で meson_0.49.0-2ubuntu1_all.deb ファイルをインストールする事で解決しました
      その他のソフトについては apt install -y ragel gperf autogen bzip2 autoconf-archive p7zip-full meson python3-distutils のようにすれば一括でインストールできるかと思います

      • 丁寧なご返信ありがとうございます。

        仰られるとおりに作業したところ、コンパイルが始まりました。
        これで作業を進めてみます。
        ありがとうございました。

        • いえいえ… それはよかったです