Windows用FFmpegをWindows 10でビルドする (Bash on Ubuntu on Windows)


FFmpegをWindows10でビルドしてみます。
FFmpegはLinuxでビルドする必要があります。Windowsでビルドするには開発環境の準備がとても面倒でした。しかし、Windows 10ではそのLinux環境が標準で搭載されてしまったのです。これは試すしかない!(Creators Updateを入れる必要があります)
FFmpegのビルドにはLinuxでWindowsバイナリをビルドするクロスコンパイルを行います。初めてでは面倒な事が多そうなので、支援ツールのffmpeg-windows-build-helpersを使ってみます。
できるだけWindowsユーザー向けに手順の説明をしたいと思います。私はLinuxを良くは知りません。


Windows 10ではLinux OSの一つUbuntuのターミナル環境がそのまま動くようになりました。コマンドプロンプトのようなウインドウの一つがほぼ完全なUbuntuになります。その窓の中だけUbuntuなのです。”Bash on Ubuntu on Windows”といいます。

今回はBash on Ubuntu on Windowsを使ってFFmpegをビルドしてみます。もちろんWindows用のFFmpegです。
Windows 10で動くUbuntuを使ってWindows用FFmpegをクロスコンパイルします。ややこしい。

準備

Windows 10の”Bash on Ubuntu on Windows”を使えるようにします。Creators Updateを適応したWindows 10が必要です。残念ながらデフォルトではインストールされてないので有効にします。手順は他のサイト様にお任せです。ググってみてください。
Windows Homeでも使えます。
【2017/7/12 追記】
Windowsストアからインストールできるようになりました。
Ubuntu https://www.microsoft.com/store/apps/9nblggh4msv6
Windowsの機能の有効化または無効化でWindows Subsystem for Linuxを有効にしておく必要があります。

Ubuntu用のユーザー名は"user1"として説明します。
以後特に説明なければ”Bash on Ubuntu on Windows”を起動したウインドウでコマンドを入れます。

レポジトリパッケージの更新

レポジトリとはUbuntu用のプログラムやライブラリのインストール・アンインストールなどを一元管理する仕組みです。ネットワーク上にあるパッケージされたプログラムをコマンド一つでインストールできます。
レポジトリは常に更新されているため、その情報をこちらへ取り込み、必要ならパッケージを更新します。
おまじないの様に次のコマンドを入れます。
sudo apt-get update
sudo apt-get upgrade
初めて行うと多くのパッケージが更新されるでしょう。

レポジトリにあるプログラムのバージョンはすべて最新とは限りません。Ubuntu用FFmpegもレポジトリにありますが古いバージョンです。

Ubuntuのバージョンの確認

Ubuntuのバージョンを確認します。Linuxのプログラムは多くのプログラムの絶妙のバランスをとって動かしています。いろいろなプログラムのバージョンが少し異なると変になります。まずは自分の作業しているOSのバージョンを記録しておきましょう。
$ uname -a
Linux xxx 4.4.0-43-Microsoft #1-Microsoft Wed Dec 31 14:42:53 PST 2014 x86_64 x86_64 x86_64 GNU/Linux
頭の"$"はコマンドプロンプトを表していますので打たなくていいです。以後、コマンドとその結果を一緒に表示している時はコマンドの頭に"$"を付けておきます。

FFmpegのクロスコンパイル

FFmpegは多くのライブラリを組み合わせて動いています。使う事のない機能やライセンス的に組み込めないものなどもあるため、自分に必要なライブラリを選んでビルドします。その方がファイルサイズも小さいです。
ですがその分、手順が複雑になります。必要なライブラリはそれぞれ別に取得してWindowsバイナリとしてビルドしなくてはなりません。
とても面倒そう…

こういった面倒な作業があるものは有志の方々がいろいろなツールを作ってくれています。今回はそれらのツールの一つを使ってやってみましょう。
"ffmpeg-windows-build-helpers"というのを使ってみます。
rdp/ffmpeg-windows-build-helpers
https://github.com/rdp/ffmpeg-windows-build-helpers
"Helper script for cross compiling some media tools for windows, like customizable ffmpeg.exe (with or without non-free components, etc), and some other bonuses like mplayer, mp4box, mxf, etc."

作業用ディレクトリを作る

ソースコードをダウンロードして作業する場所を準備します。
まずはホームディレクトリにいる事を確認します。
$ cd
$ pwd
/home/user1
ホームディレクトリとはUbuntuのユーザー毎に割り当てられたフォルダの場所です。個人用ファイルはホームディレクトリ以下に作っていきます。ホームディレクトリ以外の場所は書き込み許可が無いので作業に使えません。

ソースコードをダウンロードする場所として"Downloads"ディレクトリを作ります。
mkdir Downloads
cd Downloads

ffmpeg-windows-build-helpersをダウンロードする

Downloadsディレクトリへ移動したらツールをダウンロードします。
ffmpeg-windows-build-helpersの使い方は先ほどの引用先に書いてあります。いろいろ書いてありますがLinuxネイティブな環境と同じなので"Cross-compiling from a Linux environment"項を読みます。
$ git clone https://github.com/rdp/ffmpeg-windows-build-helpers.git
$ cd ffmpeg-windows-build-helpers
gitとはプログラムのソースファイルを管理するコマンドです。cloneでツールをまるごとダウンロードしています。
git clone https://github.com/rdp/ffmpeg-windows-build-helpers.git
cd ffmpeg-windows-build-helpers

ffmpeg-windows-build-helpersを実行する

ダウンロードしたツールを動かします。
./cross_compile_ffmpeg.sh --build-ffmpeg-static=y --build-intel-qsv=y --ffmpeg-git-checkout-version=n3.3.1
スクリプトにオプションを指定しています。スタティックビルドします。QSVをビルドします。FFmpegは記事執筆時の最新のリリースバージョンn3.3.1を使います。
【2017/6/29 追記】
FFmpeg n3.3.2以前を指定すると
Unknown option "--enable-libmysofa".
のエラーが出るでしょう。
FFmpegのconfigureのオプションが変わったためです。スクリプトのコメントに書いてあります。
# build_netcdf() { # Not used in ffmpeg anymore, got replaced by libmysofa, See: https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/2336c76b224628f20ed0ef8a683ad602ed1739c3

FFmpegバージョンを指定しなければビルドできます。n3.3.2より新しいリリースが出ればそれを指定しましょう。
QSVを使う以外は特に指定しなくても良いと思います。FFmpegのバージョンを指定しなければ開発中の最新の状況でビルドできます。不具合が生じる場合は最新のリリースバージョンを指定した方が良いでしょう。
FFmpegは多くのライブラリを使っています。セキュリティ対策の更新などがそれぞれ行われています。できるだけ最新のバージョンを使いましょう。

必要なライブラリのインストール

ツールを実行するとメッセージが表示されて終了してしまうでしょう。
実行に必要なライブラリやプログラムが入っていないので次のメッセージが出ます。
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 -y
…
よく読むと足りないパッケージのインストール方法まで書いてあります。親切ですね。
ということで従ってみます。
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 -y
たくさんのパッケージを入れるので時間がかかります。
インストールが終わったら再びスクリプトを実行しましょう。今度は動くはずです。

ツールの質問に答える

ツールを動かすとドライブの空き容量に注意する旨が表示されます。
Building in /home/user1/Downloads/ffmpeg-windows-build-helpers/sandbox, will use ~ 10GB space!
10GBも使う事があるようです。

最初にnon-freeなライブラリを使うか聞いてきます。
Include these non-free-license libraries [y/N]?
出来上がるバイナリをどう扱うか考えてください。誰かにあげたり商用利用するにはライセンス契約が必要になるでしょう。
この記事の説明としては個人利用として"y"を押したことにします。

次に32ビット版か64ビット版あるいは両方のどれをビルドするか聞いてきます。
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]:
この記事では32bitの"2"を選びました。通常は3の64bitでいいと思います。

ビルドがはじまる

まずはLinuxでWindows用プログラムをコンパイルするためのMinGWツールチェーンのビルドが始まります。
なにやら警告が出ています。
nice: 優先度を設定できません: 許可がありません
ビルドに影響はないので気にしません
32ビットか64ビットあるいは両方のgccのビルドが始まります。
i7-2600Kでやったのですが、32bit版のビルドに1時間弱かかりました。

コンパイラが出来上がるとFFmpegのためのライブラリのコンパイルが始まります。次々とソースをダウンロードしてはコンパイルされていきます。Linuxだとapt-getで済ましちゃうよね…というライブラリもソースからコンパイルしていきます。だってバイナリがないですから。

約2時間40分で32bit版のビルドが完了しました。

ffmpegの動作確認をする

ライブラリのビルド中にfatal errorのメッセージも見かけました。ちゃんとできてるのでしょうか?
ビルドしたバイナリーは
/home/user1/Downloads/ffmpeg-windows-build-helpers/sandbox/win32/ffmpeg_git_with_fdk_aac
にあります。32bit版の場合です。64bit版ならwin32のところをx86_64と置き換えます。
ffmpeg.exe ffplay.exe ffprobe.exe等を探します。
Bash on Ubuntu on Windowsの良い所はファイルがそのままWindowsのファイルエクスプローラで扱えることです。
Windowsから見るとバイナリーは
C:\Users\[windowsユーザー名]\AppData\Local\lxss\home\user1\Downloads\ffmpeg-windows-build-helpers\sandbox\win32\ffmpeg_git_with_fdk_aac
以下にできます。

出来上がったffmpeg.exeはWindows用です。コマンドプロンプトから実行できます。適当なフォルダにコピーしてから動作チェックをしてみます。
バージョンを確認してみます。
D:\tmp>ffmpeg -version
ffmpeg version n3.3.1 Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 4.9.4 (GCC)
configuration: --arch=x86 --target-os=mingw32 --cross-prefix=/home/user1/Downloads/ffmpeg-windows-build-helpers/sandbox/cross_compilers/mingw-w64-i686/bin/i686-w64-mingw32- --pkg-config=pkg-config --disable-w32threads --enable-libsoxr --enable-fontconfig --enable-libass --enable-libbluray --enable-iconv --enable-libtwolame --extra-cflags=-DLIBTWOLAME_STATIC --enable-libzvbi --enable-libcaca --enable-libmodplug --extra-libs=-lstdc++ --extra-libs=-lpng --extra-libs=-loleaut32 --enable-libmp3lame --enable-version3 --enable-zlib --enable-librtmp --enable-libvorbis --enable-libtheora --enable-libspeex --enable-libopenjpeg --enable-gnutls --enable-libgsm --enable-libfreetype --enable-libopus --enable-bzlib --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-libvpx --enable-libilbc --enable-libwavpack --enable-libwebp --enable-libgme --enable-dxva2 --enable-gray --enable-libopenh264 --enable-netcdf --enable-libflite --enable-lzma --enable-libsnappy --enable-libzimg --enable-libbs2b --enable-gpl --enable-libx264 --enable-libx265 --enable-frei0r --enable-filter=frei0r --enable-librubberband --enable-libvidstab --enable-libxavs --enable-libxvid --enable-avisynth --enable-libmfx --enable-avresample --extra-libs=-lpsapi --extra-libs=-lspeexdsp --extra-cflags='-mtune=generic' --extra-cflags=-O3 --enable-static --disable-shared --prefix=/home/user1/Downloads/ffmpeg-windows-build-helpers/sandbox/cross_compilers/mingw-w64-i686/i686-w64-mingw32 --enable-nonfree --enable-libfdk-aac --enable-decklink --enable-runtime-cpudetect
libavutil      55. 58.100 / 55. 58.100
libavcodec     57. 89.100 / 57. 89.100
libavformat    57. 71.100 / 57. 71.100
libavdevice    57.  6.100 / 57.  6.100
libavfilter     6. 82.100 /  6. 82.100
libavresample   3.  5.  0 /  3.  5.  0
libswscale      4.  6.100 /  4.  6.100
libswresample   2.  7.100 /  2.  7.100
libpostproc    54.  5.100 / 54.  5.100

ちゃんとできていそうです。
ffmpegのヘルプを一通り出してみます。
ffmpeg -h full > ffmpeg.txt
ffmpeg -filters > filters.txt
ffmpeg -codecs > codecs.txt
ffmpeg -formats > formats.txt
ffmpeg -decoders > decoders.txt
ffmpeg -encoders > encoders.txt
ffmpeg -bsfs > bsfs.txt
ffmpeg -protocols > protocols.txt
ffmpeg -pix_fmts > pix_fmts.txt
ffmpeg -layouts > layouts.txt
ffmpeg -sample_fmts > sample_fmts.txt
ffmpeg -version > version.txt
ffmpeg -h encoder=h264_qsv > h264_qsv.txt
encoders.txtを開いて、皆さん気になるだろうエンコーダがあるか見てみます。
libx264, h264_qsv, nvenc, libx265, hevc_qsv, nvenc_hevcなどがあります。

動くか試してみます。適当な入力ファイルをtest.mkvとして動かします。
ffmpeg -i test.mkv -c:a libx264 -c:a aac -f matroska out.mkv
libx264の他にも気になるエンコーダを試します。
i7-2600KのためQSVを動かせませんが、h.265もちゃんとできているようです。nvencも動きます。何も設定していないと画質は悪いですがnvenc速いですね。

あとがき

Windows 10の標準機能となったBash on Ubuntu on Windowsを使ってWindows用FFmpegをビルドしてみました。
FFmpegはLinux上でWindows用バイナリーをクロスコンパイルする必要があります。今までLinuxが動くようにするだけで挫折してしまう人も多かったと思います。

今回はBash on Ubuntu on Windows上でffmpeg-windows-build-helpersスクリプトを使いWindows用FFmpegをビルドしました。
複雑な環境設定やパスの設定など何もせず、ほぼコマンドを打ち込んでいくだけでFFmpegがビルドできました。これは素晴らしい事だと思います。

スクリプトを使ってビルドする事に慣れたら、スクリプトの中身を読んで自力でビルドしていく事もできるでしょう。
バグ対応でどうしてもソースコードにパッチを充てたい! 今まで諦めていたことも簡単になると思います。

ほとんどの場合、自分でFFmpegをビルドする必要はないでしょう。zeranoe様のサイト(https://ffmpeg.zeranoe.com/builds/)からダウンロードするのがお手軽です。
ですが、Windows用オープンソースプログラムであってもLinuxでビルドするものがたくさんあります。これらのプログラムを自力でビルドする事も簡単になるでしょう。

Bash on Ubuntu on Windowsはほぼ完全にUbuntuのテキストターミナルと同じように使えます。
Bash on Ubuntu on WindowsならUbuntu環境を一瞬で削除して、数分で作り直すことができます。状況がわからなくなったらすぐに作りなおせばいいのです。
PowerShellからBashへコマンドを送れば、Bash構築からビルドそして後始末までWindowsのスクリプトを呼ぶだけでできるようになるかもしれません。できるのかな?apt-getしたらどう反映されるんだろう。

かつて私もCygwinでビルドにトライとかしましたが、1週間も経つとCygwin自体の環境をどうしたか忘れてしまいそのまま放り出す事が何度もありました。Cygwinの環境がどうにも馴染めなかったのですが、Ubuntuは馴染みやすく感じました。同じLinuxでも基本的なところがかなり違うんです。
小型コンピュータボードのRaspberry PiもUbuntuと同じDebianベースです。これからLinuxをさわってみようという人にもBash on Ubuntu on Windowsはお薦めです。

コメント

最近のコメント

Threaded Recent Comments will be here.