はじめに
この記事は
- Windows x64 で ffmpeg を好き勝手にビルドしたい
- GPL に縛られて組み込んだアプリを配布できないのはイヤ
- でも H.264 のエンコーダーを使いたい
という人の助けになるかも知れない情報を忘れないようにするための忘却録のような記事です(・∀・)。
Linux 系や macOS などでの記事はあるのですが、Windows での記事はあまり見かけないので書いておきます(・∀・)。
その中でも x264 ではなく OpenH264 を組み込んで使用する日本語の記事は更に少ないので、参考になる人もいるかも知れません(・∀・)。
また、この記事でビルドするのは以下です(・∀・)。
- ffmpeg v4.1
- OpenH264 v1.8.0
※2019/01/17 ffmpeg Ver 4.1 でビルドを確認
概要
ffmpeg はいたる所で使用されているライブラリです(・∀・)。
ffmpeg.exe 自体がエンコーダー / デコーダーになっているし、機能ごとに DLL を生成してアプリから読み出すことも可能です(・∀・)。
H264/AAC など標準的な形式を含む様々な形式に対応しています(・∀・)。
が、普通に使うとライセンスが GPL であるという制限があります(・∀・)。
オープンソースの場合はさほどの問題になりませんが、ソースコードを公開したくないアプリの開発に使用する場合、ライセンスが GPL ではいささか問題になります(・∀・)。
なので、ここでは
ライブラリとして使用するなら自分のアプリに組み込んでもソースコードを公開しないで済む LGPL v3 と言うライセンスで ffmpeg をビルドしよう!
と言う作戦を取ります(・∀・)。
しかし ffmpeg に H.264 のエンコーダーとデコーダーを提供している x264 は GPL でライセンスされています(・∀・)。
なので、普通に H.264 を扱える ffmpeg をビルドしても LGPL には出来ません(・∀・)。
そのため、ここでは x264 をビルド対象から外し、代わりに BSDライセンスで提供されている OpenH264 を組み込んで
H.264 のエンコーダー / デコーダー機能を有したまま LGPL v3 でライセンスされた ffmpeg と、その関連ファイルをビルドしてみます(・∀・)。
ビルドに必要な環境
- Windows 10 Pro x64
- 普通に Home でも出来るはずですが未確認
- Git(公式ページ)
- 私が使ったのはこれ
- MinGW(ページ)
- 私が使ったのはこれ
- これを x86 とかに変えれば32ビット版も行けると思います(・∀・)。
- MSYS
- 私が使ったのはこれ
- NASM(公式)
- 私が使用したのはこれ
- pkg-config
- OpenH264 のソースコード(公式)
- GitHub(これ)
- ffmpeg のソースコード(公式)
- Git(これ)
基本的には最新版で良いと思いますが、バージョンが変わると手順が変わることもあるかも(・∀・)。
また、生成するバイナリが x86_64 向けのものなので x64 な Windows は必須です(・∀・)。
32ビットの人や32ビットのバイナリが欲しい人は MinGW で「Toolchains targetting Win32」を使用すれば良いと思います(・∀・)。
大まかな流れ
- Git をインストール
- コマンドラインから Git が使用できれば問題なし
- MinGW をインストール
- Toolchains には Win64 向けのものを使用する
- バージョンは 8.1.0 を使用
- MSYS
- MinGW とは別に用意しました
- NASM
- OpenH264 のビルドに必要
- pkg-config
- ffmpeg に openh264 を組み込むのに必要
- OpenH264 をビルド
- ffmpeg をビルド
上記の手順を踏みます(・∀・)。
また、上記のビルド環境はあまり汎用的なものを考えず ffmpeg がビルドできることだけを考えました(・∀・)。
Git をインストール
普通に Git をインストールします(・∀・)。
インストールして PATH が通ってることを確認したら、以下のコマンドを実行します(・∀・)。
git config --global core.autoCRLF false
これは、Windows の Git はなぜか改行コードを勝手にCRLFに変えてしまうという謎の仕様があります(・∀・)。
その機能を無効にするために上記のコマンドで設定を変える必要があります(・∀・)。
改行コードが変更されてしまうと後述する ffmpeg の手順で Make 出来ないファイルを吐き出してしまうようです(・∀・)。
なので、一時的にここで設定を変えてしまうのが良いでしょう(・∀・)。
ffmpeg のビルドが終わって、変更した設定を元に戻したい場合は
git config --global core.autoCRLF true
とすると、もとの設定に戻ります(・∀・)。
MinGW / MSYS のインストールと設定
MinGW / MSYS ですね(・∀・)。
Windows 上で gcc などのコンパイラを使える環境などを提供してくれるツール群です(・∀・)。
まずは x86_64-8.1.0-release-win32-seh-rt_v6-rev0.7z を展開しましょう(・∀・)。
.7z は 7-Zip などで展開できます(・∀・)。
展開したら mingw64 というフォルダが現れると思いますので、それを C:\mingw64 などに置きます(・∀・)。
他の場所でも構いませんが、その場合は自分で以降の PATH などを置き換えてお読みください(・∀・)。
続いて mingw-get-setup.exe を実行します(・∀・)。
ここでもインストール先は C:\mingw64 にしてください(・∀・)。
ビルドに必要なものをセットアップします(・∀・)。
- mingw-developer-toolkit
- mingw32-base
- mingw-gcc-g++
- msys-base
の4つにチェックを入れて、メニューの
- 「Installation」-> Apply Change -> Apply
としてビルドに必要なモノのインストールを実行します(・∀・)。
NASM と pkg-config を使えるようにする
続いて NASM と pkg-config を使えるようにします(・∀・)。
基本的に ZIP で持ってきたものを展開して C:\mingw64 以下に適切にコピーするだけです(・∀・)。
NASM は nasm-2.14.02-win64.zip の中にある nasm.exe を C:\mingw64\bin 以下にコピーします(・∀・)。
pkg-config は glib_2.28.8-1_win32.zip と pkg-config_0.26-1_win32.zip の内容を C:\mingw64 に展開します(・∀・)。
bin と share を上書きする感じになります(・∀・)。
また、環境変数で C:\mingw64\bin へのパスを通しておきましょう(・∀・)。
よく分かんないので、場当たり的に行った対処
ちょっと正しい手順が分からなかったのですが、このままですと一部のコマンドが上手く実行できなくてビルドに失敗します(・∀・)。
具体的には ar と nm で失敗します(・∀・)。
そのため C:\mingw64\bin にある以下のファイルをリネームもしくはコピーして別名保存してください(・∀・)。
x86_64-w64-mingw32-gcc-ar.exe -> x86_64-w64-mingw32-ar.exe にリネーム
x86_64-w64-mingw32-gcc-nm.exe -> x86_64-w64-mingw32-nm.exe にリネーム
何故か gcc- が付いててコマンド名が見つからない(・∀・)。
OpenH264 をビルド
これで、ようやくビルドする環境が整いました(・∀・)。
ビルドはコマンドラインから行います(・∀・)。
まずは、以下のバッチを実行してください(・∀・)。
C:\mingw64\msys\1.0\msys.bat
すると、先ほど色々とセットアップしたビルド環境が整った Linux 風の環境が作られています(・∀・)。
私の場合は Windows のユーザー名が mao なので
C:\mingw64\msys\1.0\home\mao
がホームディレクトリになります(・∀・)。
ここに OpenH264 や ffmpeg を git clone してビルドを行います(・∀・)。
今回は、OpenH264 のバージョンを 1.8.0 を指定して作業します(・∀・)。
以下がビルド手順です(・∀・)。
$ git clone https://github.com/cisco/openh264.git
$ cd openh264
$ git checkout openh264v1.8
$ make ARCH=x86_64 LDFLAGS="-static-libgcc -static-libstdc++"
$ make install
アーキテクチャに ARCH=x86_64 を指定しないと上手くビルドできないようです(・∀・)。
また、LDFLAGS="-static-libgcc -static-libstdc++" を指定しないと実行時に libgcc_s_seh-1.dll とか libstdc++-6.dll が無いと言われてエラーになります(・∀・)。
上手くビルドできると C:\MinGW64\msys\1.0\local 以下にビルドされた一式が置かれます(・∀・)。
ユーザー名の部分(mao)などは各自で読み替えてください(・∀・)。
ffmpeg のビルド
いよいよ、本番の ffmpeg のビルドです(・∀・)。
長いですねぇ(・∀・)。
先ほどと同じように、以下のバッチからコマンドラインを起動して作業します(・∀・)。
C:\mingw64\msys\1.0\msys.bat
別に新しくコマンドを起動しなくても OpenH264 の画面をそのまま使用しても構いません(・∀・)。
まずは ffmpeg のソースコードを git clone します(・∀・)。
$ export PKG_CONFIG_PATH=/local/lib/pkgconfig
$ git config --global core.autoCRLF false
$ git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
$ cd ffmpeg
$ git checkout release/4.1
ビルドオプションは以下を指定します(・∀・)。
$ ./configure --prefix=/home/mao/ffmpeg-build --disable-logging --disable-gpl --enable-version3 --enable-static --enable-shared --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-avdevice --disable-postproc --disable-bzlib --disable-iconv --enable-libopenh264 --enable-cuda --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-hwaccel=h264_dxva2 --enable-nvenc --disable-debug --enable-optimizations --extra-ldflags="-static-libgcc -static-libstdc++"
オプションの意味(・∀・)。
- --prefix=/home/mao/ffmpeg-build
- ビルドしたライブラリのインストール先
- 分かりやすい場所にヘッダファイルとライブラリファイルが置かれるようにするので、場所はどこでも良い
- ユーザー名の部分は各自で置き換えること
- --disable-gpl
- GPL を無効にする
- --enable-version3
- LGPL を v2.1 ではなく v3 にする
- --enable-libopenh264
- OpenH264 を組み込む
- --enable-shared
- DLL を出力する
- --extra-ldflags="-static-libgcc -static-libstdc++"
- 外部の DLL が無くても動作するバイナリを出力する
- これがないと実行時に libgcc_s_seh-1.dll とか libstdc++-6.dll が無いと言われて起動できない
他のオプションは不要そうなものを --disable-xxxx としています(・∀・)。
全部ほしければ --disable-xxxx を外すと良いでしょう(・∀・)。
一応、今回の目的の最小限のオプションも書いておきます(・∀・)。
./configure --disable-gpl --enable-version3 --enable-shared --enable-libopenh264
こっちは未確認なので悪しからず(・∀・)。
後は
$ make
$ make install
とすれば、ビルドが開始されます(・∀・)。
ビルドは時間がかかるので、気長に待ちましょう(・∀・)。
なんか警告がいっぱい出ますが、ビルドは出来ているのできっと大丈夫だと思いたい(・∀・)。
ビルドが完了して make install すると --prefix= で指定した場所にビルドしたバイナリ一式があるはずです(・∀・)。
後は、ライセンスの範囲で好きに使用すると良いでしょう(・∀・)。
他のライブラリを組み込む?
また ffmpeg が対応している他のライブラリを組み込むなら、似たような手順を取ればよいでしょう(・∀・)。
ただし、組み込むときに GPL のものを組み込んでしまうと --disable-gpl が指定できなるなります(・∀・)。
それは他の人も行っているビルド手順であり、巷にあふれている ffmpeg のバイナリやビルド手順なので、ここでは扱いません(・∀・)。
また ffmpeg にハードウェアデコーダーやCUDAなどの機能を組み込みたい場合は
- --enable-cuda
- --enable-cuvid
- --enable-nvenc
- --enable-hwaccel=h264_dxva2
などのオプションを付けると良いでしょう(・∀・)。
調べれば他にも組み込める便利機能はたくさんあるようです(・∀・)。
興味があれば各自調べてみてもいいと思いますが
「よく分かんないけど欲しい機能があるから組み込めるか調べて!」
という物がアレば、コメントでもテレパシーでも何でも良いので知らせてくれれば、暇な時に調べるかも知れませんしスルーするかも知れません(・∀・)。
その他
OpenH264 について
注意:
私は法律の専門家ではありませんので、ライセンスの情報についてはそれぞれのライセンス情報などを参照して自己責任の上でお願いします(・∀・)。
OpenH264 は Cisco が作成して配布している H264 のエンコーダーとデコーダーを備えたライブラリでBSDライセンスです(・∀・)。
これはあくまでソースコードを使用して良いと言うライセンスであり、H.264を使用して良いライセンスではありません(・∀・)。
動画の形式などは、エンコーダーやデコーダーに関わらず動画形式自体がライセンスされていたりします(・∀・)。
しかし、OpenH264 の場合は少し特殊で
Cidco のビルドしたDLLを使用する場合はH.264の使用料を Cisco が負担すると言うルールがあるそうです(・∀・)。
なので、ffmpeg から呼び出す OpenH264 の DLL をこの記事の手順でビルドしたものではなく Cisco が配布しているバイナリを使用することで(H.264 に関しては)更にクリーンなエンコーダー環境を整えられるかも知れません(・∀・)。
一応、配布されているバイナリとそのライセンスの情報(・∀・)。
バイナリ
- ビルドするのめんどくせえよ!
- ゴチャゴチャ言ってねぇでとっととバイナリよこせよ!
という方のために、私がビルドした野良バイナリを BitBucket に置いておきます(・∀・)。
当たり前ですが、無保証です(・∀・)。