ユーザーブロマガは2021年10月7日(予定)をもちましてサービスを終了します

【FFmpeg】NVENC (H.265/HEVC)を使って60fps(CFR)でゲームを録画したい【脱Shadow Play】
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

【FFmpeg】NVENC (H.265/HEVC)を使って60fps(CFR)でゲームを録画したい【脱Shadow Play】

2017-08-27 05:21

    Nvdiaが提供するShadow Play(Share)は低負荷、低容量の録画ソフトとして高く評価されているようですが、
    ・プライマリモニタしか録画できない
    ・指定ウィンドウのみを録画できない
    ・CFRで録画できない
    ・その他詳細な設定ができない
    などなど個人的には使いにくいと感じています。

    Shadow PlayではNVENC H.264を使ってエンコードしているようですが、せっかくNVENC H.265/HEVCが使える環境(GTX 960)にあるのでそれで録画できるソフトがないかと探してみたら、有名なものではBandicamくらいしかないっぽい・・・かといって有料版を買う気にもなれない。

    悩んでいたところFFmpegでもNVENCを使えることを思い出していろいろ試してみました。
    その結果、なんとか実用的なものになったのでメモしておきます。

    ◆必要なもの
    ・Windows 8 / Windows 10 (Windows 7ではAeroを無効化しないとfpsが半減)
    ・NVENC (H.265/HEVC)に対応したNvdiaグラフィックボード (GTX900シリーズ以降)
    (NVENC H.264を使う場合はGTX600シリーズ以降)

    ・最新のNvdiaグラフィックボードドライバ
    FFmpeg
    ・キャプチャーソフト (FFmpegからDirectShowデバイスとして取り込めるもの)
    ・ステレオミキサー (〃)
    FFmpegRec (自作バッチファイル)

    FFmpegはコマンドラインから起動するものですが、毎回手打ちというのも面倒なのでFFmpegRecなるバッチファイルを作成しました。(自分用につくったのでかなり雑な仕様になっています。)
    その使用方法を書く前に、キャプチャーソフト/ステレオミキサーの準備から書いておきます。

    キャプチャーソフトはあらゆるものを試したのですが、
    自分の環境では、60fpsで録画するという条件では、AmaRecTV4のデスクトップキャプチャーモード経由の【AmaRec Video Capture】くらいしかまともに使えませんでした。
    (60fpsでキャプチャーしても実際は30fpsだったり、重複フレームが大量にあったり)
    (AmaRecTV4からはWindows 8から追加されたDesktop Duplication APIを使用しているため60fpsキャプチャが可能 参考1 参考2)

    ステレオミキサーは標準で入っているもので構いませんが、自分の環境ではノイズが入ることがあったので【virtual-audio-capturer】というオープンソースのものを使うことにしました。また設定が必要ですが、「アマミキ!」経由で【AmaRec Audio Capture】を使ってもよいかもしれません。
    (AmaRecTV4経由のAmaRec Audio Captureでは何故かフリーズが多発したためアマミキ!経由にしています。)

    ◇AmaRec Video Captureの準備
    詳しい解説はオンラインヘルプページをご覧ください。

    アマレコTV公式ホームページから「アマレコTV4 Live」をダウンロードして適当な場所に解凍し、AmaRecTV4を起動。


    最初のメッセージはShiftを押しながらOKを押すと次回起動時から表示されなくなります。


    次のメッセージはOKで進み、「ヘルプ」をクリックすることで次回起動時から表示されなくなります。




    一度AmaRecTV4を終了させます。

    ライブ機能を使うために、アマレコTV公式ホームページから今度は「アマレコTV Live アマミキ! Ver3.10」をダウンロードして解凍し、中身の「live_setup300.exe」を実行します。



    AmaRecTV 3.10は今回は使わないためインストールが終了したら削除しても構いません。
    (アマミキ!を使用する方は残しておいてください。)

    再びAmaRecTV4を起動
    画面右クリック→設定→グラフ 4:ライブを開き、「ライブ機能を使う」にチェックを入れ、フレームレートの目安を60、サンプリングレートを44100に設定します。(今回は音声出力は使いませんがエラー表示を避けるため44100に)



    設定したら「適用」または「OK」

    次にグラフ 1:デバイスを開き、「デスクトップキャプチャーモード」をクリックし、設定




    ここでオーディオキャプチャデバイスは(使わない)に変更しておきます。


    設定したら「適用」または「OK」
    設定を閉じると青い枠が表示されます(表示されない場合は画像の部分をクリック)



    まずは青枠左上のボタン
    左側をクリックしながらマウスを動かすとキャプチャーするウィンドウを選択できます。
    右側はウィンドウのクライアント領域を選択、通常はこちらを使います。



    青枠を右クリックするとメニューが開きます。
    ここでキャプチャーモード(キャプモ)を選択できますが、なるべく「ウィンドウ・キャプチャ」を使うようにします。
    (「ウィンドウ・キャプチャ」でキャプチャできないものだけ他2つを使う)


    60Hzモニターにおいて、フレームレートは次のように設定します。
    「ウィンドウ・キャプチャー」→「Monitor Rate」(60.00でもいいかも?)
    「デスクトップ・キャプチャ」「デスクトップ・ウィンドウ指定」→「60.00」
    (Monitor Rateにすると30fpsになってしまうっぽい?)



    設定できたら右下の「SET」をクリック
    これでアマレコ画面にキャプチャー範囲のプレビューがされているはずです。

    これでビデオデバイスの準備は完了
    録画するときは常にAmaRecTV4を起動しておくように
    今回はアマレコの映像デバイスとしてデスクトップキャプチャーを使っていますが、デバイスをキャプチャーボードに設定してライブ機能で出力してやればゲーム機からの映像も録画できます。


    ◇virtual-audio-capturerの準備

    virtual-audio-capturerはオープンソースの「screen-capture-recorder-to-video-windows-free」に付属する仮想ステレオミキサーです。
    Github

    インストーラ配布ページから最新版をダウンロードして実行します。


    言語は適当に



    インストールが完了したら準備完了

    ◇FFmpegRecの準備と録画

    FFmpegRecをダウンロードし適当な場所に解凍


    FFmpegの最新のWindowsビルドをダウンロード
    AmaRec Video Captureは32bit版FFmpegでしか取り込めないため、
    64bitOSでも32bit版をダウンロードします。

    FFmpegを解凍して、binフォルダの中にある「ffmpeg.exe」をFFmpegRecの「FFmpeg」フォルダにコピー




    ここで「List_Devices_FFmpegRec.bat」を実行(ダブルクリック)してffmpegで使用可能なDirectShowデバイスのリストを表示します。
    ここにAmaRec Video Captureとvirtual-audio-capturerがあるか確認してください。



    続いてconfig.txtをメモ帳などで開いて録画設定をします。
    注意すべき項目だけ記載(その他はわかる人だけ変更してください)
    必須と書かれているもの以外は先頭のセミコロン[;]の有無で無効/有効を切り替えられます。([;]有り無効,[;]無し有効)
    ★は必ず確認すること
    config.txt
    FFMPEG:録画ファイル出力フォルダのパス(先程のFFmpegフォルダにFFmpeg.exeを入れておけば、変更する必要なし)
    OUT_DIR:録画ファイル出力フォルダのパス

    ★VIDEO_DEVICE/AUDIO_DEVICE:DirectShowデバイスのリストに表示されているものを""をつけて指定

    VIDEO_BITRATE:映像ビットレート 20000k~40000kくらいを目安に(1280x720,60fpsの場合)
    画質に最も影響するのでいろいろ試してみること
    AUDIO_BITRATE:音声ビットレート FFmpeg内臓のAACは音質の評判があまりよろしくないのでデフォでは多めの320k(映像と比べれば誤差なので)

    MAX_TIME:最大録画時間 録画停止忘れを防ぐために1,2時間程度に設定して有効化([;]を外す)を推奨

    VIDEO_CODEC:映像コーデック
    指定可能コーデック
    [h264_nvenc]:NVENC (H.264/AVC)
    [hevc_nvenc]:NVENC (H.265/HEVC)
    [h264_qsv]:QSV (H.264/AVC)
    [hevc_qsv]:QSV (H.265/HEVC)
    [libx264]:x264 (H.264/AVC)
    [libx265]:x265 (H.265/HEVC)
    [copy]:非圧縮
    など
    h264_nvencだけはなぜか指定したビットレートよりかなり低いビットレートで録画されてしまう(画質も落ちている)。AVOPTIONSのqmaxを1~2程度下げてみるといいかもしれない。
    libx264,libx265は通常のソフトウェアエンコードなので高負荷 録画には非推奨

    AUDIO_CODEC:音声コーデック
    その他指定可能コーデック
    [aac]:AAC(FFmpeg内臓)
    [libmp3lame]:LAME MP3
    [ac3]:AC3
    *[libfdk_aac]:FDK-AAC
    *[libfaac]:FAAC
    [libopus]:Opus
    [libvorbis]:Ogg Vorbis
    [copy]:非圧縮
    など
    *公式ビルドには含まれていない(ライセンスの問題で配布できない)ため指定するには自前でビルドする必要あり
    選択可能ならlibfdk_aacがベスト

    AR:出力サンプリングレート 既定の再生デバイスのサンプリングレートがvirtual-audio-capturerを通してそのままのサンプリングレートで出力されてしまうので、44100Hzまたは48000Hzで出力するために有効化(編集するときのサンプリングレートに合わせておく)

    きちんと設定出来たら「FFmpegRec_v1.0.bat」を起動して、何かキーを押して録画開始します。
    正常に録画できていれば次のように表示されます。



    録画ファイルをMediaInfoで開いてCFRで出力されているか確認してみましょう。


    HEVCコーデックの映像の再生にはMPC-HCをオススメします。
    オプション→内部フィルタ→ビデオ デコーダからハードウェアアクセラレーションのHEVCにチェックを入れておけば低負荷で再生できるはずです。



    手順は面倒かもしれませんが、CFR,ウィンドウ指定の録画などShadowPlayの弱点をうまくカバーできていると思います。
    ただ、H.265とはいえ高ビットレート帯ではNVENC H.264とあまり差をつけられないようですハードウェアデコードができない場合は再生負荷も大きいのでやはりNVENC H.264にしておくべきかもしれません。(h264_nvencを指定)
    NVENC自体今でも開発が進んでいますし、FFmpeg内臓のNVENCも頻繁に更新されているので今後のオプション充実などに期待ですね。
    その他何か気になることがあればコメントください。

    エラー発生時の対処

    正しい対処でない可能性が高いですが一応

    ◇[Past duration 0.xxxxxx too large]が大量に表示される
    ⇒たまに発生する程度なら録画やり直して発生しないことを祈る
    頻繁に発生するなら;FRAME_DROP_THRESHOLD=-1.1の;を外して値を調整
    (指定しない場合はデフォルトで-1.1)
    少しずつ増やしてみる
    2.0近くまで上げるとdupやdropがみるみる増えていくことがあるので注意

    以下の方法でも回避できるかもしれないが、弊害があるので非推奨。
    ・VSYNC=passthroughに設定(CFRではないファイルができることがある)
    ・FRAMERATE,INP_FRAMERATEを同じ値にして有効化(じわじわと音ズレが訪れるかも)

    [No NVENC capable devices found]が表示されて録画できない
    ⇒グラフィックボードがNVENCに対応していない、またはその一部オプションが対応していない可能性があります。
    確かにNVENCに対応したグラフィックボードを使っているならば、HEVC_NVENC_OPTまたはH264_NVENC_OPTの一部を削ってみてください。
    使えるなら-zerolatency trueは残すように


    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。