Raspberry PiでFFmpegをビルドするDockerfileを作った

Raspberry Pi
Raspberry PiでDockerを使えるようにしたのでFFmpegのビルド用イメージを作ってみました。
いつでも簡単に最新のFFmpegが使えるようになります。

Raspberry PiでDockerを使えるようにしました。
関連記事:Raspberry PiにDockerをインストールする

私は1台のRaspberry Piを使いまわして遊んでいます。いろいろ異なるプログラムを動かすために複数のSDメモリーカードを用意していました。この方法だとSDメモリーカードの管理が大変なんですよね。microSDなのでメモを書くスペースもありません。
こんな時はDockerを使ってアプリケーションを切り替えると便利になります。容量大きめのSDメモリーカードにいろいろなDockerイメージを入れておいて、必要な時にコンテナを動かします。

FFmpegは最新のバージョンを試したいので自分でビルドすることが多いです。FFmpegをビルドするには多くのライブラリをインストールしなくてはならずOSの環境を汚したりドライブの空き容量をそれなりに消費したりします。
これもDockerで動かせばお気楽にビルドを試せるようになります。

Raspberry PiでFFmpegをビルドする方法は以前に紹介しました。
関連記事:Raspberry Pi 3でx264とハードウエアエンコーダが使えるFFmpegをビルドする
この手順をDockerを使って実行するようにします。

mmalはどこにあるのか?

Raspberry Pi用のFFmpegをビルドする際に気がかりなのはハードウエア支援デコーダエンコーダがちゃんと使えるかです。mmalをFFmpegへ組み込まなくてはなりませんが、RaspbianではないOSでどうやってビルドするのか良くわかりません。Raspbianだと”--enable-mmal”と書いておけば勝手に組み込まれます。mmal自体どこにあるか意識していませんでした。

mmalの所在がわからないのでRaspbian BusterのDocker用ベースイメージを作ってみました。もしかしたらmmalが使えるのでは?と思いました。ベースイメージはOSが動く最小構成にします。当然ながらmmalも消されてしまいました。イメージ容量は170MBもあり、他で使うベースイメージにもなりません。残念。

まじめにmmalについて検索するとGitHubにありました。
raspberrypi/userland
ここのinterfaceにmnalのサブディレクトリがあります。ソースファイルの場所が解ったのですがこれをどうしたら良いのでしょう?buildmeスクリプトを動かせば必要なライブラリを/optディレクトリ以下に作ってくれるようです。

Raspberry PiのDockerでFFmpegをビルドする

Dockerfileを作る

FFmpegをビルドするための環境イメージを作ります。
ベースは何を使えば良いでしょうか?イメージのファイルサイズを気にするとAlpine Linuxを使うのが良さそうですが、Raspbianで慣れ親しんだDebian系とは使い勝手が異なります。コマンドも違ってしまうのでトラブった時の対処がめんどくさいです。
ここは無難にdebianイメージを使うことにしました。Docker Official Imageなので安心して使えるでしょう。Docker Hubにはイメージの素性がわかるような情報が何もないためDocker Official Image以外は慎重に使いましょう。

ベースイメージを決めたので次は必要なライブラリを入れます。ベースイメージは何も入っていないのでビルドに必要なプログラムを全部指定して入れなくてはなりません。面倒に感じますが、これはFFmpegのドキュメントに従えば良いだけです。

FFmpegのビルド自体は別途シェルスクリプトを作りそれで実行します。

Dockerfileはこのようにしました。
FROM debian
MAINTAINER Signal Flag Z

RUN echo "now building..." \
  && echo "updating..." \
  && apt update \
  && apt upgrade -y \
  &&  echo "install libs..." \
  && apt -y install sudo autoconf automake build-essential cmake git-core libass-dev libfreetype6-dev libsdl2-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo wget zlib1g-dev \
  && apt -y install nasm yasm sudo\
  && apt -y install libx264-dev libvpx-dev \
  && apt autoremove \
  && echo "Done." \
  && apt clean
COPY ./buildFF.sh  /home

# ALSA Version
ENV V_ALSA="1.1.9"

CMD ["/bin/bash", "-c",  "/home/buildFF.sh"]
コンテナを実行すると"buildFF.sh"スクリプトが動きFFmpegのビルドを実行します。

buildFF.shスクリプト

”buildFF.sh”はコンテナ内でFFmpegをビルドするためのスクリプトです。
この記事執筆時はAlsa Libのバージョン1.1.9を使うようにしています。新しいバージョンを使うには環境変数"V_ALSA"にバージョン番号を設定します。
x264を使えるようにしています。x265及びAV1も使えるようにしてみたのですが明らかに実用速度がでないので入れていません。

スクリプトの実行が終わると/home/ffmpegにffmpeg, ffplayとffprobeが出来上がるでしょう。
#!/bin/bash
# FFmpeg build script
# Signal Flag Z

# V_ALSA="1.1.9" # ALSA Version

apt update
apt -y upgrade

echo "building x264."
cd /home
git clone git://git.videolan.org/x264.git
cd /home/x264
./configure --enable-static --enable-shared
make -j4
make install
ldconfig

cd /home
echo "building mmal."
git clone https://github.com/raspberrypi/userland.git
cd /home/userland
./buildme

cd /home
echo "building alsa."
git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg --depth 1
wget ftp://ftp.alsa-project.org/pub/lib/alsa-lib-$V_ALSA.tar.bz2
tar xjvf alsa-lib-$V_ALSA.tar.bz2
cd /home/alsa-lib-$V_ALSA
./configure --prefix=/home/ffmpeg
make -j4
make install

export LD_LIBRARY_PATH="/opt/vc/lib"
cd /home/ffmpeg
echo "building FFmpeg."
./configure --enable-gpl --enable-nonfree --enable-libx264 --enable-mmal --enable-omx-rpi --enable-omx --enable-libfreetype --enable-libfontconfig --enable-libfribidi --extra-cflags="-I/home/ffmpeg/include" --extra-ldflags="-L/home/ffmpeg/lib" --extra-libs="-ldl"
make -j4

echo "done."

Dockerfileを動かす

DockerfileとbuildFF.shを準備できたらDockerを動かします。
手順は
  1. Dockerfileでビルド用イメージを作る
  2. コンテナでbuildFF.shを動かす
  3. コンテナからffmpegを取り出す
となります。
コマンドをすぐに忘れるのでスクリプトにしました。
docker.shとします。
#!/bin/bash
# Build image and run buildFF script.
# Signal Flag Z

docker build --rm=true -t buildffbase .
docker run -it --name buildff buildffbase
# To change ALSA version.
# docker run -it --env V_ALSA=1.1.9 --name buildff buildffbase
docker cp buildff:/home/ffmpeg/ffmpeg ./
docker cp buildff:/home/ffmpeg/ffplay ./
docker cp buildff:/home/ffmpeg/ffprobe ./

Dockerfile, buildFF.shとdocker.shをRaspbianのディレクトリに作ったらdocker.shを実行します。
FFmpegビルド用イメージを"buildffbase"という名前で作ります。
”buildff"という名前のコンテナでbuildFF.shが実行されます。
できあがったffmpeg, ffplayとffprobeファイルがdocker.shのあるディレクトリに取り出されます。これらのファイルは単体で実行できますので必要なディレクトリへコピーすれば使えます。

GitHubに置いておきます

以上のファイルとスクリプトをGitHubに置いておきます。
SignalFlagZ/Dockerfiles/Rpi-build-FFmpeg
Rpi-build-FFmpegサブディレクトリが今回のファイルです。
docker.shを動かせばそのディレクトリにffmpegができあがります。

gitだとサブディレクトリだけを取ってくる事ができないみたいですね。subversionを使うとRpi-build-FFmpegディレクトリだけを取ってこれます。
svn checkout https://github.com/SignalFlagZ/Dockerfiles/trunk/Rpi-build-FFmpeg
svnが入っていない場合はsubversionを入れます。
sudo apt install subversion

エンコーダとデコーダ

ffmpeg -encoders
ffmpeg -decoders
で使えるものを表示します。
気になるエンコーダとデコーダが入っているか見てみます。
デコーダ
V..... h264_mmal            h264 (mmal) (codec h264)
 V..... mpeg2_mmal           mpeg2 (mmal) (codec mpeg2video)
 V..... mpeg4_mmal           mpeg4 (mmal) (codec mpeg4)
 V..... vc1_mmal             vc1 (mmal) (codec vc1)
エンコーダ
V..... libx264              libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (codec h264)
 V..... libx264rgb           libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 RGB (codec h264)
 V..... h264_omx             OpenMAX IL H.264 video encoder (codec h264)

まとめ

Raspberry PiでFFmpegをビルドするDockerfileを作りました。これで最新のFFmpegを簡単気楽にビルドできます。

このスクリプトではnon-freeのライブラリを含むFFmpegが出来上がります。個人的に使いましょう。あるいはbuildFF.shのconfigure文を変えてください。

docker.shの実行時間はRaspberry Pi 3 Bで1時間半弱でした。

最新のFFmpegが必要な理由はあまりないのは内緒です。

コメント

最近のコメント

Threaded Recent Comments will be here.