52

h264 で完全にロスレス エンコーディングを行うことは可能ですか? ロスレスとは、一連のフレームをフィードしてエンコードし、エンコードされたビデオからすべてのフレームを抽出すると、入力とまったく同じフレームがピクセルごと、フレームごとに取得されることを意味します. それは実際に可能ですか?次の例を見てください。

一連のフレームを生成し、イメージ シーケンスを非圧縮 AVI にエンコードし (virtualdub などを使用)、ロスレス h264 を適用します (ヘルプ ファイルでは、設定 --qp 0 を設定するとロスレス圧縮が行われると記載されていますが、つまり、プロセスのどの時点でも損失がないか、量子化だけが無損失であることを意味します)。その後、mplayer などを使用して、結果の h264 ビデオからフレームを抽出できます。

最初に Handbrake で試してみましたが、ロスレス エンコーディングをサポートしていないことがわかりました。x264 を試しましたが、クラッシュします。ソース AVI ファイルが YV12 ではなく RGB 色空間にあることが原因である可能性があります。一連の YV12 ビットマップをフィードする方法と、とにかく x264 にどのような形式でフィードするかがわからないため、試すことさえできません。

要約すると、それがそこからの道があるかどうか知りたいこと

一連のロスレス ビットマップ (任意の色空間) -> 何らかの変換 -> h264 エンコード -> h264 デコード -> 何らかの変換 -> 元の一連のロスレス ビットマップ

これを達成する方法があれば?

編集:ロスレスH264があまり意味をなさないことについて、非常に有効な点があります。圧縮されていないクリップと、H264 で高レートで圧縮された別のクリップの違いを (私の目だけで) 見分ける方法がないことは十分承知していますが、用途がないわけではないと思います。たとえば、ファイルを保存するたびに大量のスペースを使用したり、品質を低下させたり、エンコードに多くの時間を費やしたりすることなく、編集用のビデオを保存するのに役立つ場合があります。

更新 2:x264 がクラッシュしなくなりました。avisynth またはロスレス yv12 ラガリスのいずれかをソースとして使用できます (色空間圧縮の警告を回避するため)。ただし、 --qp 0 と rgb または yv12 ソースを使用しても、最小限ではあるが存在するいくつかの違いがあります。ロスレス予測コーディング (--qp 0) で見つけたすべての情報は、エンコーディング全体がロスレスであるべきだと主張しているため、これは厄介です。しかし、私はこれを検証できません。

4

8 に答える 8

32

YUV 4:4:4 ピクセルを x264 に変換する方法を一日中考え出そうとした後、これに遅い回答を追加します。x264 はファイル内の生の 4:2:0 ピクセルを受け入れますが、4:4:4 ピクセルを渡すのは非常に困難です。最近のバージョンの ffmpeg では、次のように完全にロスレス エンコーディングと抽出を行い、エンコーディングを検証します。

まず、未加工の yuv 4:4:4 ピクセルを平面形式でファイルに書き込みます。プレーンは Y バイトのセットであり、次に U と V バイトであり、U と V はゼロ値として 128 を使用します。ここで、ffmpeg を呼び出して生の YUV フレームのサイズを渡し、「yuv444p」ピクセル形式を 2 回使用します。

ffmpeg -y -s 480x480 -pix_fmt yuv444p -i Tree480.yuv \
-c:v libx264 -pix_fmt yuv444p -profile:v high444 -crf 0 \
-preset:v slow \
Tree480_lossless.m4v

h264 へのエンコードと Quicktime ファイルとしてのラッピングが完了すると、次のようにまったく同じバイトを抽出できます。

ffmpeg -y -i Tree480_lossless.m4v -vcodec rawvideo -pix_fmt yuv444p \
Tree480_m4v_decoded.yuv

最後に、diff を使用して 2 つのバイナリ ファイルを確認します。

$ diff -s Tree480.yuv Tree480_m4v_decoded.yuv
Files Tree480.yuv and Tree480_m4v_decoded.yuv are identical

YUV バイトを自分でファイルに書き込む必要があることに注意してください。ffmpeg に YUV 値の変換をさせないでください。

于 2013-08-29T09:05:33.250 に答える
5

x264 がロスレス エンコーディングを行うが、入力形式が気に入らない場合は、 を使用ffmpegして入力ファイルを処理することをお勧めします。次のようなものから始めてみてください

ffmpeg -i input.avi -f yuv4mpegpipe -pix_fmt yuv420p -y /dev/stdout \
  | x264 $OPTIONS -o output.264 /dev/stdin

そこからオプションを追加します。YUV4MPEG は、異なるビデオ ツール間のパイプに適したロスレス非圧縮形式です。ffmpeg は書き方を知っており、x264 は読み方を知っています。

于 2011-07-15T01:56:28.790 に答える
4

FFmpeg には x264 用の「ロスレス」モードがあります。FFmpeg および x264 エンコーディング ガイドを参照してください。

§ ロスレス H.264

本質的には-crf 0

于 2012-09-06T15:57:01.917 に答える
2

データの損失が許容される場合もあることに同意しますが、それは単に圧縮直後にどのように見えるかという問題ではありません。

目に見えない色データの損失でさえ、色補正、グリーンスクリーン キーイング、トラッキング、およびその他のポスト タスクがより困難または不可能になるなど、映像が劣化する可能性があり、制作に費用がかかります。

パイプラインでいつ、どのように圧縮するかによって異なりますが、最終的には元の品質をアーカイブすることが理にかなっています。ストレージは通常、再撮影するよりもはるかに安価だからです。

于 2012-07-12T19:13:37.143 に答える
2

圧縮と解凍の要件はわかりませんが、汎用のアーカイバ (LZMA2 を使用した 7-zip など) は、ロスレス ビデオ コーデックとほぼ同じか、場合によっては大幅に小さく圧縮できるはずです。また、ビデオ処理チェーン全体よりもはるかにシンプルで安全です。欠点は、速度がはるかに遅く、それを見る前に抽出する必要があることです. しかし、画像については、試してみるべきだと思います。

.png などのロスレス画像形式もあります。

x264 でロスレス RGB をエンコードするには、x264 のコマンド ライン バージョンを使用する必要があります (このエッジ ケースでは GUI を信頼できません。おそらく混乱するでしょう) r2020 以降で、次のようなものを使用します。

x264 --qp 0 --preset fast --input-csp rgb --output-csp rgb --colormatrix GBR --output "the_lossless_output.mkv" "someinput.avs"

入力と出力の間の損失/違いは、何らかの色空間変換 (エンコード前または再生時)、間違った設定、または失われたヘッダー/メタデータによるものである必要があります。x264 は RGBA をサポートしていませんが、RGB は問題ありません。YUV 4:4:4 圧縮の方が効率的ですが、入力が RGB であるため、色空間変換で一部のデータが失われます。YV12/i420 ははるかに小さく、ビデオで最も一般的な色空間ですが、彩度の解像度は低くなります。

x264 設定の詳細: http://mewiki.project357.com/wiki/X264_Settings

また、ラガリスは避けてください。x87浮動小数点を使用しています...そして、より良い代替手段があります。 http://codecs.multimedia.cx/?p=303 http://mod16.org/hurfdurf/?p=142

編集:なぜ私が反対票を投じられたのかわかりません。その際はコメントを残してください。

于 2012-01-19T04:28:24.883 に答える
2

HandBrake GUI でロスレス H.264 を生成するには、Video Codec: H.264、Constant Quality、RF: 0、H.264 Profile: auto を設定します。このファイルは Apple によってネイティブにサポートされていませんが、再生用にほぼロスレスとして再エンコードできます。

HandBrake GUI のアクティビティ ウィンドウ:

H.264 プロファイル: 自動; 一定 RF 0.000000 でのエンコーディング...プロファイル 高 4:4:4予測、レベル 3.0、4:2:0 8 ビット

H.264 プロファイル: 高; 一定の RF 0.000000 でのエンコード...ロスレスには high444 プロファイルが必要で、無効化...プロファイル High、レベル 3.0

于 2013-12-11T06:10:33.357 に答える
1

h.264 エンコーダーとデコーダーを使用してロスレス圧縮を取得できない場合は、おそらく次の 2 つの方法を検討できます。

(1) すべてのデータを h.264 形式で渡すのではなく、残りの「サイド チャネル」を使用して一部のデータを送信する実験を行っている人もいます。

  • (h.264 ファイル) -> h264 デコード -> 何らかの変換 -> 元の一連のビットマップの非可逆近似
  • (圧縮された残差ファイル) --> デコーダ -> 一連のロスレス残差ビットマップ
  • 各ビットマップの各ピクセルについて、approximate_pixel + Residual_pixel = 元のピクセルとビット単位で等しいピクセル。

(2) 「ロスレス」モードで Dirac ビデオ圧縮形式を使用します。

于 2011-08-26T03:44:53.807 に答える