オプションの例
今回のffmegビルドの要件
- m4aとwavファイル程度しか処理しない
- 音質はこだわらない
- 実行ファイルをできるだけ小さくしたい
- windows用
- ubuntuでビルド
この要件を満たすオプションが以下です。
./configure \
--arch=x86_64 \
--target-os=mingw64 \
--cross-prefix=x86_64-w64-mingw32- \
--enable-cross-compile \
--enable-static \
--disable-everything \
--disable-network \
--enable-autodetect \
--disable-debug \
--disable-ffprobe \
--enable-gpl \
--enable-version3 \
--disable-libfdk-aac \
--disable-libmp3lame \
--enable-ffmpeg \
--enable-decoder=aac*,mp3,ac3*,pcm*,wav,3g*,m4*,mj2,mov \
--enable-encoder=aac,flac,mp3,wav,mp4,pcm* \
--enable-parser=mpegaudio \
--enable-demuxer=aac*,mp3,ac3*,pcm*,wav,mp4,m4a,3g*,m4*,mj2,mov \
--enable-muxer=aac,ipod,flac,mp3,wav,mp4,pcm* \
--enable-filter=aresample \
--enable-protocol=file
生成されたffmpeg.exeは3.5MB程度。まだ無駄があるかもしれませんが。
なお、windows用のオプションは次の部分です。これを省けば、自機向けバイナリになります。
--arch=x86_64 \
--target-os=mingw64 \
--cross-prefix=x86_64-w64-mingw32- \
--enable-cross-compile \
雑感
この記事の目的は個人的なメモです。すみません。
同じことを考えている人はあまりいらっしゃらないかなと思っています。
今回は、デコードはmp3,mp4,wavを受け付けるようにし、エンコードはm4a,wavぐらいで良いので、できるだけ小さいサイズのffmpegバイナリを作りたいと考えました。
とにかく、ffmpegは万能で、これ一つで何でもできる。しかも、使っていて勉強にもなる。
だけど、実行ファイルが巨大で120MBにもなったりするし、オプションを少し入れたバイナリは20MB程度。そして、--disable-everything
を入れたバイナリは2MB程度。
ということで、ffmpegのサイズ下限は2MBなのだろうと思います。--disable-everything
を入れなければ、20MB程度ですが、エンコードができないバイナリでした。--disable-everything
ではない場合は何を入れているのか?が未だ疑問です。
ffmpegのビルドコンフィグには膨大なオプションがあります。案内は次で表示されるようです。
./configure --help
ただ、これを読んでも、私には目的を果たすオプションが判りませんでした。 chatGPTやBardにも聞いてみたのですが、目的のものズバリは答えてくれませんでした。(2023.12/8現在)
試行錯誤の方法を示すと、次のおとりです。
- 最終的にはクロスですが、まずは自機用にビルド
- コンフィグのオプションを変える
- make
- 実行でエラーが出ないかを確認
次の1行を書いて実行してました。
./configure (例のオプション) && make -j8 && ./ffmpeg -i in.mp3 -ar 16000 -ac 1 -c:a pcm_s16le out.wav && ./ffmpeg -i out.wav out.m4a
生成されたバイナリの実行は、次の2通りを行いました。
- mp3 → wav
- wav → m4a
最初は、mp3を読めないというエラーがほとんどでした。そのエラーが出なくなるためのオプションを思い着く限り書いて実行を繰り返します。成功したら本当に音声になっているかをチェックします。その後、wavに変換できないというエラー、m4aに変換出来ないというエラーに対してトライアンドエラーを繰り返しました。
本当は、mp3へのエンコードも試していたのですが、結局1日ではたどりつけず断念しました。きっと、mp3エンコードは--enable-libmp3lame
するのが最も楽な方法だろうと思います。m4aの高音質化についても--enable-libfdk-aac
だろうと思います。lameやfdk-aacは、それぞれクロスコンパイルして、生成された静的ライブラリをリンクさせてあげるとできるようです。なぜ、それをしなかったかというと、lameを使わなくてもmp3はデコードできるし、fdk-aacを使わなくてもm4aのデコードエンコードができるし、音質にはこだわらないためです。
勘の良い方はwavへの変換オプションを読んで気付くかもしれませんが、今回のffmpegは、ボイスレコーダを対象としており、某cppな音声認識ソフトに入れるための前処理用です。そちらのソースコードに手を入れることも考えたのですが、ffmpegを外部実行する方が早く目的に到達できると考えました。
ffmpegは使い始めて10年以上は経つのですが、進化しているのを感じます。今後も色々と勉強していきたいと思っている次第です。