FFmpeg Libav Raspberry Pi

Raspberry Pi 3 Model B で OpenMAX IL を使用した H.264 なハードウェアエンコード / トランスコードを行う件.

投稿日:2016-05-16 更新日:

■ 2017年2月追記 ここから -----

libav (avconv) だけではなく、FFmpeg でもできるようになっていました。

Raspberry Pi 3 Model B, FFmpeg, OpenMAX IL H.264 ハードウェアエンコード、トランスコード
Raspberry Pi 3 Model B, FFmpeg, OpenMAX IL H.264 ハードウェアエンコード、トランスコード

■ 2017年2月追記 ここまで -----

これはすごい.Raspberry Pi 3 で OpenMAX IL によるハードウェアトランスコードは,H.264 のソフトウェアトランスコードと比較して 13.5 倍高速でした.(540秒 → 40秒)

Raspberry Pi 3 で,52 秒のビデオを 40 秒程度で H.264 トランスコード可能でした.現在開発しているリアルタイムトランスコード HLS ウェブアプリケーションを Raspberry Pi でも動かせそうです.

ただし,-s オプション (解像度変更) を付けるとあまり速くならないようです.

開発中のリアルタイムトランスコード HLS ウェブアプリケーションは,こちら.
chukasa - Web camera, video file, PT2 and PT3 HTTP Live Streaming (HLS) Server for OS X and iOS
https://github.com/hirooka/chukasa

最初,ウェブで情報が豊富にある GStreamer でやろうと思っていましたが,オプションが複雑なのと,開発中のウェブアプリケーションと連携できないので FFmpeg でできないかと検索していたら 最近,4 月に libav に組み込まれたようで下記の情報を発見.

Hardware h264 video encoding with libav (openmax IL)
http://ubuntu-mate.community/t/hardware-h264-video-encoding-with-libav-openmax-il/4997

さらに FFmpeg のリポジトリを見てみたら,なんと 3 日前に FFmpeg にもこの内容がマージされていました.
https://github.com/FFmpeg/FFmpeg/search?utf8=%E2%9C%93&q=raspberry+pi

しかし,FFmpeg で実行すると,下記のメッセージとなっていました.

Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
Assertion ret <= 0 failed at libavcodec/utils.c:1956
Aborted

というわけで,libav (avconv) で行います.

Raspberry Pi 3 Model B に Raspbian Jessie 2016-05-10 をインストール.

以下は libav (avconv) の手順です.

sudo sh -c "echo 'deb http://www.deb-multimedia.org jessie main non-free' >> /etc/apt/sources.list"
sudo sh -c "echo 'deb-src http://www.deb-multimedia.org jessie main non-free' >> /etc/apt/sources.list"
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5C808C2B65558117
sudo apt-get update
sudo apt-get build-dep ffmpeg
git clone https://github.com/libav/libav --depth 1
cd libav
./configure --enable-static --enable-omx-rpi --enable-mmal
make -j4
sudo make install

インストール後,バージョンを確認.

avconv -version
avconv version 11de006, Copyright (c) 2000-2016 the Libav developers
  built on May 15 2016 16:02:34 with gcc 4.9.2 (Raspbian 4.9.2-10)
avconv 11de006
libavutil     55. 10. 0 / 55. 10. 0
libavcodec    57. 19. 0 / 57. 19. 0
libavformat   57.  5. 2 / 57.  5. 2
libavdevice   56.  1. 0 / 56.  1. 0
libavfilter    6.  4. 0 /  6.  4. 0
libavresample  3.  0. 0 /  3.  0. 0
libswscale     4.  0. 0 /  4.  0. 0

Sintel のトレーラーをダウンロードしてトランスコード.

wget https://download.blender.org/durian/trailer/sintel_trailer-1080p.mp4
avconv -i sintel_trailer-1080p.mp4 -c:v h264_omx -acodec copy out.ts

ログを見ると,h264_omx となっています.

Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (h264_omx))
  Stream #0:1 -> #0:1 (copy)

なお,同じ Raspberry Pi 3 で,libx264 でトランスコードしてみたところ,(./configure --enable-gpl --enable-libx264)

avconv -i sintel_trailer-1080p.mp4 -c:v h264 -acodec copy out.ts
...
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (copy)

8分30秒もかかりました.

-FFmpeg, Libav, Raspberry Pi

Copyright© hirooka.pro , 2013-2018 All Rights Reserved.