🎬

【ffmpeg】WindowsでQSVを使って動画を圧縮する

2024/08/13に公開

QSVはintelの内臓GPUやGPUで使うことができる、ハードウェアでのビデオデコード/エンコード技術である。処理時間がソフトウェアでのエンコード/デコードよりも大幅に高速であることが魅力だ。本記事では、ffmpegを使ってQSVを用いて動画を圧縮する方法を記す。
CPUの世代ごとに、利用できる機能が異なっているので、要確認だ。H.264は第6世代でデコード、エンコード対応し、第9世代で、H.265(HEVC)のデコード、エンコード対応している。第12世代では、VP9やAV1といった最新の企画にも対応しており、一般ユーザーが使用する分には過不足ない。
本記事では、サポートしている機能や、コマンド例が記載されているffmpeg公式のドキュメントを参考に、環境構築を進める。
https://trac.ffmpeg.org/wiki/Hardware/QuickSync

ffmpegのインストール

ffmepgの公式サイトから、ビルド済みの実行ファイルを取得することもできるが、私のおすすめはwingetを用いてインストールする方法。環境変数でpathを通す作業が不要になる。

  1. wingetが利用できるか確認
    PowerShellを開き、wingetと入力する。wingetについての情報がターミナルに表示されたら利用OK.
  2. wingetでffmpegを探す
winget search ffmepg


Gyan.FFmpegから始まる3つのソフトウェアがffmpeg。今回はフルバージョンを利用したいので、
Gyan.FFmpegを選択。

winget install Gyan.FFmpeg

以下の表示がでてきたら、インストール完了。

見つかりました FFmpeg [Gyan.FFmpeg] バージョン 7.0.2
このアプリケーションは所有者からライセンス供与されます。
Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
ダウンロード中 https://github.com/GyanD/codexffmpeg/releases/download/7.0.2/ffmpeg-7.0.2-full_build.zip
  ██████████████████████████████   162 MB /  162 MB
インストーラーハッシュが正常に検証されました
アーカイブを展開しています...
アーカイブが正常に展開されました
パッケージのインストールを開始しています...
コマンド ライン エイリアスが追加されました: "ffmpeg"
コマンド ライン エイリアスが追加されました: "ffplay"
コマンド ライン エイリアスが追加されました: "ffprobe"
パス環境変数が変更されました; 新しい値を使用するにはシェルを再起動してください。
インストールが完了しました

QSVが利用可能かどうか確認

powershellのターミナルで以下のコマンドを実行。

  1. エンコーダーの確認
    Linuxのgrepに相当するコマンドとして、Select-Stringを使用する。
ffmpeg -encoders|Select-String qsv

version 7.0.2では、末尾に以下の情報が表示される。これらがエンコード可能なフォーマットだ。

 V..... av1_qsv              AV1 (Intel Quick Sync Video acceleration) (codec av1)
 V..... h264_qsv             H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration) (codec h264)
 V..... hevc_qsv             HEVC (Intel Quick Sync Video acceleration) (codec hevc)
 V..... mjpeg_qsv            MJPEG (Intel Quick Sync Video acceleration) (codec mjpeg)
 V..... mpeg2_qsv            MPEG-2 video (Intel Quick Sync Video acceleration) (codec mpeg2video)
 V..... vp9_qsv              VP9 video (Intel Quick Sync Video acceleration) (codec vp9)

一応、デコードも確認する。

 ffmpeg -decoders|Select-String qsv

実行結果。

 V....D av1_qsv              AV1 video (Intel Quick Sync Video acceleration) (codec av1)
 V....D h264_qsv             H264 video (Intel Quick Sync Video acceleration) (codec h264)
 V....D hevc_qsv             HEVC video (Intel Quick Sync Video acceleration) (codec hevc)
 V....D mjpeg_qsv            MJPEG video (Intel Quick Sync Video acceleration) (codec mjpeg)
 V....D mpeg2_qsv            MPEG2VIDEO video (Intel Quick Sync Video acceleration) (codec mpeg2video)
 V....D vc1_qsv              VC1 video (Intel Quick Sync Video acceleration) (codec vc1)
 V....D vp8_qsv              VP8 video (Intel Quick Sync Video acceleration) (codec vp8)
 V....D vp9_qsv              VP9 video (Intel Quick Sync Video acceleration) (codec vp9)

デコードのほうが対応している形式が多いが、差分はvp8とvc1であり、一般的に使うことがないフォーマットなので、気にしなくて良いだろう。
なお、ここで表示されている情報は、ffmpegのソフトウェアが対応している形式であり、ハードウェア側のcapablity checkの結果ではないことに注意。
ネットの情報では、qsvを利用したければ、ffmpegのソースコードから自分で実行ファイルをビルドする必要がある、という記載もあったが、2024年8月現在ではそのようなことなくqsvが利用できる。良かった。

動画を圧縮する

動画を圧縮するコマンド例を示す。個人的に、動画の圧縮の際には解像度は変更せず、ビットレートのみ小さくすることが好みなので、解像度は下げない。

QSVで使用するオプションの説明

QSVで使用するオプションの説明をドキュメンテーションから引用しておく。
https://www.ffmpeg.org/ffmpeg-codecs.html#toc-QSV-Encoders

global_quality オプションについて

動画をエンコードする際に、動画の品質をquality based modeで指定するパラメータだ。h264_qsvとhevc_qsvでエンコードするときのみ利用可能。このオプションに数値を指定することで、出力される動画の品質を調整できる。
具体的には、
* qscaleコーデックフラグも設定されている場合: CQP(定量化スケール)モードが使用される。これは、-qscale ffmpegオプションを用いた場合に適用される。
* look_aheadオプションも設定されている場合: LA_ICQ(ルックアヘッド付きインテリジェント定品質)モードが使用される。
* それ以外の場合: ICQ(インテリジェント定品質)モードが使用される。ICQモードの場合、global_qualityの範囲は1から51で、1が最高の品質。

preset

このオプションは、veryfast(最高速度)からveryslow(最高品質)までの範囲を選択可能。

  • veryfast
  • faster
  • fast
  • medium
  • slow
  • slower
  • veryslow

H.264の場合

ffmpeg -hwaccel qsv -hwaccel_output_format qsv -i input.mp4 -c:v h264_qsv -preset veryfast -global_quality 40 output.mp4
オプション 説明
-hwaccel qsv, -hwaccel_output_format qsv QSVの使用を指定
-i input.mp4 変換元の動画ファイル
-c:v h264_qsv エンコーダーの指定。QSVを用いたh264でのエンコード。
-preset veryfast 変換速度を最速に
-global_quality 40 動画の品質の指定
output.mp4 変換後の動画ファイルの名前

HEVC(H.265)の場合

ffmpeg -hwaccel qsv -hwaccel_output_format qsv -i input.mp4 -c:v hevc_qsv -preset veryfast -global_quality 40 output.mp4
オプション 説明
-c:v hevc_qsv エンコーダーの指定。QSVを用いたh264でのエンコード。

最後に

自分の用途は記録用に撮影した動画のアーカイブなので、画質を犠牲にして処理速度と容量を重視している。各オプションを調整して、目的にあった用途に変換してほしい。
HEVCのほうがH.264と比べると容量が小さいので、HEVCをメインに使用したいが、windows10の標準プレイヤーに対応していないため、ビジネスユースでは使い勝手が悪い。windows10のサポートが終わり、windows11に完全に移行してからでないと、メインにするのは難しそうだ。。

Discussion