x265(HEVC)でビデオライブラリを再エンコードして品質を損なうことはありません


43

ビデオライブラリを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

ただし、問題は、一部のビデオでは28のCRF値で十分であり、一部のビデオではより低い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

1
--lossless実際には、以前に損失のあったコーデックをデコードし、その後損失なしでデコードしたものを含む場合、ファイルを拡大する可能性があります。品質は入力とまったく同じままです。
ゴラーランブラー

2
ソースが非可逆でエンコードされている場合(最も可能性が高い)、達成しようとしていることは不可能です。ロスレスではないトランスコーディングは、品質がさらに低下します(すぐに目に見えない場合でも)。ロッシーからロスレスに変換すると、ファイルサイズが大きくなります。
セージボルシュ

回答:


58

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

よくわかりません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=23x265残りのパラメータを決定し、通常は十分な仕事をします。

ただし、ビデオ全体をトランスコードする前に、問題のビデオの一部を変換して設定をテストすることがよくあります。ストリーム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入力のさまざまなビットを追跡できるようにするためです。行ごとに説明する前に、ビデオのごく一部のみを変換する部分は2行目と最後から2番目の行です:-ss 0入力のデコードを開始する前に0秒にシークすることを-t 120意味し、出力への書き込みを停止することを意味します120秒後。hh:mm:ssまたはhh:mm:ss.sss時間形式も使用できます。

行ごとに:

  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行に分けました。この設定は、グラデーションのバンディングを最小限に抑えた高品質のBluayビデオ(1080p)に適しています(x265でダメ)。これは、DVDやテレビ番組、電話のビデオにとってはおそらくやり過ぎです。この設定は主にこのDoom9投稿から盗まれます。
  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に強く関係していないので、他のどこかに属しているかもしれません。


2
まさに私が探していたもの!オプションの素敵な報道。c:s copy字幕コンテンツがない場合、ffmpegがbするかどうかを知っていますか?
オタク長老

1
@ElderGeekいいえ、ffmpegはそのオプションに効果がある場合にのみ発言します。
逸風ムー

このオプションは、真のロスレスh265エンコーディングで可能な限り最小のファイルサイズを生成しますか?そうでない場合、これを行う方法はありますか?
バッファーオーバーリード

1
@TheBitByte h265にはロスレス圧縮レベルはないと思います。圧縮なしのオプションの場合、それはただ--losslessです。私はh264からh265へのロスレス変換を無駄に検索しましたが、私が学んだことは数学的に不可能だと教えてくれました。
逸風ムー

1
--losslessこの質問に対する答えとしてそこに置くと、それがロスレス圧縮であると言っているように聞こえるので、この答えからの切り替えを含むコマンドを実際に編集する必要があります。
ハシム

8

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

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

-v-冗長出力
-m medium-中程度のエンコード速度(より小さな高品質、私が見つけたより遅いものは時間/品質difの価値はありません)
-q 20-使用されるCRF、20はx264で18程度ですが、ちょっとです。これは1080pコンテンツ(テレビの90%)向けです。4K ムービーには22を使用する傾向があります
-x -x265中央定義コマンドを使用します
--no-saoはサンプルアダプティブオフセットをオフにします(エンコードの速度を改善し
ます)-- aq-mode 3-適応分散量子化を自動分散とともに使用し、特に暗い領域で8ビットエンコードを支援し、発生する可能性のあるほとんどのバンディングを停止します(ただし、エンコード時間を犠牲にします)--
delete-エンコードファイルをエンコードファイルに置き換えます(これを使用する前にテストします)-
統計 -実行したパスのルートにあるcsvファイルに統計情報を書き込みます。

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

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

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

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

-m slower -q 18 -x --no-sao --aq-mode 3
-m medium -q 20 -x --no-sao --aq-mode 31080pの720pトランスコードの場合
-m medium -q 22 -x --no-sao2160pの場合

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


(新しいラムダテーブルとx265 2.4以降シャープなエンコードを与える)、SAOは通常、ビットレートごとの品質のために良いことです。それはまだわずかに汚れていますが、それだけの価値があるほど十分に他のアーティファクトを減らします。
ピーターコーデス

-q 20はCRF 20ではなく、一定のQPレート制御です。それは費やすことはありませんので、デフォルトと推奨モード、CRFは、複雑性の高いシーンでQPをいくつか上げすぎてあまりにもハードエンコードにしている場面に多くのビットを。(均一なQPに近づける場合qcompは、デフォルトの0.6から0.7または0.8 に上げます。1.0に近づけるとCQPに近くなります。)
Peter Cordes

3

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.