M1 Pro チップ搭載の MacBook Pro で 4K映像を H.265 ハードウェアエンコードする

はじめに

Macにffmpegをインストールした のでついでに Mac の実力を試してみることにしました。

試験環境

試験したのは M1 Pro を搭載した Macbook Pro 16インチ です。

screen reader text
使用したMacbookのスペック

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 で流石に早い。

ファイルサイズは劇的に小さくなりました。

screen reader text
エンコード結果 ファイルサイズ

画質は?

screen reader text
エンコード結果

うーん・・流石にファイルサイズに比例した、もやもやした映像です。 動きが早い映像だと厳しいかなぁーという印象。

hevc_videotoolbox は品質固定ができる模様

hevc_videotoolboxのオプションで -q:v nn を指定すれば品質固定でエンコードができるようです。

git.ffmpeg.org Git - ffmpeg.git/commit
videotoolboxenc: enable constant quality with -q:v on Apple Silicon Macs and use b-frames für HEVC and H264 and b-pyramid for HEVC.
https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/efece4442f3f583f7d04f98ef5168dfd08eaca5c
Optimally using hevc_videotoolbox and ffmpeg on OSX
thumbnail
I'm using ffmpeg 4.3.1 to convert videos from h264 to h265 and initially I was excited to discover that I can use my Mac's GPU to speed up the conversion with the flag hevc_videotoolbox. My Mac har...
https://stackoverflow.com/questions/64924728/optimally-using-hevc-videotoolbox-and-ffmpeg-on-osx

以下でエンコードしてみました。

ffmpeg -i 第三京浜\ 港北インターチェンジ-最大4K.mov -c:v hevc_videotoolbox -q:v 50 hevc_videotoolbox_q50.mp4

screen reader text
エンコード結果 品質固定 (q=50) のファイルサイズ

ファイルサイズはそこそこ大きくなりました。

品質固定 (q=50) の画質

screen reader text
エンコード結果 品質固定 (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 でのエンコード結果

screen reader text
libx265 のファイルサイズ めっちゃ圧縮された

目を疑うような圧縮率。

screen reader text
エンコード結果 品質固定 libx265 ばっちりな画質

そして画質も文句ないです。

まとめ : Macのハードウェアエンコードはソフトエンコードの15倍早かった

ファイルサイズと画質のトレードオフになってしまいましたが、速度はとにかく早かったです。 リアルタイムエンコードも余裕。ちなみにハードウェアエンコード中のCPU専有率は 30-50% 程度でした。

リアルタイム性や処理時間を求めるならあり

とにかく早いので、配信などの用途に適していそうです。 高画質を求める場合はソフトエンコードの方が良さそうでした。

関連項目