M1 Pro チップ搭載の MacBook Pro で 4K映像を H.265 ハードウェアエンコードする
はじめに
Macにffmpegをインストールした のでついでに Mac の実力を試してみることにしました。
試験環境
試験したのは M1 Pro を搭載した Macbook Pro 16インチ です。
Mac のハードウェアエンコーダーは videotoolbox
インストールした ffmpeg はきちんとハードウェアエンコーダーに対応してました。 ffmpeg のオプションで –enable-videotoolbox が指定されていればハードウェアエンコーダーが使用できます。
tomokatsu@snow-under-MacBook-Pro ~ % ffmpeg -codecs | grep tool
ffmpeg version 5.0.1 Copyright (c) 2000-2022 the FFmpeg developers
built with Apple clang version 13.1.6 (clang-1316.0.21.2.5)
configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.0.1_1 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon
libavutil 57. 17.100 / 57. 17.100
libavcodec 59. 18.100 / 59. 18.100
libavformat 59. 16.100 / 59. 16.100
libavdevice 59. 4.100 / 59. 4.100
libavfilter 8. 24.100 / 8. 24.100
libswscale 6. 4.100 / 6. 4.100
libswresample 4. 3.100 / 4. 3.100
libpostproc 56. 3.100 / 56. 3.100
DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (encoders: libx264 libx264rgb h264_videotoolbox )
DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (encoders: libx265 hevc_videotoolbox )
DEVIL. prores Apple ProRes (iCodec Pro) (encoders: prores prores_aw prores_ks prores_videotoolbox )
早速 H.265 で 4K 映像をハードウェアエンコードしてみる
映像は夜の港北インターチェンジで撮影した動画にしてみました。
以下のコマンドでエンコードしてみました。
ffmpeg -i 第三京浜\ 港北インターチェンジ-最大4K.mov -c:v hevc_videotoolbox hevc_videotoolbox_default.mp4
Stream #0:0(und): Video: hevc (hev1 / 0x31766568), yuv420p(tv, bt709, progressive), 3840x2160 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 29.97 fps, 30k tbn (default)
Metadata:
creation_time : 2022-06-04T07:16:16.000000Z
handler_name : Core Media Video
vendor_id : [0][0][0][0]
timecode : 00:00:00;00
encoder : Lavc59.18.100 hevc_videotoolbox
Stream #0:1(jpn): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
creation_time : 2022-06-04T07:16:16.000000Z
handler_name : Core Media Audio
vendor_id : [0][0][0][0]
encoder : Lavc59.18.100 aac
frame= 1548 fps= 52 q=-0.0 Lsize= 22975kB time=00:00:51.66 bitrate=3642.7kbits/s speed=1.72x
speed=1.72x で流石に早い。
ファイルサイズは劇的に小さくなりました。
画質は?
うーん・・流石にファイルサイズに比例した、もやもやした映像です。 動きが早い映像だと厳しいかなぁーという印象。
hevc_videotoolbox は品質固定ができる模様
hevc_videotoolboxのオプションで -q:v nn を指定すれば品質固定でエンコードができるようです。
git.ffmpeg.org Git - ffmpeg.git/commit
Optimally using hevc_videotoolbox and ffmpeg on OSX
以下でエンコードしてみました。
ffmpeg -i 第三京浜\ 港北インターチェンジ-最大4K.mov -c:v hevc_videotoolbox -q:v 50 hevc_videotoolbox_q50.mp4
ファイルサイズはそこそこ大きくなりました。
品質固定 (q=50) の画質
画面全体が変化するような映像ではないためか、映像に破綻はなさそうです。なかなかいい感じ。
frame= 1548 fps= 52 q=-0.0 Lsize= 174735kB time=00:00:51.66 bitrate=27703.6kbits/s speed=1.73x
video:173879kB audio:810kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.026356%
やっぱりエンコード速度も早いです。
おまけ: libx265 でのエンコード速度
以下でエンコードしてみました。
ffmpeg -i ./第三京浜\ 港北インターチェンジ-最大4K.mov -c:v libx265 -crf 28 -preset fast libx265.mp4
結果は以下。
frame= 1548 fps=3.5 q=32.9 Lsize= 24886kB time=00:00:51.66 bitrate=3945.5kbits/s speed=0.116x
お・・・遅い。4K映像をソフトエンコードするのは辛そうです。
libx265 でのエンコード結果
目を疑うような圧縮率。
そして画質も文句ないです。
まとめ : Macのハードウェアエンコードはソフトエンコードの15倍早かった
ファイルサイズと画質のトレードオフになってしまいましたが、速度はとにかく早かったです。 リアルタイムエンコードも余裕。ちなみにハードウェアエンコード中のCPU専有率は 30-50% 程度でした。
リアルタイム性や処理時間を求めるならあり
とにかく早いので、配信などの用途に適していそうです。 高画質を求める場合はソフトエンコードの方が良さそうでした。