Raspberry Pi 3でx264とハードウエアエンコーダが使えるFFmpegをビルドする

以前の記事ではRaspberry Pi 3でハードウエアエンコーダが使えるFFmpegをビルドしました。今回はx264も使えるようにしてみます。
できるだけ最新のバージョンで試しています。

以前にRaspberry Pi 3でFFmpegのビルド方法を紹介していました。
Raspberry Pi 3のRaspbianでFFmpeg n3.2.4をビルドする
これまでx264は含めていませんでした。
Raspberry Pi 3ではエンコードが遅いので使う人も少ないだろうし、ファイルサイズも大きくなるので省いていました。ですがx264を使う方が意外と多そうです。常用しなくともパソコンとのベンチマーク比較にx264を動かしたい方もいるでしょう。

今回はx264を含めてFFmpegをコンパイルする手順を書いてみます。

OSバージョンの確認

OSはRaspbianを使います。この記事公開時での最新イメージを使っています。
RASPBIAN JESSIE WITH PIXEL Version:April 2017 です。

Raspbianのパッケージの更新をします。
sudo apt-get -y update
sudo apt-get -y upgrade
sudo reboot

Raspbianのバージョンを確認します。
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.9.24-v7+ #993 SMP Wed Apr 26 18:01:23 BST 2017 armv7l GNU/Linux
カーネルバージョンが4.4から4.9へ更新されました。

FFmpegのビルド

改めて最初からFFmpegのビルド手順を書いてみます。
作業は~/Downloadsディレクトリで行います
ffplayが使えるようにします。
drawtextフィルタも入れます。エンコード時に画面に文字を入れるのに使います。

FFmpegで必要なパッケージのインストール

ビルドに必要なパッケージをインストールします。
sudo apt-get install -y libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev libsdl2-mixer-dev
sudo apt-get install -y libfontconfig1-dev libfribidi-dev

x264のコンパイルとインストール

x264のバイナリパッケージは無いので自分でビルドします。
ビルド手順はこちらにあります。
FFmpeg wiki: CompilationGuide/Quick/libx264
手順に従ってやってみます。
ソースコードはDownloadsディレクトリに保存することにします。
cd ~/Downloads
ソースコードを取ってきます。
git clone git://git.videolan.org/x264.git
ソースコートのディレクトリへ移動します。
cd x264
ビルドします。
./configure --enable-static --enable-shared
make
sudo make install
5分もかからずに終わるでしょう。
共有ライブラリが増えたことをOSに教えます。
sudo ldconfig

これでx264を使う準備ができました。

FFmpegのソースを取得する

cd ~/Downloads
git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg

ALSAライブラリをビルドする

ALSAライブラリの最新バージョンをホームページ(https://www.alsa-project.org/main/index.php/Main_Page)で確認します。Alsa Project Newsのところに書いてあります。
この記事の公開時ではv1.1.4が最新のようです。異なる場合は読み替えてください。
cd ~/Downloads
wget ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.1.4.tar.bz2
tar xjvf alsa-lib-1.1.4.tar.bz2

ALSAライブラリのビルド

ALSAライブラリをビルドします。
ソースコードのディレクトリへ移動します。取得したバージョンによっては読み替えてください。
ffmpegのソースディレクトリにインストールしますので、異なるディレクトリの場合は読み替えてください。
cd alsa-lib-1.1.4
./configure --prefix=/home/pi/Downloads/ffmpeg
make
make install
cd ..
5分ほどで終わるでしょう。

FFmpegのビルド

先ほどソースを取得したディレクトリへ移動します。
cd ~/Downloads/ffmpeg
使用できるバージョンの確認をします。FFmpegではタグでリリースバージョンの指定ができます。タグの一覧を見てみます。
git tag -l
この記事公開時のリリース文ではn3.3の案内が最新です。タグを見るとn3.3.1がありました。これを使ってみます。
git checkout refs/tags/n3.3.1
このコマンドを実行しなければmasterブランチが使われ最新コードのビルドができますが、開発中の不具合があるのでタグ付けされたバージョンでビルドするのが良いと思います。

ビルド条件の設定

x264を使う指定を追加します。"--enable-libx264"を追加します。
./configure --enable-gpl --enable-nonfree --enable-libx264 --enable-mmal --enable-omx-rpi --enable-omx --enable-libfreetype --enable-libfontconfig --enable-libfribidi --extra-cflags="-I/home/pi/Downloads/ffmpeg/include" --extra-ldflags="-L/home/pi/Downloads/ffmpeg/lib" --extra-libs=-ldl
この例では、x264とRaspberry Piのハードウエアエンコーダh264_omxを使えるようにしています。
1分ほどすると設定したビルド条件が表示されます。エラーで表示されない場合は必要なパッケージが入っているか再確認します。

ビルド条件に自分の思ったものが含まれているか確認します。
例えば、指定したライブラリを認識しているか?
External libraries:
iconv                      libx264                    sdl
libfontconfig              libxcb                     sdl2
libfreetype                libxcb_shape               xlib
libfribidi                 libxcb_xfixes              zlib
ハードウエアエンコーダがあるか?
External libraries providing hardware acceleration:
mmal                       omx
Enabled hwaccels:
h264_mmal                  mpeg4_mmal                 vc1_mmal
mpeg2_mmal
ffplayはあるか?
Programs:
ffmpeg                     ffprobe                    ffserver
ffplay
x264はあるか?
Enabled encoders:
…
h264_omx
…
libx264
libx264rgb
…
この確認ができたらコンパイルしましょう。

ビルドとインストール

ビルドします。
make -j4
30分ほどかかります。
インストールします。
sudo make install

バージョンの確認

pi@raspberrypi:~ $ ffmpeg -version
ffmpeg version n3.3.1 Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 4.9.2 (Raspbian 4.9.2-10)
configuration: --enable-gpl --enable-nonfree --enable-libx264 --enable-mmal --enable-omx-rpi --enable-omx --enable-libfreetype --enable-libfontconfig --enable-libfribidi --extra-cflags=-I/home/pi/Downloads/ffmpeg/include --extra-ldflags=-L/home/pi/Downloads/ffmpeg/lib --extra-libs=-ldl
libavutil      55. 58.100 / 55. 58.100
libavcodec     57. 89.100 / 57. 89.100
libavformat    57. 71.100 / 57. 71.100
libavdevice    57.  6.100 / 57.  6.100
libavfilter     6. 82.100 /  6. 82.100
libswscale      4.  6.100 /  4.  6.100
libswresample   2.  7.100 /  2.  7.100
libpostproc    54.  5.100 / 54.  5.100

以上でFFmpegが使えるようになりました。

参考

本当に動くか試しにエンコードしてみました。
1440x1080 30fpsの動画を次のコマンドでエンコードしてみます。
ffmpeg -i test.ts -c:v libx264 -q 26 -c:a:0 aac  -map 0:0 -map 0:1 -f matroska test.mkv
これで変換速度は2.6~3fps程度でした。すべてのコアが100%近く動いてます。
htop
1  [|||||||||||||||||||||||||95.3%]     Tasks: 81, 95 thr; 8 running
2  [|||||||||||||||||||||||||94.4%]     Load average: 5.65 3.35 1.77
3  [|||||||||||||||||||||||||98.1%]     Uptime: 00:32:39
4  [|||||||||||||||||||||||||95.3%]
Mem[|||||||||||||||||||||531/733MB]
Swp[||                      4/99MB]

同じ動画、同じコマンドをパソコンでやってみます。パソコンのCPUはもう古いi7-2600Kです。
クロックは約3.57GHzで動いていました。これで約42fpsでした。
ほぼ1/15の速度でした。意外と差が無い?
ゆっくりとエンコードする目的ならありえなくはないですが、実時間の10倍ですから使い道は限られますね。

コメント

最近のコメント

Threaded Recent Comments will be here.