🌊

SRTの入ったラズパイ用ffmpegをdockerでクロスビルドする

2022/06/15に公開

RaspberryPi OS armhf のdockerイメージの作成

officialなdockerイメージが見つからなかったので、以下のページを参考にして自分で作りました。

https://zenn.dev/pinto0309/articles/2e6483a2452c8f

x86_64の仮想マシン上で

$ sudo apt install qemu-user-static

ラズパイのrootfsをダウンロードして、そこからdockerイメージを作成。

$ mkdir raspios_lite_armhf
$ cd raspios_lite_armhf/
$ wget https://downloads.raspberrypi.org/raspios_lite_armhf/root.tar.xz
$ docker image import root.tar.xz koba/raspios_lite_armhf:bullseye
$ docker images |head -n 2
REPOSITORY                TAG        IMAGE ID       CREATED          SIZE
koba/raspios_lite_armhf   bullseye   01cc763cbd22   20 seconds ago   1.16GB

uname でアーキテクチャがarmv7であることを確認する。

$ docker run --rm -it koba/raspios_lite_armhf:bullseye uname -a
Linux a37097e5727f 5.13.0-1028-oracle #33~20.04.1-Ubuntu SMP Mon May 2 03:53:18 UTC 2022 armv7l GNU/Linux

dockerコンテナ内でビルド

成果物をコピーするためにカレントディレクトリを/mntにマウントして、コンテナ内に入る。

$ docker run -it -v $PWD:/mnt koba/raspios_lite_armhf:bullseye bash

まずSRTのスタティックリンクライブラリをビルド。

# cd /root
# apt update; apt upgrade -y
# apt install -y git tclsh pkg-config cmake libssl-dev build-essential
# git clone https://github.com/Haivision/srt.git
# cd srt/
# git checkout -b w1.4.4 v1.4.4
# ./configure --disable-shared
# make -j`nproc`
# make install
# vi /usr/local/lib/arm-linux-gnueabihf/pkgconfig/srt.pc 

ffmpegのconfigureでエラーになるので、srt.pcを以下のように修正する。

--- srt.pc.org	2022-06-15 02:53:44.710927553 +0100
+++ srt.pc	2022-06-15 02:54:01.971116779 +0100
@@ -6,7 +6,8 @@
 Name: srt
 Description: SRT library set
 Version: 1.4.4
-Libs: -L${libdir} -lsrt   
+Libs: -L${libdir} -lsrt -lpthread -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc -latomic
+Requires: openssl libcrypto
 Libs.private:  -lpthread -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
 Cflags: -I${includedir} -I${includedir}/srt
 Requires.private: openssl libcrypto

ffmpegのビルド。

# cd /root/
# git clone https://git.ffmpeg.org/ffmpeg.git
# cd ffmpeg/
# git tag
# git checkout -b w5.0.1 n5.0.1
# vi /etc/apt/sources.list
# vi /etc/apt/sourece.list.d/raspi.list 

それぞれ deb-srcの行をアンコメント。

# apt update
# apt build-dep ffmpeg

./configureのオプションは以下の通り。

conf.sh
./configure --prefix=/usr/local --extra-version=with_libsrt --toolchain=hardened --incdir=/usr/include/arm-linux-gnueabihf --enable-gpl --enable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --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-librabbitmq --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --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-mmal --enable-neon --enable-pocketsphinx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-libsrt --disable-shared --libdir=/usr/lib/arm-linux-gnueabihf --cpu=arm1176jzf-s --arch=arm

# --enable-avresample 
# --enable-libwavpack 
# --enable-rpi
# --enable-v4l2-request
# --enable-libudev 
# --enable-epoxy 
# --enable-vout-drm 
# --disable-filter=resample 

ビルドして、成果物を /mnt/ にコピー。

# sh conf.sh 
# make -j`nproc`
# cp ffmpeg ffprobe ffplay /mnt/
# exit

修正ビルドをするときのためにコンテナをcommit しておく。

$ docker ps -a |head -n 2
CONTAINER ID   IMAGE                              COMMAND   CREATED       STATUS                      PORTS     NAMES
6aa2b2e42db6   koba/raspios_lite_armhf:bullseye   "bash"    5 hours ago   Exited (0) 38 seconds ago             tender_bartik
$ docker commit 6aa2b2e42db6 koba/raspi_armhf_ffmpeg

ラズパイで動作確認

ビルドできたffmpeg, ffplay, ffprobe をラズパイの/usr/local/bin にコピーする。

$ ffmpeg -version
ffmpeg version n5.0.1-with_libsrt Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 10 (Raspbian 10.2.1-6+rpi1)
configuration: --prefix=/usr/local --extra-version=with_libsrt --toolchain=hardened --incdir=/usr/include/arm-linux-gnueabihf --enable-gpl --enable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --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-librabbitmq --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --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-mmal --enable-neon --enable-pocketsphinx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-libsrt --disable-shared --libdir=/usr/lib/arm-linux-gnueabihf --cpu=arm1176jzf-s --arch=arm
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/76f4e20cc8166f
https://zenn.dev/tetsu_koba/articles/b9545eb0231d7e

Discussion