web-dev-qa-db-ja.com

品質を損なわずにx265(HEVC)でビデオライブラリを再エンコード

スペースを確保するために、ビデオライブラリをHEVC形式に変換しようとしています。ライブラリ内のすべてのビデオファイルに対して次のコマンドを実行しました。

#!/bin/bash
for i in *.mp4;
do 
    #Output new files by prepending "X265" to the names
    avconv -i "$i" -c:v libx265 -c:a copy X265_"$i"
done

現在、ほとんどのビデオは正常に変換され、品質は以前と同じです。ただし、非常に高品質のビデオ(たとえば、5GBの1つの映画のプリント)のいくつかは品質を失います-ビデオはすべてピクセル化されています。

この場合、どうすればよいかわかりません。コマンドラインでcrfパラメータを変更する必要がありますか?または、他の何か?

実は、私は一括変換を行っています。したがって、各ビデオに対して、avconvが調整が必要なパラメータを自動的に調整するメソッドが必要です。

アップデート-1

crfは調整する必要があるノブであることがわかりました。デフォルトのCRFは28です。品質を高めるには、28未満の値を使用できます。次に例を示します。

avconv -i input.mp4 -c:v libx265 -x265-params crf=23 -c:a copy output.mp4

ただし、問題があるのは、一部のビデオではCRF値28で十分な場合がありますが、一部のビデオでは、低いCRFが必要です。これは、大きな動画の小さなセクションを変換して手動で確認する必要があるものです。しかし、一括変換では、各ビデオを手動で確認するにはどうすればよいですか? avconvが入力ビデオに応じてCRFをインテリジェントに調整できる方法はありますか?

アップデート-2

--lossless x265のオプション: http://x265.readthedocs.org/en/default/lossless.html

しかし、私はそれを正しく使用する方法を知りません。次の方法で使用してみましたが、逆の結果が得られました(ビデオはさらにピクセル化されていました)。

avconv -i input.mp4 -c:v libx265 -x265-params lossless -c:a copy output.mp4
47
shivams

私自身の経験から、品質の低下を絶対に望まないのであれば、-ロスレスはあなたが探しているものです。

avconvについては不明ですが、入力したコマンドは、私がFFmpegで行ったものと同じに見えます。 FFmpegでは、次のようにパラメーターを渡すことができます。

ffmpeg -i INPUT.mkv -c:v libx265 -preset ultrafast -x265-params lossless=1 OUTPUT.mkv

ほとんどのx265スイッチ(値のないオプション)は、このように指定できます(CLIのみのスイッチを除き、これらはx265バイナリでのみ直接使用されます)。

これで、私の経験をx265エンコーディングで共有したいと思います。ほとんどのビデオ(WMV、MPEG、AVC/H.264など)では、crf=23を使用します。 x265は残りのパラメーターを決定し、通常は十分に機能します。

ただし、ビデオ全体のトランスコードを行う前に、問題のビデオの一部を変換して設定をテストすることがよくあります。以下に例を示します。ストリーム0がビデオ、ストリーム1がDTSオーディオ、ストリーム2が字幕であるmkvファイルがあるとします。

ffmpeg -hide_banner \
-ss 0 \
-i "INPUT.mkv" \
-attach "COVER.jpg" \
-map_metadata 0 \
-map_chapters 0 \
-metadata title="TITLE" \
-map 0:0 -metadata:s:v:0 language=eng \
-map 0:1 -metadata:s:a:0 language=eng -metadata:s:a:0 title="Surround 5.1 (DTS)" \
-map 0:2 -metadata:s:s:0 language=eng -metadata:s:s:0 title="English" \
-metadata:s:t:0 filename="Cover.jpg" -metadata:s:t:0 mimetype="image/jpeg" \
-c:v libx265 -preset ultrafast -x265-params \
crf=22:qcomp=0.8:aq-mode=1:aq_strength=1.0:qg-size=16:psy-rd=0.7:psy-rdoq=5.0:rdoq-level=1:merange=44 \
-c:a copy \
-c:s copy \
-t 120 \
"OUTPUT.HEVC.DTS.Sample.mkv"

長いコマンドではバックスラッシュが信号線の切れ目を示していることに注意してください。これは、複雑なCLI入力のさまざまなビットを追跡できるようにするためです。 1行ずつ説明する前に、ビデオのごく一部のみを変換する部分が2行目と最後の2行目です。-ss 0は入力のデコードを開始する前に0秒にシークし、-t 120は120秒後の出力。 hh:mm:ssまたはhh:mm:ss.sss時間形式を使用することもできます。

行ごとに:

  1. -hide_bannerは、開始時にFFmpegがビルド情報を表示しないようにします。コンソールを上にスクロールしても見たくありません。
  2. -ss 0は、入力のデコードを開始する前に0秒までシークします。このパラメーターが入力ファイルのおよびに指定されている場合、それはoutput optionそしてffmpegにx秒まで入力をデコードして無視し、次に出力への書き込みを開始するように指示します。入力オプションとしては、精度は低くなりますが(ほとんどのコンテナー形式ではシークが正確でないため)、ほとんど時間がかかりません。出力オプションとしては非常に正確ですが、指定された時間より前にすべてのストリームをデコードするにはかなりの時間がかかります。テスト目的で時間を無駄にしたくない場合。
  3. -i "INPUT.mkv":入力ファイルを指定します。
  4. -attach "COVER.jpg":出力にカバーアート(サムネイル画像、ポスターなど)を添付します。通常、カバーアートはファイルエクスプローラーに表示されます。
  5. -map_metadata 0:入力0からすべてのメタデータをコピーします。この例では単なるメタデータです。
  6. -map_chapters 0:入力0からチャプター情報(存在する場合)をコピーします。
  7. -metadata title="TITLE":ビデオのタイトルを設定します。
  8. -map 0:0 ...:入力0のストリーム0をマップします。つまり、入力からの最初のストリームを出力に書き込みます。このストリームはビデオストリームであるため、outputの最初のvideoストリームであり、ストリーム指定子:s:v:0です。言語タグを英語に設定します。
  9. -map 0:1 ...:8行目と同様に、2番目のストリーム(DTSオーディオ)をマップし、その言語とタイトルを設定します(プレーヤーから選択するときの識別を容易にするため)。
  10. -map 0:2 ...:このストリームが字幕であることを除いて、9行目と同様です。
  11. -metadata:s:t:0 ...:カバーアートのメタデータを設定します。これは、mkvコンテナー形式に必要です。
  12. -c:v libx265 ...:ビデオコーデックオプション。長すぎるので、2行に分けました。この設定は、グラディエントのバンディングが最小限の(x265が吸い込む)高品質のBlurayビデオ(1080p)に適しています。これは、DVDやテレビ番組、電話ビデオにとってはやり過ぎである可能性が高いです。この設定は主に this Doom9 post ;から盗まれます。
  13. crf=22:...:ビデオコーデックパラメータの続き。上記のフォーラム投稿を参照してください。
  14. -c:a copy:オーディオをコピーします。
  15. -c:s copy:字幕をコピーします。
  16. -t 120:120秒後に出力への書き込みを停止します。これにより、トランスコーディングの品質をプレビューするための2分のクリップが提供されます。
  17. "OUTPUT.HEVC.DTS.Sample.mkv":出力ファイル名。ビデオコーデックとプライマリオーディオコーデックでファイル名をタグ付けします。

ふew。これが私の最初の答えです。見逃したことがあれば、コメントを残してください。私はビデオ制作のエキスパートではありません。ディスクをプレーヤーに挿入して映画を見るのが面倒なので、私はただの男です。

PS。たぶん、この質問はUnixとLinuxに強く関連していないため、他のどこかに属しています。

62
Yifeng Mu

最近、ビデオカタログ全体をHEVCにトランスコーディングする問題を経験しました。私は https://github.com/FallingSnow/h265ize を次の設定で使用します。

h265ize -v -m medium -q 20 -x --no-sao --aq-mode 3 --delete --stats

-v-詳細出力
-m medium-中程度のエンコード速度(小さいほど高品質、遅いと感じるものは時間/品質の差分に値しません)
-q 20-使用されるCRF、20はx264の18とほぼ同じですが、ちょっとです。これは1080pコンテンツ(私のテレビの90%)用です。4K映画には22を使用する傾向があります
-x-x265中央定義コマンドを使用
-no-saoはサンプルアダプティブオフセットをオフにします(エンコードの速度が向上します)
-aq-mode 3-自動分散を使用して適応量子化を使用すると、特に暗い領域での8ビットエンコードに役立ち、ほとんどの発生する可能性のあるバンディング(ただし、エンコード時間はかかります)
-delete-エンコードファイルをエンコードファイルに置き換えます(これを使用する前にテストします)
-stats-実行したパスのルートにあるcsvファイルに統計を書き込みます。

エンコード速度は、私のリグで約30fps(ほとんどの1080pのものに対して)です。デュアルXeon E5 2687W v2ですが、FFMPEGプロセスがいずれかのプロセッサの最初のサイドを使用しないように強制します(これは私のPlexサーバーであるため、再生などで必要に応じてトランスコードのオーバーヘッドがあることを確認する必要があります)

はい、ほとんどを変換するのにしばらく時間がかかりました。現在、1日2回実行して、その日からx265にデータをエンコードするスケジュールされたタスクがあります。

スペースの節約は莫大です。私の最初のSANは20Tb使用でしたが、現在は約12ですが、明らかに6か月以上のコンテンツが追加されています。

私もすべての映画をトランスコードし始めましたが、IDの品質レベル(幸いなことにRadarrが適切にラベルを付ける)と3つのトランスコード設定のいずれかを使用する必要があるため、これは継続的なプロセスです。

-m slower -q 18 -x --no-sao --aq-mode 3 720pトランスコード
-m medium -q 20 -x --no-sao --aq-mode 3 for 1080p
-m medium -q 22 -x --no-sao for 2160p

それが一部の人々に役立つことを願っています。誰かがそれをすべて設定する手が必要な場合は叫んでください。そして、すべてをx265にエンコードする前に、再生について考えてください。クライアントがx265ネイティブをサポートしていない場合、トランケードはCPUと品質の点で高価になる可能性があります。

Ffmpegでx265エンコーダーのロスレスモードを有効にする正しい構文は-x265-params lossless=1(追加する必要があります=1)。

ただし、ロスレスコーディングの場合、より優れたコーデックの選択肢があります。 FFV1 は、少なくとも一部の種類のビデオで圧縮率が非常に高い(ファイルサイズ= x265の〜80%)(両方のコーデックに最適な設定が選択されている場合)ことを確認しました。そしてそれはまたより速く働き、(AFAIK)は特許によって妨げられません。つまり、ビデオアーカイブのあらゆる点で、ロスレスH.265よりも優れています。

3
Display Name