品質を失うことなくx265(HEVC)でビデオライブラリを再エンコードします。

品質を失うことなく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の映画のコピーなど)は品質が低下し、ビデオはすべてピクセル化されます。

この状況でどうすればいいかわかりません。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

--losslessx265にオプションがあることがわかりました。http://x265.readthedocs.org/en/default/lossless.html

しかし、正しく使用する方法がわかりません。私は次のように試しましたが、反対の結果が出ました(ビデオがよりピクセル化されました)。

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

ベストアンサー1

私の経験によれば、品質の低下がまったく発生しないようにしたい場合は、ロスレスが欲しいです。

わかりませんが、avconv入力したコマンドは私が使用したコマンドと同じように見えますFFmpeg。次のパラメータを渡すことができますFFmpeg

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

ほとんどのスイッチ(値のないオプション)はこの方法で指定できます(バイナリでのみ直接使用されるx265CLIを使用するスイッチを除く)。x265

その意味で、私は私のコーディング経験を共有したいと思いますx265。ほとんどのビデオ(WMV、MPEG、またはAVC / H.264)の場合crf=23x265

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

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 120120秒後に出力への書き込みを停止するという意味です。 。 hh:mm:ssまたはhh:mm:ss.sss時間形式を使用することもできます。

今1行ずつ:

  1. -hide_bannerFFmpeg起動時にビルド情報が表示されないようにします。コンソールで上にスクロールするときにそれを見たくないだけです。
  2. -ss 0入力デコードを開始する前に0秒間探します。このパラメータが提供されている場合は注意してください。後ろに入力ファイルと今後出力ファイルは出力オプションそして、ffmpegx秒まで入力をデコードし、無視して出力書き込みを開始します。入力オプションとして精度は低下しますが(ほとんどのコンテナ形式の照会は正確ではないため)、時間がかかりません。出力オプションとして非常に正確ですが、指定された時間より前にすべてのストリームをデコードするのに多くの時間が必要であるため、テスト目的で無駄にしたくありません。
  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をマッピングします。つまり、入力の最初のストリームが出力に書き込まれることを意味します。ストリームはビデオストリームなので最初です。動画流入出力したがって、ストリーム指定子: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行に分けました。この設定は、グラデーションのバンディングが最小限に抑えられた高品質のブルーレイビデオ(1080p)に適しています(x265はこの場合は悪い)。 DVD、テレビ番組、電話ビデオの場合、これはおそらく過剰です。この設定のほとんどはこのDoom 9の投稿;
  13. crf=22:...:ビデオコーデックパラメータの連続。上記のフォーラム投稿をご覧ください。
  14. -c:a copy:オーディオコピー。
  15. -c:s copy:字幕コピー。
  16. -t 120:120秒後に出力書き込みを停止します。これにより、トランスコーディング品質をプレビューできる2分の長さのクリップが提供されます。
  17. "OUTPUT.HEVC.DTS.Sample.mkv":出力ファイル名です。ビデオコーデックとデフォルトのオーディオコーデックでファイル名にタグを付けます。

呼ぶこれが最初の答えです。欠落しているものがあればメッセージを残してください。私はビデオ制作の専門家ではなく、プレーヤーにディスクを入れて映画を見るにはあまりにも怠惰な人です。

PS。この質問はUnixやLinuxとはあまり関係がないので、他の質問に属することもできます。

おすすめ記事