Euquid Blog.

WEBエンジニアの技術ブログ。主に個人開発で学んだことの備忘録です。

RaspberryPi4でH.264のハードウェアエンコードを使ってみる

Cover Image for RaspberryPi4でH.264のハードウェアエンコードを使ってみる

エンコードの種類

ソフトウェアエンコード(-c:f libx264)

  • CPU のみで処理 --> CPU 負荷が高い。ラズパイ 4 で 350%とかになる。
  • 圧縮率は高いが、変換速度は遅い(1.0x 以下)
  • -crf, -preset で 画質や圧縮率、変換速度を調整する。

ハードウェアエンコード(-b:f h264_omx)

  • GPU で処理 --> CPU 負荷が低い。ラズパイ 4 で 150%くらい。
  • 変換速度は速い(ハードウェアに依存する)
  • -b:v で ビットレートを指定する。
  • 一般的に 2 パスでエンコードするらしい。ただし変換速度重視のため今回は使用しない。
# 1パス
$ ffmpeg -fflags +discardcorrupt -i input.m2ts -c:a copy -bsf:a aac_adtstoasc -vsync 1 -c:v h264_omx -b:v 4000k output.mp4

# 2パス(1回目は動画の解析のため音声なし, 解析結果に基づき2回目で動画を生成)
$ ffmpeg -fflags +discardcorrupt -i input.m2ts -an -c:v h264_omx -b:v 4000k -pass 1 output.mp4 && \
  ffmpeg -fflags +discardcorrupt -i input.m2ts -c:a copy -bsf:a aac_adtstoasc -vsync 1 -c:v h264_omx -b:v 4000k -pass 2 output.mp4

試験

# -b:v 8000k
frame= 9101 fps= 50 q=-0.0 Lsize=  313763kB time=00:05:03.63 bitrate=8465.2kbits/s dup=27 drop=0 speed=1.67x
video:306522kB audio:6982kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.082678%

# -b:v 4000k
frame= 9101 fps= 47 q=-0.0 Lsize=  160760kB time=00:05:03.63 bitrate=4337.2kbits/s dup=27 drop=0 speed=1.57x
video:153518kB audio:6982kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.161494%

速度はどちらもほぼ変わらず 1.6x。 ファイル容量を考えると、4000k くらいが良さそう。

ほぼ同じビットレートとなるソフトウェアエンコード(libx264, crf 22, preset veryfast)に比べて 2 倍のスピード。しかも CPU 使用率が低いので安心。

アスペクト比

h264_omx でエンコードした動画を PS4 で再生するとアスペクト比が 4:3 のようになり横につぶれてしまう(左右に黒いブロックが生じる)。 ffmpeg -i で中身を見ても、 SAR 4:3 DAR 16:9 になっており元動画との違いがわからない。エンコード時に 16:9 を指定しても変わらず。

要因は不明だが、PS4 の機能で全画面モードで再生することで解消できたので一旦は問題なしとする。ここでもやはり PS4 は優秀。