📌

docker環境でSRTを有効にしてffmpeg 5.0.xをビルドする

2022/05/20に公開

Oracle Cloudのarm64のubuntu 20.04 を使用しています。
新しいバージョンのffmpegをビルドします。
ビルドするときにさまざまな開発用パッケージが必要になるのですが、今回はそれをdocker環境の中でやって、日常の環境に余計なものをインストールしないようにしてみました。

デフォルトのffmpegのコンフィグを確認

$ /usr/bin/ffmpeg -version
ffmpeg version 4.2.4-1ubuntu0.1 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-10ubuntu2)
configuration: --prefix=/usr --extra-version=1ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/aarch64-linux-gnu --incdir=/usr/include/aarch64-linux-gnu --arch=arm64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
libavutil      56. 31.100 / 56. 31.100
libavcodec     58. 54.100 / 58. 54.100
libavformat    58. 29.100 / 58. 29.100
libavdevice    58.  8.100 / 58.  8.100
libavfilter     7. 57.100 /  7. 57.100
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  5.100 /  5.  5.100
libswresample   3.  5.100 /  3.  5.100
libpostproc    55.  5.100 / 55.  5.100

(横スクロールして見てください)

ffmpegのソースコードを入手して、最近のリリースタグでチェックアウトする

$ git clone https://git.ffmpeg.org/ffmpeg.git
$ cd ffmpeg
$ git tag

  ...
  
n4.5-dev
n5.0
n5.0.1
n5.1-dev
v0.5
v0.5.1
v0.5.2
v0.5.3
v0.6
v0.6.1
$ git checkout -b w5.0.1 n5.0.1

docker環境の生成

ffmpegのソースコードを展開したカレントディレクトリをdocker環境内にマウントします。

$ docker run -it -v $PWD:/root/ffmpeg ubuntu:20.04 /bin/bash

docker環境内でビルド

# cd /root/ffmpeg/
# apt update
# apt upgrade
# apt install vim
# vi /etc/apt/sources.list
# apt update
# apt build-dep ffmpeg
# apt install libsrt-dev libssl-dev
# sh conf.sh

/etc/apt/sources.listの変更に関してはこちらを参照。
https://qiita.com/tetsu_koba/items/904b03e908b040ed447d

./configure を何度か試すので、conf.shに書き出しました。
ffmpeg関連のライブラリはスタティックリンクしたいので--disable-shared --enable-static
SRTのプロトコルを使いたいので --enable-libsrt
ffmpeg 4.2.4 -> 5.0.1 で削除されたり、コンフィグ時にエラーになったオプションを削除しています。

conf.sh
./configure --prefix=/usr/local --extra-version=1ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/aarch64-linux-gnu --incdir=/usr/include/aarch64-linux-gnu --arch=arm64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --disable-shared --enable-static --enable-libsrt

#--enable-avresample
#--enable-libwavpack
#--enable-libwebp
#--enable-avisynth
#--disable-filter=resample

(横スクロールして見てください)

# make -j`nproc`

無事にビルドが完了したら、docker環境から抜けます。

# exit

ビルド環境の保存

後日修正してビルドしたくなったときのために終了したコンテナをcommitしておきます。

$ docker ps -a
CONTAINER ID   IMAGE                                       COMMAND       CREATED             STATUS                      PORTS                                       NAMES
1293d119b64c   ubuntu:20.04                                "/bin/bash"   About an hour ago   Exited (0) 10 seconds ago  
$ docker commit 1293d119b64c ffmpeg_build
$ docker images
REPOSITORY                            TAG             IMAGE ID       CREATED          SIZE
ffmpeg_build                          latest          1ade1c126fcd   33 seconds ago   1.12GB

続きをするには以下のようにします。

$ docker run -it -v $PWD:/root/ffmpeg ffmpeg_build /bin/bash

インストール

実行ファイルだけを/usr/local/binにコピーし、新しいものが使用されるようにhashを再作成します。

$ sudo cp ffmpeg ffprobe ffplay /usr/local/bin
$ type ffmpeg
ffmpeg is hashed (/usr/local/bin/ffmpeg)
$ hash -r
$ type ffmpeg
ffmpeg is /usr/local/bin/ffmpeg

バージョンの確認。

$ ffmpeg -version
ffmpeg version 5.0.1-1ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
configuration: --prefix=/usr/local --extra-version=1ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/aarch64-linux-gnu --incdir=/usr/include/aarch64-linux-gnu --arch=arm64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --disable-shared --enable-static --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
libswscale      6.  4.100 /  6.  4.100
libswresample   4.  3.100 /  4.  3.100
libpostproc    56.  3.100 / 56.  3.100

SRTのプロトコルが入っていることを確認。

$ ffmpeg -protocols 2>/dev/null |grep srt
  srtp
  srt
  srtp
  srt

関連

https://zenn.dev/tetsu_koba/articles/a3a5343a3a1f0d

Discussion