この記事でわかること
- VAAPIとは何か、どのGPUで使えるか
- LinuxでVAAPIを有効にするための前提条件
h264_vaapi、hevc_vaapi、av1_vaapiの基本的な使い方- GPUデコード+エンコードのパイプライン構成
- よくあるエラーと解決策
テスト済みバージョン: FFmpeg 6.1(Linux/VAAPI環境)
対象 OS: Linux(Intel iGPU / AMD GPU対応)
VAAPIとは
VAAPI(Video Acceleration API)はLinuxのハードウェアビデオアクセラレーション標準インターフェースです。Intel内蔵GPU、AMD GPU、一部のNVIDIA GPUで利用できます。GPUのエンコーダーを直接呼び出すため、CPUソフトウェアエンコードより大幅に高速です。
| GPU | VAAPI サポート |
|---|---|
| Intel iGPU(Broadwell以降) | H.264, H.265, AV1(Xe以降) |
| AMD GPU(GCN以降) | H.264, H.265 |
| NVIDIA(nouveau) | 限定的(非推奨) |
前提条件
必要なパッケージのインストール
Ubuntu / Debian:
※ このコマンドはVAAPI環境が必要です
sudo apt install vainfo libva-dev intel-media-va-driver # Intel
sudo apt install vainfo libva-dev mesa-va-drivers # AMD
Arch Linux:
※ このコマンドはVAAPI環境が必要です
sudo pacman -S intel-media-driver libva # Intel
sudo pacman -S mesa libva # AMD
VAAPIデバイスの確認
※ このコマンドはVAAPI環境が必要です
vainfo
/dev/dri/renderD128 が表示され、対応しているエントリポイント(VAEntrypointEncSlice など)が一覧されれば準備OK。
h264_vaapi の基本コマンド
※ このコマンドはVAAPI(Linux)環境が必要です
ffmpeg -vaapi_device /dev/dri/renderD128 -i input.mp4 \
-vf 'format=nv12,hwupload' \
-c:v h264_vaapi -qp 23 \
-c:a aac -b:a 128k output_vaapi.mp4
ポイント:
-vaapi_device /dev/dri/renderD128:VAAPIデバイスを指定(/dev/dri/renderD129など複数ある場合もある)-vf 'format=nv12,hwupload':フレームをGPUメモリにアップロードするために必須-qp 23:品質パラメーター(0〜51、低いほど高品質)
hevc_vaapi(H.265)
※ このコマンドはVAAPI(Linux)環境が必要です
ffmpeg -vaapi_device /dev/dri/renderD128 -i input.mp4 \
-vf 'format=nv12,hwupload' \
-c:v hevc_vaapi -qp 28 \
-c:a aac -b:a 128k output_hevc_vaapi.mp4
av1_vaapi(AV1)— Intel Arc / Xe以降
※ このコマンドはVAAPI(Linux / Intel Arc)環境が必要です
ffmpeg -vaapi_device /dev/dri/renderD128 -i input.mp4 \
-vf 'format=nv12,hwupload' \
-c:v av1_vaapi -qp 30 \
-c:a aac -b:a 128k output_av1_vaapi.mp4
AV1は Intel Arc(Alchemist)以降や AMD RDNA3以降のGPUでサポートされています。
VAAPIデコード + エンコードのフルGPUパイプライン
デコードもGPU(VAAPI)で行うことでCPU使用率をほぼゼロにできます:
※ このコマンドはVAAPI(Linux)環境が必要です
ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 \
-hwaccel_output_format vaapi \
-i input.mp4 \
-c:v h264_vaapi -qp 23 \
-c:a copy output_fullgpu.mp4
この方法ではGPUからCPUへのフレーム転送が不要になります。
ビットレート指定エンコード
※ このコマンドはVAAPI(Linux)環境が必要です
ffmpeg -vaapi_device /dev/dri/renderD128 -i input.mp4 \
-vf 'format=nv12,hwupload' \
-c:v h264_vaapi -rc_mode CBR -b:v 4M \
-c:a aac -b:a 128k output_cbr.mp4
よくあるエラーと対処法
Cannot open library: libva.so.2
libvaがインストールされていない- Ubuntu:
sudo apt install libva2
Device creation failed(/dev/dri/renderD128 が見つからない)
ls /dev/dri/でデバイスを確認- カーネルモジュールが読み込まれているか確認(Intel:
i915, AMD:amdgpu)
format=nv12,hwupload なしでエラー
- VAAPIエンコーダーはGPUメモリ上のフレームを要求するため、
hwuploadは必須
Provided pixel format nv12 is not supported
- 一部のGPUは
p010le(10ビット)形式のみ受け付ける場合がある -vf 'format=nv12,hwupload'を-vf 'format=p010le,hwupload'に変更してみる
VAAPIとNVENCの比較
| 項目 | VAAPI(Intel/AMD) | NVENC(NVIDIA) |
|---|---|---|
| 対象GPU | Intel iGPU / AMD GPU | NVIDIA GPU |
| OS | Linux主体 | Windows / Linux |
| 設定の複雑さ | やや複雑(デバイス指定) | 比較的シンプル |
| 速度 | 高速 | 高速 |
関連記事
一次ソース: trac.ffmpeg.org/wiki/HWAccelIntro / ffmpeg.org/ffmpeg-codecs.html