Rapberry Pi 3 のハードウエアエンコーダh264_omxが使えるFFmpegをビルドする

Raspberry Pi 3でハードウエアエンコードh264_omxが使えるFFmpegをビルドしてみます。
どうすればよいのでしょう?
まずは必要最低限、h264_omxが使えることだけを目標にしてみます。




【2017/5/22:追記
より新しいFFmpeg n3.3.1のインストール手順はこちら
Raspberry Pi 3でx264とハードウエアエンコーダが使えるFFmpegをビルドする 】

Raspberry PiでFFmpegハードウエアエンコードをしたい

FFmpegのバージョン 3.1からRaspberry Piのハードウエアアクセラレーションに対応しました。

News FFmpeg
June 27th, 2016, FFmpeg 3.1 "Laplace"
"Generic OpenMAX IL encoder with support for Raspberry Pi"
LinuxだとほぼLibavの事になるんでしょうか。LibavとFFmpegの区別があいまいです。リポジトリにはハードウエアアクセラレーションが使えるavconvもffmpegもないようです。

avconvはwindowsユーザに馴染みがないので、
ここはFFmpegをビルドしてみる事にします。ところで、どうやってやるんでしょうか?

FFmpeg WikiのFFmpeg Compilation Guideを見てみましょう。

RaspberryPi /CompilationGuide
"Compiling directly on RPi (running on Raspbian) is possible and some people do it that way, but since its hardware is very limited, this is not recommended for anything as big as FFmpeg (it took me 9 hours to compile the basic FFmpeg this way, without any additional libraries). "
Raspberry Pi上でコンパイルするのはお薦めしないよ。やってみたら9時間かかったよ、クロスコンパイルした方がいいんじゃない、という感じです。
まぁ、Raspberry Pi 3はパワーアップしたし、普段使う事もないし、消費電力も少ないのでRaspberry Pi上でコンパイルしましょう。
(クロスコンパイル環境つくる方がめんどくさい・・・)

Raspbianの環境を整える

私はLinuxに不慣れです。ffmpegのコンパイルをするのですがライブラリなどのファイルがどこに置かれるか良くわかっていません。
一度入れたライブラリが不要だと思って削除しても本当に削除されたのわかりません。
少しでも再現性のある手順を書きたいのでOSのインストールから書いてみます。すぐに忘れちゃうし・・・
OSの初期化が手軽に早くできるRaspberry Piは便利です。

Raspbianの初期設定

OSはRaspbianを使います。
今回私が使ったイメージは
2016-05-27-raspbian-jessie.img
です。

SSHでパソコンからターミナルを接続します。

起動したらローカリゼーションやらをします。日本語入力の設定とかです。やり方はググればいくらでもあるので他のサイト様にお任せです。

sambaの設定

Windowsと簡単にファイルのやり取りができるようにsambaをインストールします。
これも他のブログにお任せ。"raspberry samba"でググればいいでしょう。
smb.conf を編集して共有フォルダを指定します。少し行数が多くターミナルで編集するのは面倒です。X-Windowかリモートデスクトップで作業しているならターミナルから
sudo leafpad /etc/samba/smb.conf
と入れればGUIのエディタで編集できます。

smbpasswdでsamba用ユーザを登録するのを忘れないようにします。

これでOSの準備はおしまい。いよいよFFmpegのコンパイルをしたいと思います。

Raspberry Pi 3でFFmpegのコンパイルをする

それではRaspbianj 上でFFmpegのコンパイルを行います。
先に紹介したページはクロスコンパイルを前提としているので若干異なる点もありますが基本的な流れは同じです。
手順としては

  1. FFmpegのソースファイルの入手
  2. ライブラリのソースファイルの入手
  3. ライブラリのビルド・インストール
  4. FFmpegのビルド・インストール

のこれだけ。

FFmpegのコンパイルが面倒なのは必要なライブラリを集めてコンパイルと、ライブラリを使う設定を正しく行うところでしょうか。数多くのライブラリを使う事ができるので、いざ自分でコンパイルするときに何が必要かわからなくなってしまいます。

最近のFFmpegは音声のAACに正式対応しました。そのためAAC用のライブラリを入れる必要は無くなりました。
パソコンならx264を使いたいところです。ですがRaspberry Piでx264なんてCPUパワーが足りず実用的ではありません。ベンチマークで試したいくらいですから、入れる必要はないでしょう。

USBカメラにマイクが付いています。マイクの音声もエンコードして録音をしたいです。このためにALSAライブラリを使います。

Raspberry Piでハードウエアエンコードを試すのが今回の目的です。OpenMAX ILとやらはどうやって指定すればよいのでしょうか?はっきり書いてある情報が見つかりません。ソースはRaspbianに入ってるみたいですけど。

ということで今回はALSAライブラリを追加で入れるだけにします。

WindowsユーザーにとってLinuxのディレクト構成はとても分かりずらいと思います。今回の作業はディレクトリ決め打ちで紹介していきます。判っている方はお好きに読み替えてください。

まず作業するフォルダを決めましょう。ホームディレクトリは /home/pi となっています。
今回はホームディレクトリで作業をしてしまいます。

FFmpegのソースを入手する


ホームディレクトリに移動してFFmpegのソースファイルを入手します。

cd /home/pi
git clone git://source.ffmpeg.org/ffmpeg.git

ホームディレクトリにffmpegというディレクトリができ、この中にソースファイルが展開されました。

ALSA libraryのコンパイルとインストール

Advanced Linux Sound Architecture (ALSA) project homepage
The Advanced Linux Sound Architecture (ALSA) provides audio and MIDI functionality to the Linux operating system.
ALSAのソースコードを入手します。ALSAプロジェクトのホームページのダウンロードページから入手します。使うのはalsa-libです。
この記事を書いた時の最新版を使います。1.1.2になります。

ビルド結果は/home/pi/ffmpegに作ります。ディレクトリはありますね?
それではコマンドを順次入れます。

ソースをダウンロードします。

cd /home/pi
wget ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.1.2.tar.bz2

ホームディレクトリにファイルがダウンロードされました。入手したファイルを展開します。

tar xjvf alsa-lib-1.1.2.tar.bz2

alsa-lib-1.1.2というディレクトリにファイルが展開されました。

展開したフォルダへ移動します。

cd alsa-lib-1.1.2

コンパイラにコンパイル条件を教えます。コンパイル結果は後でFFmpegのコンパイル時に使うので/home/pi/ffmpegに作ります。

./configure --prefix=/home/pi/ffmpeg

それではコンパイルします。

make
make install

これでライブラリの準備ができました。

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

先ほどFFmpegをダウンロードしたフォルダで作業します。

【2016/12/05 追記:
ffplayもビルドするには
Raspberry Pi 3でffplayをビルドする
で紹介しますようにSDL2をインストールします。


コンパイルの条件を設定します。
FFmpegのコンパイルでは最も重要なところです。ここでFFmpegで使うライブラリを決めます。
Raspberry Piのハードウエアエンコードを可能にするには
--enable-mmal --enable-omx-rpi --enable-omx
を指定すればよいようです。
コンパイルしたALSAライブラリの場所も指定します。

それではやってみます。

cd /home/pi/ffmpeg
./configure  --enable-gpl  --enable-nonfree --enable-mmal --enable-omx-rpi --enable-omx --extra-cflags="-I/home/pi/ffmpeg/include" --extra-ldflags="-L/home/pi/ffmpeg/lib" --extra-libs=-ldl

正しく動けばずらずらと使えるエンコーダ・デコーダの一覧が出てきます。エンコーダにh264_omxがあることを確認します。
それではコンパイルします。せっかくのマルチコアなのでオプションを付けてみます。

make -j4

さてコンパイル時間はどのくらいかかるでしょうか。オーバークロックはしていません。
30分ほどでコンパイルが終わりました。ライブラリが少ないので速かったです。
インストールします。

sudo make install

これでffmpegコマンドが動けば成功です。

FFmpegを動かしてみる

早速使ってみましょう。まずはビデオファイルを変換するのがいいですね。お手持ちのビデオファイルをRaspberry Piのホームディレクトリにコピーしましょう。sambaが動いてれば簡単ですね。
元のビデオファイルをsample.mpgとしてout.mkvとして変換してみます。h.264ハードウエアエンコードをしてみます。コーデックにh264_omxを指定します。

ffmpeg -i sample.mpg -c:v h264_omx -c:a aac -f matroska out.mkv

無事動いたでしょうか?

フルHDのビデオで20fpsを超えるくらいのスピードでしょうか。リアルタイムに少し足りない感じです。
出来上がたあビデオを見てみます。sambaをインストールしていればWindows PCで開いてみましょう。さぁ、・・・ん?・・・汚い!
デフォルトだとひどい画質です。
h264_omxのオプションには何が指定できるのでしょうか?情報が無いんだけど。

h264なので品質指定かと思ってx264に倣ったオプションを指定するも動きません。qscaleはエラーこそ出ませんが何の変化も見られず。
ビットレート指定は変化がありました。
-b:v 1000k
とか指定すると画質が変わります。
h.264なのにビットレート指定なの?HD解像度で4Mを指定すると見られる感じです。

まとめ

とりあえず動くFFmpegはできたようです。ALSAライブラリを含め、1時間でコンパイルできました。
ビルドについては、スタティックにしたいとか、マルチスレッド使ってる気がしないとかあります。
OpenMAX ILはどこにあるのが使われたのかよくわかりませんでした。FFmpegのソースに入ってるのでしょうか?Raspbian上のでしょうか?

とりあえずエンコーダ h264_omx が使えるみたいなので良しとします。次回はこのビルドでUSBカメラの録画を試してみます。

【2017/4/3 追記
より新しい方法は
Raspberry Pi 3のRaspbianでFFmpeg n3.2.4をビルドする
をご覧ください】

コメント

  1. Linux初心者です。
    ffmpegのmake手前、
    ./configure --enable-gpl (以下略)を入力すると、しばらくの沈黙ののち、
    ERROR: OMX_Core.h not found
    と出てきます。
    alsa-lib-1.1.6 があったので、それでやりました。エラーが出てきたので、記事と同じに1.1.2でもやってみましたが、結果は同じでした。

    何か手掛かりがあれば教えてください。

    返信削除
  2. 自己レスです。
    海外のサイトで同じような質問がありました。google翻訳のお世話になって、
    sudo apt install libomxil-bellagio-dev
    とやったら、エラーが出なくなりました。

    返信削除
    返信
    1. 解決したようでよかったですね。オープンソースソフトウエアはライブラリの依存関係がすぐに変わるので最新を追いかけていないとすぐに動かせなくなります・・・。私は最近いじっていなかったのでどんな問題が起きるのか把握していません。参考情報ありがとうございます。

      削除

コメントを投稿

最近のコメント

Threaded Recent Comments will be here.