組み込み機器で4K動画を再生するためのあれこれ[20日目]

Pocket
LINEで送る

この記事はShiftallのプロジェクトに関わるメンバーが日替わりでブログを更新していくアドベントカレンダー企画の20日目です。その他の記事はこちらのリンクからご覧下さい。

アドベントカレンダー2018
https://blog.shiftall.net/ja/archives/tag/adventcalendar2018/

はじめに

組込みソフトウェア担当の山本です。

今回は業務で4KをHDMI出力するSoCを扱うことになったので、体験談的に書いていきたいと思います。

SoC選定

今回の要件は4K30pの動画をHDMI出力で再生することです。

映像出力

出力はHDMIで4K30pが出力できればいいので、HDMI1.3以降に対応していれば出力可能なはずです。ただ、スペック的に可能でもベンダーから提供されているソフトウェアが対応していないこともままあるので注意が必要です。

ハードウェアデコーダ

4k30pの動画にもなると普通のPCでソフトウェアデコードするだけでコマ落ちが発生するので、非力な組み込み用のSoCのCPU,GPUではソフトウェアデコードは不可能でしょう。なので4K30p以上をハードウェアデコードできることが望ましいです。

上記の条件を満たすものとしては

  • Allwinner A64,A80,H3,H6…
  • Rockchip RK3399,RK3328,RK3288…
  • Amlogic S905,S912…

などいろいろあります。

有名どころのSoCとして「Allwinner、Amlogic、Rockchipって知ってます?」で言われている三社に絞っていますが、他のベンダーのSoCなども含めるとまだまだあります。

SBC

検証用に一から基板を作るのは大変なので、SoCが乗っているラズパイのようなSBC(Single Board Computer)があることも大事な要素です。

上記のSoCが乗っているものといえば、

  • SOPINE
  • ROCK64
  • NanoPi K2
  • Banana Pi M64
  • ODROID-C2

などがあります。

ソフトウェアの対応状況

ハードウェア的に動作できることが分かってもソフトウェアが対応しているとは限りません。ビデオ出力やハードウェアデコーダなどの4K対応などはオープンなLinuxカーネルは対応が少し遅い傾向があります。KODIを動かすためのAndroidやLibreELECなどのOSはビデオ系の機能の対応が早いです。

ハードウェアスペック的には動くはずだかmainlineに近いコミュニティのカーネルだと動かないことがあるので注意が必要です。

SOPINE
SOPINEは安くて良さそうですが現時点(2018/12)のカーネルでは4K30p H.265 ビデオデコードをしつつ4K30pHDMI出力するとコマ落ちが発生するので使えなさそうです。Androidの場合はそもそも1080pまでしか出力できないようなので使えなさそうです。

ROCK64
最新のROCK64用のLinuxカーネルだと4K30pデコーダのソフトウェアにバグがあり緑の横線が出てしまうようです。Android8.1またはLibreELECだとデコードしつつ出力可能です。

NanoPi K2
未検証だがS905を使った4K出力を謳ったSTBが存在してるので可能ではある?

私は最終的にROCK64を選択しました。

 

Andoridで使う話

AndroidでHWデコーダを使う場合MediaCodecクラスを使用します。AndroidはHWデコーダがある場合優先して使うようなので、以下のようにデコーダを作ってみて名前の先頭がOMX.google.の場合SWデコーダ、それ以外の場合はHWデコーダを使います。

MediaCodec.createDecoderByType("video/avc")

MediaCodecクラスをそのまま使うのは手間なのでExoPlayerというライブラリを使いました。

まとめ

スマホで4k動画が撮れたり12/1から4K(UHD)のテレビ放送が開始したり、4Kが日常的にあるようになってきました。組み込み機器で扱うことはあまりない気はしますが参考になったら幸いです。

*以上の情報は2018/12/19時点の情報です。