FFmpeg libx265とhevc_nvenc

FFmpeg libx265とhevc_nvenc

Nvidiaグラフィックカードがあり、独自のドライバを使用しています。

利用可能なffmpeg H265エンコーダを見て、hevc_nvencを見つけました。 hevc_nvencを使用すると、実際にGPUを使用してビデオをエンコードするため、エンコード時間は大幅に長くなりますが、出力ファイルのサイズははるかに大きくなります。

例:(input.mp4はH264とaacです)

ffmpeg -hwaccel cuda -i input.mp4 -c:v libx265 -c:a libopus -crf 26 libx265_output.mkv

ffmpeg -hwaccel cuda -i input.mp4 -c:v hevc_nvenc -c:a libopus -crf 26 hevc_nvenc_output.mkv

ファイルサイズは次のとおりです。

input.mp4             351M
libx265_output.mkv    134M
hevc_nvenc_output.mkv 360M

ffprobe は、出力を hevc エンコードとして表示し、入力を h264 として表示します。

それでは、 hevc_nvenc のパフォーマンスがなぜそれほど良くないと思いますか?私が逃したものが必要です。

ベストアンサー1

修正する

ハードウェアアクセラレータエンコーダは、-crfサイズ/質量比を決定するために一定の比率係数(CRF)をサポートしません。たとえば、を使用してエンコーダがサポートしていることを確認できますffmpeg -h encoder=hevc_nvenc -hide_bannerDennis Mungaiの詳細な回答到着する」ffmpegでnvencでCRFエンコーディングを使用する方法は?Superuserは、可変ビットレートで一定の品質を得るためにパラメータを-cq:v 19使用することを提案しています。-rc:v vbrあなたの状況に役立つと考えてください。

-cq定数の品質(によって決定される)が代わりに定数量子化パラメータ(CQP)によって設定されるという点で、これがCRFとは異なることは注目に値します。これはから来たものですWerner RobitzaのCRFガイドCRFが一定のQP設定と比較してビットを節約できる理由を説明してください。

...量子化パラメータは、指定されたピクセルブロック(マクロブロック)からどのくらいの情報が削除されるかを定義します。これにより、シーケンス全体でビットレートが大幅に変化することがよくあります。

固定率係数はこれより少し複雑です。特定のレベルの認知品質を維持するために、必要に応じてQPを変更してさまざまなフレームをさまざまな量に圧縮します。これは動きを考慮して行われる。 …


元の答え

ffmpegWikiは主張するこれはハードウェアアクセラレーションエンコーディングの一般的なケースです。

ハードウェアエンコーダは、x264などの優れたソフトウェアエンコーダよりもはるかに低い品質の出力を生成することがよくありますが、通常は高速でCPUリソースをあまり使用しません。 (つまり、同じ知覚品質で出力を生成するには、より高いビットレートが必要か、または同じビットレートでより低い知覚品質で出力を生成します。)

Peter Cordes は以下の説明を提案しています。Video Production Stack Exchangeに対する彼の回答到着する」GPUよりもプロセッサがコーディングに優れているのはなぜですか?':

私の理解ビデオエンコーディングの検索スペースは大きすぎるため、検索パスを早期に終了するCPUのスマートヒューリスティックは、少なくとも高品質エンコーディングの場合、強力なGPUを圧倒します。-preset ultrafast特にx264の代わりにHWエンコーディングを合理的に選択できる場合と比較しただけです。 CPUが遅い場合(たとえば、デュアルコアを持ち、ハイパースレッディングを持たないノートブック)、高速CPU(ハイパースレッディングを含むi7クアッドコア)では、x264はsuperfastおそらく同じ速度で高速で見やすくなります(同じビットレートで)。

比歪み(ファイルサイズあたりの品質)が重要なエンコードを実行する場合は、x264-preset medium以下を使用する必要があります。何かをアーカイブする場合は、ファイルをアーカイブする限り、CPU時間を増やすことでバイトを節約できます。

おすすめ記事