🚲
目的に適したスリムなffmpegをビルドする
ffmpegは十徳ナイフのようにいろいろなものが入っていて便利です。
一方で、必要のないものをどこまで削ることができるかというのは物事の本質に迫ることでもあります。
というわけで、さきほどの記事で使用する機能に特化したスリムなffmpegをビルドしてみました。
configure
に与える引数を調整するわけですが、削りすぎると動作しません。それを調べる過程でソースコードを追いかけることになるので勉強になります。
試行錯誤の末の結果がこれです。
conf_small_srt.sh
./configure --prefix=/usr/local --extra-version=small-srt --toolchain=hardened \
--libdir=/usr/lib/aarch64-linux-gnu \
--incdir=/usr/include/aarch64-linux-gnu --arch=arm64 --enable-gpl \
--enable-static --disable-shared --disable-doc --disable-everything \
--enable-ffmpeg --disable-ffplay --disable-ffprobe \
--disable-autodetect --disable-swscale --disable-swresample \
--enable-demuxer=h264,hevc --enable-muxer=mpegts --enable-parser=h264,hevc \
--enable-protocol=file,libsrt --enable-libsrt
ビルド
# sh conf_small_srt.sh
# make
インストール
$ sudo cp ffmpeg /usr/local/bin/ffmpeg-small-srt
$ ffmpeg-small-srt -version
ffmpeg version 5.0.1-small-srt Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 7 (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04)
configuration: --prefix=/usr/local --extra-version=small-srt --toolchain=hardened --libdir=/usr/lib/aarch64-linux-gnu --incdir=/usr/include/aarch64-linux-gnu --arch=arm64 --enable-gpl --enable-static --disable-shared --disable-doc --disable-everything --enable-ffmpeg --disable-ffplay --disable-ffprobe --disable-autodetect --disable-swscale --disable-swresample --enable-demuxer='h264,hevc' --enable-muxer=mpegts --enable-parser='h264,hevc' --enable-protocol='file,libsrt' --enable-libsrt
libavutil 57. 17.100 / 57. 17.100
libavcodec 59. 18.100 / 59. 18.100
libavformat 59. 16.100 / 59. 16.100
libavdevice 59. 4.100 / 59. 4.100
libavfilter 8. 24.100 / 8. 24.100
libpostproc 56. 3.100 / 56. 3.100
実行ファイルの大きさの比較。
$ ls -l /usr/local/bin/ffmpeg*
-rwxr-xr-x 1 root root 19840304 5月 25 00:37 /usr/local/bin/ffmpeg
-rwxr-xr-x 1 root root 2006112 5月 25 14:45 /usr/local/bin/ffmpeg-small-srt
依存するライブラリはこれだけ。
$ ldd /usr/local/bin/ffmpeg-small-srt
linux-vdso.so.1 (0x0000007fb48cc000)
libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000007fb45ba000)
libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000007fb458e000)
libstdc++.so.6 => /usr/lib/aarch64-linux-gnu/libstdc++.so.6 (0x0000007fb43fa000)
libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x0000007fb43d6000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000007fb427d000)
/lib/ld-linux-aarch64.so.1 (0x0000007fb48a0000)
libcrypto.so.1.1 => /usr/lib/aarch64-linux-gnu/libcrypto.so.1.1 (0x0000007fb403c000)
libdl.so.2 => /lib/aarch64-linux-gnu/libdl.so.2 (0x0000007fb4027000)
Discussion