OBSのカスタム出力でQSVを使う
OBS 29.0.2 Windows 版のカスタム出力 (FFmpeg) のエンコーダとして Intel の Quick Sync Video (QSV) が選べなかったので、無理やり選べるようにしました。
OBS のフォルダ内にある avcodec-59.dll を BtbN / FFmpeg-Builds の Auto-Build 2023-03-28 12:47 版で置き換えれば OK でした。
手順は次のとおりです。
上記、BtbN / FFmpeg-Builds のページの "ffmpeg-n5.1.3-win64-gpl-shared-5.1.zip" をダウンロード・解凍します。
解凍したフォルダの中の bin フォルダの中にある avcodec-59.dll ファイルを、下記、OBS フォルダ内の同名のファイルと置き換えます。
C:\Program Files\obs-studio\bin\64bit\avcodec-59.dll
なお、今回の方法では無理やり dll を置き換えていますが、本来は OBS をビルドし直すのが安全です。この方法を試す場合には、自己責任でお願いします。
設定例
今回は、キャプチャ映像を動画コンテンツの素材として使えるよう、配信用の設定とは違い、高画質になるようにしてみました。
想定する映像フォーマットは 1080p、60fps。
サンプルの映像ソースは BLUE PROTOCOL ベンチマーク (最高画質) です😎
コーデックはファイルサイズ対品質の効率が高そうな HEVC (H.265)、レート制御は Intelligent Constant Quality (ICQ) を選択しました。
実際の設定は以下のとおりです。
コンテナフォーマット: matroska
映像ビットレート: 1 Kbps
キーフレーム間隔 (フレーム): 120
すべてのコーデックを表示: チェックする
映像エンコーダ: hevc_qsv (libx265)
映像エンコーダ設定 (ある場合): profile=main preset=fast global_quality=23 look_ahead=1 look_ahead_depth=30
音声ビットレート: 32 Kbps
音声エンコーダ: flac
設定項目の詳細
映像ビットレート
ICQ の場合、ビットレートは関係ないので適当でよいです。ただし、0 を指定するとエラーが出るので、1 にしました。
キーフレーム間隔
120 フレーム (60 fps で 2 秒) に設定。キーフレームは編集ポイントになるので増やしたいですが、間隔を狭めると、ファイルサイズが大きくなるので、このくらいで妥協…。
映像エンコーダ
HEVC (H.265) を選択。H.264 (h264_qsv) も選べますが、H.264 の場合、後述の look_ahead を 1 にするとエラーになるので注意。
profile=main
多分、デフォルトで main だと思いますが、とりあえず明示的に指定しておきました。
preset=fast
はじめに slow を設定していましたが、私の CPU (i7-12700) では映像がコマ落ちしてしまいました。medium で概ね大丈夫そうですが、長時間録画した後にコマ落ちしてたら嫌すぎるので、念のため fast まで品質を下げます。
ただ、私の目には preset の違いはあまり画質には関係ないように見えます。それより後述の global_quality の方が重要に感じます。
global_quality
global_quality を指定することで、レート制御が ICQ になります。
値が小さいほど高画質になります。
色々試してみて、最終的に 23 に。画質かファイルサイズかで、後者を選びました。重い素材は扱いづらいので…。
完全に目視による判断ですが、画質的に理想的だと感じたのは 18 以下の値です。19 でもかなりいい方です。こういうのは自分の目で確かめるのが一番だと思ってます。
なお、global_quality の値を下げすぎると、ファイルサイズが膨大になるばかりか、ブロックノイズが乗ってしまいました。
look_ahead
先読みを有効にするには 1 を指定します。(デフォルトは 0)
前述のように、同じ QSV エンコーダでも、H.264 の場合はなぜかエラーになります。(FFmpeg の説明では使えるっぽいのになあ…😓)
先読みをするかしないかで、個人的には相当画質が変わるように思います。
先読みによって、リアルタイムトランスコーディングにありがちな、全体的にモワーっとした感じが少なくなり、映像がピシっとしまる気がしますね。
look_ahead_depth
何フレーム先読みするかを指定。
よく分からなかったので、とりあえず 30 フレーム (60fps で 0.5 秒) にしてみました。
とりあえず綺麗にエンコードできているので、これでよしとします😋
音声ビットレート / 音声エンコーダ
音声はとりあえずロスレス (FLAC) にしましたが、長時間録画する場合のファイルサイズが気になります。
ロスレスコーデックの場合、ビットレート設定は何でもかまわないので、とりあえず 32 Kbps を選択しました。
以上、参考になれば幸いです。