🚲

目的に適したスリムなffmpegをビルドする

2022/05/25に公開

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