FFmpeg で AMD Radeon ハードウェアアクセラレーションを使って動画を H.264 にトランスコードする方法

これらのコマンドは AMD Radeon VAAPI ハードウェアアクセラレーションを使って動画を H.264 にトランスコードする。Radeon RX 7800 XT でテスト済み。ほとんどのモダン Radeon カードは H.264 ハードウェアエンコードをサポート——AV1 と異なり RDNA3 に限定されない。

速度最適化コマンド

品質と速度のバランスが良い高速 H.264 エンコードが欲しい場合に使用:

transcode_h264_speed.sh
LIBVA_DRIVER_NAME=radeonsi ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi -i input.mp4 -c:v h264_vaapi -rc_mode CQP -global_quality:v 24 -c:a copy output-h264.mp4

input.mp4 と output-h264.mp4 を自分のファイル名に置き換える。デフォルトのレンダーデバイスは /dev/dri/renderD128。どのデバイスが自分の Radeon カードかわからない場合は How to Identify Which /dev/dri/renderD Device Is Your AMD Radeon GPU を参照。

フラグの意味

  • LIBVA_DRIVER_NAME=radeonsi は Radeon VAAPI ドライバを強制。すべてのディストリビューションで必要とは限らないが、複数の GPU ドライバがインストールされている場合に役立つ。
  • -hwaccel vaapi はハードウェアアクセラレートデコードを有効化。
  • -hwaccel_device /dev/dri/renderD128 はデフォルト DRM レンダーノードを FFmpeg に指示。
  • -hwaccel_output_format vaapi はデコード済みフレームをビデオメモリに保持し、エンコーダが直接読めるようにする。
  • -c:v h264_vaapi は H.264 VAAPI エンコーダを選択。
  • -rc_mode CQP は固定量子化器(CQP)レート制御を使用。
  • -global_quality:v 24 はエンコーダ品質を設定。低いほど高品質で大きなファイル、高いほど小さく低品質。
  • -c:a copy は音声ストリームを再エンコードせずにコピー。

ラッパースクリプト

これを transcode-h264-radeon.sh として保存し、入力ファイルで実行。入力の隣に <basename>-h264.mp4 を自動的に書き込む:

transcode-h264-radeon.sh
#!/bin/bash
set -euo pipefail

RENDER_DEVICE="${RENDER_DEVICE:-/dev/dri/renderD128}"

if [ $# -ne 1 ]; then
    echo "Usage: $0 <input video>" >&2
    exit 1
fi

input="$1"
base="${input%.*}"
output="${base}-h264.mp4"

LIBVA_DRIVER_NAME=radeonsi ffmpeg \
  -hwaccel vaapi -hwaccel_device "$RENDER_DEVICE" -hwaccel_output_format vaapi \
  -i "$input" \
  -c:v h264_vaapi -rc_mode CQP -global_quality:v 24 \
  -c:a copy \
  "$output"

例:

example_usage_h264.sh
chmod +x transcode-h264-radeon.sh
./transcode-h264-radeon.sh input.mp4
# Produces input-h264.mp4

別のレンダーノードを使うにはエクスポート:

example_render_device_h264.sh
RENDER_DEVICE=/dev/dri/renderD129 ./transcode-h264-radeon.sh input.mp4

品質/ビットレートガイダンス

h264_vaapi の global_quality 値は H.264 CRF スケール(0–51)とほぼ同等。これらは概算マッピング。必ず自分のソースでテスト:

Target qualityCPU CRF (0–51)h264_vaapi global_quality (0–51)Typical 720pTypical 1080pTypical 4KTypical 8K
High quality / near-transparent1818~4 – 6 Mbps~8 – 12 Mbps~40 – 60 Mbps~120 – 180 Mbps
Standard quality (recommended)2323~2 – 4 Mbps~4 – 8 Mbps~20 – 30 Mbps~60 – 90 Mbps
Moderate compression2828~1.5 – 3 Mbps~3 – 5 Mbps~12 – 20 Mbps~35 – 60 Mbps
Below standard quality3535~0.8 – 1.5 Mbps~1.5 – 3 Mbps~6 – 12 Mbps~18 – 35 Mbps
High compression / archival low4040~0.4 – 0.8 Mbps~0.8 – 1.5 Mbps~3 – 6 Mbps~9 – 18 Mbps

上記のコマンドは 24 をデフォルトの開始点として使用——表の標準品質(推奨)設定。目と納品要件に合わせて調整。

H.264 ハードウェアエンコードが利用可能か確認

vainfo の該当部分を確認:

vainfo_h264_output.txt
      VAProfileH264ConstrainedBaseline:	VAEntrypointVLD
      VAProfileH264ConstrainedBaseline:	VAEntrypointEncSlice
      VAProfileH264Main               :	VAEntrypointVLD
      VAProfileH264Main               :	VAEntrypointEncSlice
      VAProfileH264High               :	VAEntrypointVLD
      VAProfileH264High               :	VAEntrypointEncSlice

このマシンでは vainfo は AMD ドライバを次のように報告:

vainfo_h264_driver.txt
vainfo: Driver version: Mesa Gallium driver 26.0.8-1ubuntu0.3 for AMD Radeon RX 7800 XT (radeonsi, navi32, ACO, DRM 3.64, 7.0.0-31-generic)

このコンピュータでの検証

短い 1920×1080 テストクリップに対してコマンドを実行した結果、次のエンコードサマリーが出力された:

transcode_h264_output.txt
Output #0, mp4, to 'testsrc_h264.mp4':
  Stream #0:0: Video: h264 (High) (avc1 / 0x31637661), vaapi(tv, progressive), 1920x1080, q=2-31, 30 fps
  Stream #0:1: Audio: aac (LC), 44100 Hz, mono, fltp, 69 kb/s
[out#0/mp4] video:151KiB audio:43KiB ... bitrate= 330.4kbits/s speed=8.98x

出力に対する ffprobe は codec_name=h264 と profile=High を確認し、動画は h264_vaapi により正しく生成された。

この特定の PC では、/dev/dri/renderD128 が内蔵 Intel GPU に属するため、Radeon カードは実際には /dev/dri/renderD129。常に vainfo が Radeon カードとして報告するデバイスを使用すること。

代わりに Intel GPU を使用

同じ h264_vaapi コーデックは iHD ドライバで Intel VAAPI でも動作する。環境変数を置き換え、正しいレンダーノードを選択:

transcode_h264_intel.sh
LIBVA_DRIVER_NAME=iHD ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi -i input.mp4 -c:v h264_vaapi -rc_mode CQP -global_quality:v 24 -c:a copy output-h264.mp4

自分のハードウェアに適したデバイスを見つけるには render-node identification post を使用。

関連記事


同じカテゴリの類似記事をチェック: ビデオ Linux