この記事でわかること

  • VAAPIとは何か、どのGPUで使えるか
  • LinuxでVAAPIを有効にするための前提条件
  • h264_vaapihevc_vaapiav1_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ソフトウェアエンコードより大幅に高速です。

GPUVAAPI サポート
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)
対象GPUIntel iGPU / AMD GPUNVIDIA GPU
OSLinux主体Windows / Linux
設定の複雑さやや複雑(デバイス指定)比較的シンプル
速度高速高速

関連記事


一次ソース: trac.ffmpeg.org/wiki/HWAccelIntro / ffmpeg.org/ffmpeg-codecs.html