FFmpeg の「sameq」または「same_quant」オプションとは何ですか? 「同じ品質」を意味しますか?

FFmpeg の「sameq」または「same_quant」オプションとは何ですか? 「同じ品質」を意味しますか?

FFmpegコマンドでオプションを使用するのをよく見かけますsameq。たとえば、

ffmpeg -i input.mp4 -sameq output.avi

これはどういう意味ですか? 「同じ品質」という意味ですか? そうでない場合、代わりに何を使用すればよいですか?

答え1

sameq「同じ品質」を意味するものではない

ウェブ上のいくつかのリソースでは、sameqまたはsame_quantオプションの使用を推奨していますが、本質的には間違っています。 を使用しても、sameq入力と同じ品質の結果は得られません。
絶対に使用しないでください。

混乱の原因は、このオプションを使用すると同じ品質が得られるということを示唆する、不十分に書かれたドキュメントでした。幸いなことに、このオプションは削除されました。

これが FFmpeg ドキュメント言った:

これは同じ品質ではないことに注意してください。必要な場合を除き、このオプションを使用しないでください。

実際、FFmpegの開発者たちは名前を変更しました念のため、からまでsameq確認same_quantし、それから削除sameq/same_quantつまり、このオプションは最近の FFmpeg には存在しませんが、この記事は古い FFmpeg ビルドを使用しているユーザーにとって依然として役立ちます。


ビデオ圧縮はどのように機能しますか?

これで説明は終わりです。次は技術的な詳細について説明しましょう。

なぜそれが確実に機能しないのかを理解するには、一般的なビデオ エンコーダーにとっての「品質」の意味と、品質に影響を与えるものについての概念を理解する必要があります。異なるビット レートで圧縮した場合、あるビデオが他のビデオよりも見栄えが良いのはなぜでしょうか。変換でロスが発生するのはなぜでしょうか。エンコード後にビデオが元のサイズよりも小さくなるのはなぜでしょうか。

ビデオをエンコードする場合、入力データはまずピクセルブロックに数学的変換を適用して別の次元に変換されます。この変換は主に離散コサイン変換は、たとえばビデオ内の 8×8 ピクセルのフィールドを記述する数値のマトリックスを生成します。

したがって、8×8ピクセルとそれに対応するマトリックスは、最初は次のようになります。1

オリジナル画像  

しかし、これはデータが多すぎます。ビデオを圧縮する場合、右下の数字を削除できます。その理由は詳しく説明しません。ただ、このようなブロックを記述する場合、左上の数字の方が重要だということだけ言っておきます。基本的に、変換の全体的な考え方は、重要なものを左上に置くことです。

右下の数字を削除するには、ゼロにすることができます。何かが「何もない」、または単に0sとして繰り返される場合は、それを保存する必要がなくなり、スペースを節約できます。数学的には、量子化するこの最初の行列に別の行列「量子化行列」を適用します。

これにより、行列に含まれる数字が大幅に減り、ゼロが多くなります。

圧縮画像  

その結果、多数の数字を含む最初の高品質マトリックスが、同じ 8×8 ピクセルに似ているものの、ピクセルを表す数字が少ないため品質の低いマトリックスに変換されました。ブロックを視覚的に比較すると、似ていますが、まったく同じではありません。

ここ、量子化マトリックスが品質を決定するこれは重要です。異なる品質には異なる量子化行列を使用できます。一部の量子化行列は元の行列をほぼそのまま残しますが、他のものは残しません。削除する数字が多いほど、悪い品質は向上しますが、もっと基本的にここでゼロを「捨てる」ことができるので、ビデオを圧縮できます。

それは と何の関係があるのですかsameq?

ビデオをエンコードして、特定の品質を設定するとします。すでに学んだように、異なる量子化マトリックスは異なる品質をもたらします。そのため、エンコーダーに品質を使用するように指示するとx、その品質を得るために適切な量子化マトリックスが選択されます。結果はyマトリックスを使用して圧縮されたビデオですy。2

そして、興味深いのはここです:sameq「同じ量子化器」を意味します。「同じ品質」ではありません。FFmpeg の最新バージョンをお持ちでない場合でも、次の場所で見つけることができますffmpeg --help:

ffmpeg --help 2>&1 | grep sameq

したがって、変換したビデオを再度エンコードし、sameqオプションを適用すると、FFmpeg は、簡単に言えば、入力ビデオに使用されたのと同じ量子化マトリックスを選択します。

これ幾分入力と出力にまったく同じコーデックを使用する場合、たとえば XviD ビデオから XviD ビデオに変換する場合などは機能しますが、品質は低下します。3これは、すでにエンコードされているものをエンコードすると、さらに多くの情報が破棄されるためです。上記の例では、マトリックスにさらに多くのゼロが作成され、結果が悪化します。

しますない異なるビデオ コーデック間ではまったく機能しません。XviD でエンコードされたビデオを x264 で変換するとします。4これらの 2 つのコーデックでは、内部で使用される量子化マトリックスが異なり、係数が同じではありません。したがって、このオプションは意味がありません。残念ながら、FFmpeg では引き続き使用できます。

結論: 何をしているのか明確に分かっている場合を除いて、このオプションは使用しないでください。ビデオを別のコーデックでエンコードしながらも品質を維持したい場合は、実験して自分で品質を設定する必要があります。結果が満足のいくものかどうかを確認し、満足できない場合は、より高い品質を設定します。できることはこれくらいです。

最後に、再エンコード時に品質を維持する方法について知りたい場合は、次の投稿をご覧ください。


1) 実際には、このマトリックスは画像と一致しません。これは単なる例です。2
) 実際、最近のほとんどのエンコード処理では、1つマトリックス。特定のビット レートを設定すると、エンコーダーは異なるマトリックスを使用して 1 秒あたりの平均ビット レートを取得します。同様に、特定の品質を設定すると、最近のエンコーダーはコンテンツに応じて異なるマトリックスを使用します。これは、一部のコンテンツは他のコンテンツよりも圧縮が「簡単」であり、同じ圧縮係数を得るために必要な量子化が少ないためです。3
) 例: ffmpeg -i input.avi -sameq -c:v libxvid output.avi。これを使用しないでください。お願いします。4
) 例: ffmpeg -i input.avi -sameq -c:v libx264 output.mp4。これも使用しないでください。本気です。

関連情報