・--audio-copyの際のエラー回避を追加。
ダウンロード>> ダウンロード (ミラー) >> OneDriveの調子がいまいちの時はミラー(GDrive)からどうぞ。同じものです。
スポンサーサイト
修正ありがとうございます
クラッシュしなくなるのを確認しました。
が、じつは無限ループで止まるケースもありまして、
そちらもいちおう報告しておきます。
とある入力ファイルに対して
> [mpegts @ ...] PES packet size mismatch
> Failed to add frame into the encoder.
> Failed to add frame into the encoder.
> Joined Encoce thread
>
> avout: Flushed audio buffer.
このログを最後にプロセスが終了しないことがあるのですが、
環境によって再現性がなかったりします。
プロセスが終了しないケースでは下記のコールスタックで停止していました。
WaitForSingleObject
ProcessOutput
FlushEncoder
Encode
こちらはNVEnc固有だと思いますが、
NVEncでも環境によって再現性がなかったりします。
無限ループ、は語弊がありますね。
WaitForSingleObject INFINITEの同期から脱出できない状況です。
フリーズしてしまう現象報告いただきありがとうございます。
入力が正常に行われなかったときに、WaitForSingleObjectでフリーズしてしまうという感じですね。これも入力ファイル依存のようなので再現・解決が難しそうです。
CPUとGPUの性能比にも依存している気がします。
とりあえずINFINITEを30秒くらいにしてバッチが止まらないようにしてみます。
もう少し詳しく見たところ単にGPUによって挙動が違うようです。
GTX 750 TiだとNVEncCore::EncodeFrameのcuMemcpy2DがCUDA_ERROR_UNKNOWNで返ってきてエンコードが終了しないのですが、
GT 730だとCUDA_SUCCESSで正常終了します。
ソースはMPEG2なのですが、試しにデコーダエンジンをCUVIDからCUDAに変えるとGTX 750 Tiでも正常終了するようになりました。
m_videoDecodeCreateInfo.ulCreationFlags = m_videoDecodeCreateInfo.CodecType == cudaVideoCodec_MPEG2 ? cudaVideoCreate_PreferCUDA : cudaVideoCreate_PreferCUVID;
ちなみに、GTX 750 Ti、GT 730ともにCUDAデコードの方が高速のようです。
とくにGT 730はfpsが237.73から486.79へ2倍速くなりました。(ただしエンコード負荷--output-res 32x32)
オプションでデコーダを選択できるようにしてもいいかもしれません。。。
すいません、改めて測ったら750 TiはCUDAの方が遅かったです。。
614.01 fps # cuvid
524.40 fps # cuda
730だとほぼ100%だったGPU使用率が15%くらいしか動いていませんでした。
CPU使用率もCUDAの方が高くなるのでいいとこなしでした。
うーん、なるほど…。
CUDAでないと動かない場合もあるということなので、今やっていることが片付いたらオプションを追加してみようと思います。