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 は優秀。