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行実行するだけでインストールできます。
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 としました。
細かいパラメータは抜きで、ビデオのビットレートのみ設定しています。画質の評価はしていません。私はあまり画質には拘りがないのですが、どの結果も主観では気になるところはありませんでした。すべてのケースでエンコード後も綺麗な映像でした。
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 を使用するのがよいでしょう。