Introduction
掲題の通り、FFMPEG で libopenh264 を Windows でビルドして使う方法。
H264 や H265 の特許にまみれたエンコーダのせいで、おちおち商用で使えないため、ここいらで本腰入れて作り方を習得した。
ネットで転がっている記事はそれなりにあるが、手順はしょってるし、libopenh264 が ffmpeg に埋め込まれていて、libopenh264 を使うことによるメリット ライセンス料支払いの免責 が意味をなしてなかったりしてる。
これ とか。
libopenh264.dll を外しても普通に OpenH264 でエンコードを始めてしまう。
(マシン上に libopenh264.dll がどこにも存在しないことを確認した上で試したので間違いない)
How to build?
必要なものは下記
以前も MSYS2 は使ったことがあるが、正直あまり好きではない。
Ubuntu でのクロスコンパイルも試してみたが、どうしても libopenh264 のクロスコンパイルができなかったので、泣く泣く MSYS2 で対応。
1. MSYS2 のセットアップ
下記からダウンロード。
手順に従ってインストールするだけ。
インストール先は変更しないほうが無難。
2. パッケージの更新
MSYS2 MINGW64 を起動。
少し時間がかかるが、起動するとコンソールが表示される。
まず、パッケージマネージャの更新を実施。
1 | pacman --needed -Sy bash pacman pacman-mirrors msys2-runtime |
完了後、MINGW64 を再起動。
次に、既にインストールされているパッケージを更新する。
1 | pacman -Syuu |
3. パッケージの準備
ここからビルドに必要なものをインストール。
1 | pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-yasm mingw-w64-x86_64-pkg-config git make diffutils |
4. libopenh264 のインストール
パッケージマネージャからインストール。
最新版は現時点で 2.3.1。
このバージョンが重要で、後述の libopenh264.dll を使う際は、同じバージョンを使う必要がある。
ソースからのビルドでも可能だが、これが確実。
1 | pacman -S mingw-w64-x86_64-openh264 |
インストール後、/mingw64/lib/pkgconfig/openh264.pc
に pkg-config ができる。
5. FFMPEG のビルド
ソースからビルドする。
最新版の 5 系は抵抗があるので、ここでは 4.3.5 を使用。
1 | git config --global core.autoCRLF false |
次に、ビルドしたバイナリのインストール先フォルダを作る。
インストールと言っても単純にファイルが展開されるだけなので、システムディレクトリである必要はない。
1 | mkdir /home/ffmpeg-build |
FFMPEG をビルドする。
1 | ./configure \ |
重要なのは下記
--disable-gpl
- GPL のコンポーネントを無効化
--enable-libopenh264
- libopenh264 を有効化。事前にライブラリやヘッダを用意する必要があり、
openh264.pc
がシステムにインストールされているかPKG_CONFIG_PATH
でパスが通っている必要がある
- libopenh264 を有効化。事前にライブラリやヘッダを用意する必要があり、
以上を実行すると、時間がかかるがバイナリが /home/ffmpeg-build
に展開される。
6. 実行準備
これだけでは動かない。
正確には、FFMPEG をビルドした、MINGW64 が入っていないマシン上では、である。
MINGW64 の世界で参照した dll が欠落しているためである。
必要なのは下記。
- libopenh264.dll
- openh264 から適切なバージョン、プラットフォームのものをダウンロードして展開 (bz2 形式なので)し、名前を変更
- github からダウンロードされたのものは Cisco のデジタル署名がなされているので要確認
- C:\msys64\mingw64\bin\libwinpthread-1.dll
- C:\msys64\mingw64\bin\zlib1.dll
- C:\msys64\mingw64\bin\liblzma-5.dll
- これが必要になる環境があったが原因は不明
ffmpeg.exe をたたいて動くまで必要な dll を回収する。
エラーを出さずに落ちるので、 Dependencies などで不足している dll を見つけ出す必要がある。
無事に動くと
1 | $ ffmpeg.exe |
のように、ビルドした際のオプションなどが表示される。
7. libopenh264.dll が正しくリンクされているか確認
既に前の説明で気付くかもしれないが、libopenh264.dll が欠落していると
が出る。
または、libopenh264.dll 「だけ」が欠落していると、 ffmpeg が何も言わずに終了するので、それで判断することもできる。
8. H264 の動画を作る
手っ取り早く作るなら、連続した画像から作る方法がある。
ここではフリー素材を拝借してテスト。
フリー素材 (連番PNG) から 小さい雪と大きな雪 [各 5秒] を利用。
Snow(L)_00000.png のような末尾に 5 桁の数字が付与された連番の png であるため、下記のように指定。
1 | $ ffmpeg.exe -y ^ |
バッチファイルから実行する場合は、下記のように %
をエスケープする必要があるので注意。
1 | $ ffmpeg.exe -y ^ |
ちなみに、-vcodec libopenh264
をつけなくても動画を作ることはできるが、コーデックに下記のような違いが出る。
以上。