macOS と FFmpeg 4.3 で VideoToolbox による HEVC/H.265, H.264 ハードウェアエンコード

Linux や Windows においては、NVENC や QSV のようなハードウェアアクセラレーションによるエンコードが可能であることはよく知られていると思います。一方で、macOS ではどうでしょうか?

実は macOS でも FFmpeg で VideoToolbox を使用することで、HEVC/H.265 や H.264 のハードウェアエンコードをすることが可能です。

なお、この投稿の内容ではエンコードよりはトランスコードが適切かもしれないですが、一般的な表現と思われるエンコードという単語を使用しています。

VideoToolbox とは

FFmpeg で VideoToolbox を使用するため、FFmpeg の利用者が VideoToolbox を直接使用することはありません。参考として、Apple Developer Documentation へのリンクを貼っておきます。

https://developer.apple.com/documentation/videotoolbox

FFmpeg の VideoToolbox 対応情報

FFmpeg の wiki の HWAccelIntro によると、FFmpeg では VideoToolbox を使用したエンコードが機能すると記載されています。

https://trac.ffmpeg.org/wiki/HWAccelIntro

私の環境

MacBook Pro (15-inch, 2016)

  • macOS Catalina 10.15.6
  • 2.6GHz クアッドコア Inte Core i7
  • メモリ 16GB
  • グラフィックス Radeon Pro 450 2GB, Intel HD Graphics 530 1536MB

Homebrew のインストール

macOS で FFmpeg をインストールするには、Homebrew を使用するのが楽だと思います。そのため、まず Homebrew をインストールします。Homebrew のホームページに記載されているように、コマンド1行実行するだけでインストールできます。

https://brew.sh/index_ja

FFmpeg のインストール

続いて Homebrew で FFmpeg をインストールします。下記のコマンドを実行するだけです。

brew install ffmpeg

インストール後、brew ls コマンドで確認すると、x264, x265 もインストールされていることがわかります。x264, x265 はソフトウェアエンコードであるため、VideoToolbox によるハードウェアエンコードとの速度比較をすることができます。

$ brew ls

...
fdk-aac
ffmpeg
...
x264
x265
...

インストールされた FFmpeg のバージョンを確認してみます。インストールしたのは 2020 年 7 月です。 バージョンは、4.3.1 でした。-–enable-videotoolbox が設定されています。

% ffmpeg -version

ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
built with Apple clang version 11.0.3 (clang-1103.0.32.62)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --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-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --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-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
libavutil      56. 51.100 / 56. 51.100
libavcodec     58. 91.100 / 58. 91.100
libavformat    58. 45.100 / 58. 45.100
libavdevice    58. 10.100 / 58. 10.100
libavfilter     7. 85.100 /  7. 85.100
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  7.100 /  5.  7.100
libswresample   3.  7.100 /  3.  7.100
libpostproc    55.  7.100 / 55.  7.100

エンコードの動作確認

ハードウェアエンコードとソフトウェアエンコードの速度を比較してみます。また、HEVC/H.265 と H.264 のエンコード速度も比較してみます。

エンコードするビデオファイルは、パブリックドメインである Grand Canyon National Park’s B-Roll archive を使用しました。

https://www.nps.gov/grca/learn/photosmultimedia/b-roll_hd_index.htm

また、動作確認の際のビットレートは HLS Authoring Specification for Apple Devices を参考にしました。HEVC/H.265 も H.264 も 1920×1080 の解像度で 5,000kbps としました。

https://developer.apple.com/documentation/http_live_streaming/hls_authoring_specification_for_apple_devices

細かいパラメータは抜きで、ビデオのビットレートのみ設定しています。画質の評価はしていません。私はあまり画質には拘りがないのですが、どの結果も主観では気になるところはありませんでした。すべてのケースでエンコード後も綺麗な映像でした。

H.246 (libx264) ソフトウェアエンコード

H.264 のソフトウェアエンコード速度は 1.17 倍でした。実時間より早くエンコードできました。よって、リアルタイムエンコードも可能でしょう。

ただ、ソフトウェアエンコードであるため CPU 負荷も高く、MacBook Pro のファンが爆音で回ります。

$ ffmpeg -i grca-timelapse-01-1080.mp4 -c:v libx264 -b:v 5000k output.mp4

...
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
...
speed=1.17x

HEVC/H.265 (libx265) ソフトウェアエンコード

HEVC/H.265 のソフトウェアエンコードは 0.616 倍でした。実時間より遅いです。よって、リアルタイムエンコードは無理でしょう。

また、ソフトウェアエンコードであるため CPU 負荷も高く、MacBook Pro のファンが爆音で回ります。

$ ffmpeg -i grca-timelapse-01-1080.mp4 -c:v libx265 -tag:v hvc1 -b:v 5000k output.mp4

...
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> hevc (libx265))
...
speed=0.616x 

H.264 (h264_videotoolbox) ハードウェアエンコード

VideoToolbox を使用した H.264 のハードウェアエンコードは 7.53 倍でした。非常に速いです。 リアルタイムエンコードも楽勝でしょう。

また、ソフトウェアエンコードとは異なり、エンコード中に MacBook Pro のファンが回ることもありませんでした。エンコード中も非常に静かでした。

$ ffmpeg -i grca-timelapse-01-1080.mp4 -c:v h264_videotoolbox -b:v 5000k output.mp4

...
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (h264_videotoolbox))
...
speed=7.53x

HEVC/H.265 (h265_videotoolbox) ハードウェアエンコード

VideoToolbox を使用した HEVC/H.265 のハードウェアエンコードは 1.34 倍でした。実時間より早くエンコードできました。よって、リアルタイムエンコードも可能でしょう。

また、ソフトウェアエンコードとは異なり、エンコード中に MacBook Pro のファンが回ることもありませんでした。エンコード中も非常に静かでした。

$ ffmpeg -i grca-timelapse-01-1080.mp4 -c:v hevc_videotoolbox -tag:v hvc1 -b:v 5000k output.mp4

...
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> hevc (hevc_videotoolbox))
...
speed=1.34x

エンコードされたビデオの確認

macOS にインストールされている QuickTime Player か、VLC media player を使用するのがよいでしょう。

https://www.videolan.org/index.ja.html