Raspberry PiでFFmpegをビルドするDockerfileを作った
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の所在がわからないのでRaspbian BusterのDocker用ベースイメージを作ってみました。もしかしたらmmalが使えるのでは?と思いました。ベースイメージはOSが動く最小構成にします。当然ながらmmalも消されてしまいました。イメージ容量は170MBもあり、他で使うベースイメージにもなりません。残念。
まじめにmmalについて検索するとGitHubにありました。
ベースは何を使えば良いでしょうか?イメージのファイルサイズを気にするとAlpine Linuxを使うのが良さそうですが、Raspbianで慣れ親しんだDebian系とは使い勝手が異なります。コマンドも違ってしまうのでトラブった時の対処がめんどくさいです。
ここは無難にdebianイメージを使うことにしました。Docker Official Imageなので安心して使えるでしょう。Docker Hubにはイメージの素性がわかるような情報が何もないためDocker Official Image以外は慎重に使いましょう。
ベースイメージを決めたので次は必要なライブラリを入れます。ベースイメージは何も入っていないのでビルドに必要なプログラムを全部指定して入れなくてはなりません。面倒に感じますが、これはFFmpegのドキュメントに従えば良いだけです。
FFmpegのビルド自体は別途シェルスクリプトを作りそれで実行します。
Dockerfileはこのようにしました。
この記事執筆時はAlsa Libのバージョン1.1.9を使うようにしています。新しいバージョンを使うには環境変数"V_ALSA"にバージョン番号を設定します。
x264を使えるようにしています。x265及びAV1も使えるようにしてみたのですが明らかに実用速度がでないので入れていません。
スクリプトの実行が終わると/home/ffmpegにffmpeg, ffplayとffprobeが出来上がるでしょう。
手順は
コマンドをすぐに忘れるのでスクリプトにしました。
docker.shとします。
Dockerfile, buildFF.shとdocker.shをRaspbianのディレクトリに作ったらdocker.shを実行します。
FFmpegビルド用イメージを"buildffbase"という名前で作ります。
”buildff"という名前のコンテナでbuildFF.shが実行されます。
できあがったffmpeg, ffplayとffprobeファイルがdocker.shのあるディレクトリに取り出されます。これらのファイルは単体で実行できますので必要なディレクトリへコピーすれば使えます。
docker.shを動かせばそのディレクトリにffmpegができあがります。
gitだとサブディレクトリだけを取ってくる事ができないみたいですね。subversionを使うとRpi-build-FFmpegディレクトリだけを取ってこれます。
気になるエンコーダとデコーダが入っているか見てみます。
デコーダ
このスクリプトではnon-freeのライブラリを含むFFmpegが出来上がります。個人的に使いましょう。あるいはbuildFF.shのconfigure文を変えてください。
docker.shの実行時間はRaspberry Pi 3 Bで1時間半弱でした。
最新の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を動かします。手順は
- Dockerfileでビルド用イメージを作る
- コンテナでbuildFF.shを動かす
- コンテナから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-FFmpegRpi-build-FFmpegサブディレクトリが今回のファイルです。
docker.shを動かせばそのディレクトリにffmpegができあがります。
gitだとサブディレクトリだけを取ってくる事ができないみたいですね。subversionを使うとRpi-build-FFmpegディレクトリだけを取ってこれます。
svn checkout https://github.com/SignalFlagZ/Dockerfiles/trunk/Rpi-build-FFmpegsvnが入っていない場合は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が必要な理由はあまりないのは内緒です。
コメント
コメントを投稿