0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ffmpegビルド用configureオプション2023年末:音声のみ、m4aとwavのみ、サイズ小さく

Posted at

オプションの例

今回の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年以上は経つのですが、進化しているのを感じます。今後も色々と勉強していきたいと思っている次第です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?