はじめに:ローカルAI時代の「動画書き出し問題」
Stable Diffusionで画像を生成し、CogVideoやFramePackで動画を生成し、Llamaでテキストを生成し...。Apple Silicon Macでローカル生成AIを楽しむ人が増えている。
でも、ふと気づく。
「生成した動画フレームをMP4に書き出すの、めっちゃ時間かかるな...」
そう、生成AIが吐き出すのは「画像の連番」や「生のフレームデータ」であることが多い。それを最終的な動画ファイルにエンコードする処理は、また別の話なのだ。
ここで登場するのがVideoToolbox。Apple Silicon Macに搭載されたハードウェアエンコーダ/デコーダを呼び出すためのフレームワークだ。これを使えば、動画のエンコードが爆速になる。
今回は、ローカルAI勢なら知っておきたいVideoToolboxの全貌を解説する。
VideoToolboxとは
Appleの公式ドキュメントによれば:
Work directly with hardware-accelerated video encoding and decoding capabilities.
(ハードウェアアクセラレーションによる動画エンコード・デコード機能に直接アクセスする)
参照:https://developer.apple.com/documentation/videotoolbox
VideoToolboxは、macOS/iOS向けの低レベルフレームワークだ。動画の圧縮(エンコード)・展開(デコード)、そしてピクセルフォーマットの変換といった処理を、ハードウェアアクセラレーションを使って高速に行える。
objc.ioの解説記事では、その歴史について触れられている:
Fast-forward to the present: in iOS 8 and OS X 10.8, Apple published the full Video Toolbox framework. It is a beast! It can compress and decompress video at real time or faster. Hardware accelerated video decoding and encoding can be enabled, disabled, or enforced at will.
(現在に目を向けると、iOS 8とOS X 10.8でAppleはVideo Toolboxフレームワークの全機能を公開した。これは怪物だ!リアルタイムまたはそれ以上の速度で動画を圧縮・展開できる。ハードウェアアクセラレーションによる動画のデコード・エンコードを、任意で有効化・無効化・強制化できる。)
参照:https://www.objc.io/issues/23-video/videotoolbox/
つまり、VideoToolboxを使えば、CPUをぶん回すソフトウェアエンコードではなく、Macに内蔵された専用ハードウェア(Media Engine)を使って動画処理ができるのだ。
なぜローカルAI勢に重要なのか
ローカルで生成AIを動かすとき、こんな処理フローになることが多い:
- AIモデルが画像/フレームを生成(GPU使用)
- 生成されたフレームを動画にエンコード
- 完成した動画を保存
問題は2番目のステップだ。
ソフトウェアエンコーダ(libx264やlibx265)を使うと、CPUが100%張り付きになる。M1/M2/M3/M4 Macは省電力が売りなのに、動画エンコード中はファンが唸り、バッテリーがゴリゴリ減っていく。
しかも、生成AIの処理自体もCPU/GPUリソースを使う。エンコードとAI生成を同時に走らせようものなら、システム全体がもっさりしてしまう。
VideoToolboxを使ったハードウェアエンコードなら:
- CPU使用率が劇的に下がる(100%→20%程度)
- 消費電力が大幅に減る(ある報告では18W程度)
- エンコード速度が3〜4倍速い
- AI生成と並行しても快適
ローカルAI環境では、限られたリソースをいかに効率よく使うかが勝負。VideoToolboxはその強い味方なのだ。
対応コーデックとApple Siliconの世代
VideoToolboxが対応するコーデックは、チップの世代によって異なる。
エンコード対応(動画を圧縮する)
- H.264:全てのApple Silicon Mac
- H.265(HEVC):全てのApple Silicon Mac(8bit/10bit両対応)
- ProRes:M1 Pro以降
デコード対応(動画を再生する)
- H.264:全てのApple Silicon Mac
- H.265(HEVC):全てのApple Silicon Mac
- ProRes / ProRes RAW:全てのApple Silicon Mac
- AV1:M3シリーズ以降(A17 Pro、M4含む)
Jellyfinのドキュメントによれば:
Starting with the M3 series, Apple Silicon-based Mac supports hardware-accelerated decoding of AV1 video. An Apple Silicon-based Mac is preferred in most cases. Even an entry-level M1 can handle three 4K 24fps Dolby Vision HEVC 10-bit transcoding tasks simultaneously while performing tone-mapping to SDR.
(M3シリーズから、Apple Silicon MacはAV1動画のハードウェアアクセラレーションデコードに対応した。ほとんどの場合、Apple Silicon Macが推奨される。エントリーレベルのM1でさえ、SDRへのトーンマッピングを行いながら、4K 24fps Dolby Vision HEVC 10bitのトランスコードを3本同時に処理できる。)
参照:https://jellyfin.org/docs/general/post-install/transcoding/hardware-acceleration/apple/
M1でも十分強力だが、M3以降ならAV1デコードも含めてフルスペックで使える。
また、Pro/Max/Ultraチップには追加のMedia Engineが搭載されている:
- M1/M2/M3/M4(無印):1基のエンコードエンジン
- Pro/Max:追加のエンコードエンジン搭載(4K 120fpsトランスコード対応)
- Ultra:2基のデコードエンジン + 4基のエンコードエンジン
FFmpegでVideoToolboxを使う
さて、実際にVideoToolboxを使うにはどうすればいいか。
最も手軽なのは、FFmpegを使う方法だ。FFmpegはVideoToolboxに対応しており、コマンドラインから簡単にハードウェアエンコードができる。
基本的な使い方
# H.264でエンコード
ffmpeg -i input.mp4 -c:v h264_videotoolbox -b:v 6000k output.mp4
# H.265(HEVC)でエンコード
ffmpeg -i input.mp4 -c:v hevc_videotoolbox -b:v 4000k output.mp4
ポイントは-c:vオプションでh264_videotoolboxまたはhevc_videotoolboxを指定すること。これだけでハードウェアエンコーダが使われる。
画質の調整
VideoToolboxでは、ビットレート指定(-b:v)または品質指定(-q:v)でエンコード品質を調整できる。
# ビットレート指定(推奨)
ffmpeg -i input.mp4 -c:v hevc_videotoolbox -b:v 8000k output.mp4
# 品質指定(0-100、数値が大きいほど高品質)
ffmpeg -i input.mp4 -c:v hevc_videotoolbox -q:v 65 output.mp4
注意:VideoToolboxは、ソフトウェアエンコーダ(libx264/libx265)で使える-crfオプション(定数品質モード)に対応していない。これが地味に痛いところだ。
プロファイル指定
# H.264 Highプロファイル
ffmpeg -i input.mp4 -c:v h264_videotoolbox -profile:v high -b:v 6000k output.mp4
# HEVC Main10プロファイル(10bit)
ffmpeg -i input.mp4 -c:v hevc_videotoolbox -profile:v main10 -b:v 8000k output.mp4
10bit HDR動画のエンコード
ローカルAIで生成した高品質な動画を10bitで保存したい場合:
ffmpeg -i input.mkv \
-c:v hevc_videotoolbox \
-pix_fmt p010le \
-b:v 20M \
-tag:v hvc1 \
output.mp4
-pix_fmt p010leで10bitピクセルフォーマットを指定し、-tag:v hvc1でAppleデバイスとの互換性を確保している。
ソフトウェアエンコードとの速度比較
実際どれくらい速いのか。
ある検証によると、同じ動画をエンコードした場合:
| エンコーダ | 速度 | CPU使用率 |
|---|---|---|
| libx264(ソフトウェア) | 1x(基準) | 100% |
| h264_videotoolbox | 約2.7〜4x | 約20% |
| libx265(ソフトウェア) | 1x(基準) | 100% |
| hevc_videotoolbox | 約3x | 約20% |
Martin Riedl氏のブログでは:
In a direct comparison the videotoolbox variant is 4 times faster than the x264 software encoder. Similar results with h265 encoding: hevc_videotoolbox is here 3 times faster than the x265 software encoder. And: the CPU is not fully under load with the hardware encoder. Only 20% of my CPU is used instead of 100% for the software encoding.
(直接比較では、videotoolbox版はx264ソフトウェアエンコーダの4倍速い。H265エンコードでも同様で、hevc_videotoolboxはx265ソフトウェアエンコーダの3倍速い。そして、ハードウェアエンコーダではCPUがフル稼働しない。ソフトウェアエンコードの100%に対して、わずか20%しか使われない。)
参照:https://www.martin-riedl.de/2020/12/06/using-hardware-acceleration-on-macos-with-ffmpeg/
Luis Nell氏のブログでも:
Works beautifully with speeds from 1.4x to 2.7x, while only consuming 18w of power. That is incredibly low power draw.
(1.4x〜2.7xの速度で美しく動作し、消費電力はわずか18W。信じられないほど低い消費電力だ。)
参照:https://www.originell.org/til/ffmpeg-apple-hardware-accelerated/
ローカルAI生成と並行してエンコードを走らせても、システムが重くならない。これは大きい。
画質のトレードオフ
正直に言おう。VideoToolboxの画質は、同じビットレートならソフトウェアエンコーダに負ける。
これはハードウェアエンコーダ全般に言えることだが、速度優先で設計されているため、libx264/libx265のような精緻な圧縮アルゴリズムは使えない。
「同じ見た目の品質」を得るには、VideoToolboxのほうが高いビットレートが必要になる。
とはいえ、これは用途次第だ:
VideoToolboxが向いているケース
- 生成AIの試行錯誤中(大量のプレビュー動画を素早く書き出したい)
- リアルタイム配信・録画
- バッテリー駆動での作業
- 最終品質より速度優先の場面
ソフトウェアエンコーダが向いているケース
- 最終納品物の書き出し
- ファイルサイズを極限まで小さくしたい
- 時間をかけてでも最高品質が必要
HandBrakeでも使える
コマンドラインが苦手なら、GUIツールのHandBrakeでもVideoToolboxが使える。
HandBrakeのドキュメントによれば:
If your computer is supported you will see one or more of the following video encoders added to the encoder control on the Video tab.
(お使いのコンピュータがサポートされている場合、Videoタブのエンコーダコントロールに以下のビデオエンコーダが追加されます。)
参照:https://handbrake.fr/docs/en/1.3.0/technical/video-videotoolbox.html
Videoタブのエンコーダ選択で「H.264 (VideoToolbox)」や「H.265 (VideoToolbox)」を選べばOKだ。
HandBrakeのGitHub Discussionでは、M1 Maxで330fps(1080p)というとんでもない速度が報告されている。
ローカルAIワークフローでの活用例
具体的にローカルAI環境でどう使うか、いくつかシナリオを考えてみよう。
シナリオ1:Stable Diffusion + AnimateDiffの出力を動画化
AnimateDiffが連番PNGを出力したとする。これをMP4に変換:
ffmpeg -framerate 8 -i frame_%04d.png \
-c:v hevc_videotoolbox \
-pix_fmt yuv420p \
-b:v 10M \
output.mp4
シナリオ2:CogVideoの出力を再エンコード
CogVideoが出力した動画を、より効率的なコーデックに変換:
ffmpeg -i cogvideo_output.mp4 \
-c:v hevc_videotoolbox \
-b:v 8M \
-c:a copy \
final_output.mp4
シナリオ3:大量の生成動画をバッチ処理
#!/bin/bash
for file in generated_*.mp4; do
ffmpeg -i "$file" \
-c:v hevc_videotoolbox \
-b:v 6M \
-c:a aac -b:a 128k \
"encoded_${file}"
done
CPUを占有しないので、バッチ処理中も他の作業ができる。
よくあるトラブルと対処法
トラブル1:「Unknown encoder」エラー
Unknown encoder 'hevc_videotoolbox'
FFmpegがVideoToolbox対応でビルドされていない可能性がある。
Homebrewでインストールした場合は通常対応しているが、確認するには:
ffmpeg -encoders | grep videotoolbox
h264_videotoolboxとhevc_videotoolboxが表示されればOK。
トラブル2:色がおかしくなる
特にHDR動画やYUVの扱いで色がずれることがある。
# 色空間を明示的に指定
ffmpeg -i input.mp4 \
-c:v hevc_videotoolbox \
-color_primaries bt709 \
-color_trc bt709 \
-colorspace bt709 \
-b:v 8M \
output.mp4
トラブル3:画質が低い
VideoToolboxはデフォルトで速度優先の設定になっている。ビットレートを上げるか、-q:vオプションで品質を指定しよう。
# 高品質設定
ffmpeg -i input.mp4 -c:v hevc_videotoolbox -q:v 75 output.mp4
まとめ
VideoToolboxは、Apple Silicon Macに搭載されたハードウェアエンコーダ/デコーダを呼び出すフレームワークだ。
ローカルAI勢にとってのメリット
- エンコード速度が3〜4倍速い
- CPU使用率が20%程度に抑えられる
- 消費電力が大幅に削減
- AI生成と並行しても快適に動作
対応コーデック
- エンコード:H.264、H.265(HEVC)、ProRes(Pro以上)
- デコード:上記 + AV1(M3以降)
使い方
- FFmpegで
-c:v h264_videotoolboxまたは-c:v hevc_videotoolbox - HandBrakeのエンコーダ選択で「VideoToolbox」を選ぶ
注意点
- 同ビットレートならソフトウェアエンコーダより画質が劣る
- CRF(定数品質)モードは使えない
- 最終納品物には向かない場合も
ローカルでStable DiffusionやCogVideoを動かして、生成した動画を素早くMP4に書き出したい。そんなときVideoToolboxは強力な味方になる。
Apple Silicon Macの隠れた実力、ぜひ活用してみてほしい。
参考リンク
- Apple Developer Documentation - Video Toolbox: https://developer.apple.com/documentation/videotoolbox
- Jellyfin - Apple Mac Hardware Acceleration: https://jellyfin.org/docs/general/post-install/transcoding/hardware-acceleration/apple/
- objc.io - Video Toolbox and Hardware Acceleration: https://www.objc.io/issues/23-video/videotoolbox/
- HandBrake Documentation - Apple VideoToolbox: https://handbrake.fr/docs/en/latest/technical/video-videotoolbox.html
- Codec Wiki - VideoToolbox: https://wiki.x266.mov/docs/encoders_hw/videotoolbox
- FFmpeg Wiki - HWAccelIntro: https://trac.ffmpeg.org/wiki/HWAccelIntro