mp4
ファイルを<に変換する最良の方法は何ですかdiv id = "16e25bd77c">
品質を損なうことなく(vp8
またはvp9
を使用)ffmpegを使用しますか?
ffmpeg -i in.mp4 out.webm
を実行すると、品質が非常に悪くなります。 -b:v
を介してターゲットビットレートを指定し、crf
を介して一定品質モードを指定できます。つまり、
ffmpeg -i in.mp4 -crf 10 -b:v 1M out.webm
これにより品質が向上します。ただし、このためには、入力ビデオ(ここでは1M)のビットレートを検索する必要があります。
入力のビットレートよりもはるかに大きな値をターゲットビットレートに指定すると(たとえば、-b:v 100M
)、ffmpegは次のように見えることにも気づきました。入力ビデオのビットレートをvp9で使用するか、vp8で少し高いビットレートを使用します。ただし、このソリューションは、これを行うための意図された方法ではないようです。
crf値をどのように選択し、その理由は何ですか?
のビットレートを自動的に選択するパラメータはありますか?入力ファイルと、入力ファイルと同じ品質を得るのに適したcrf値?
コメント
- ビットレートを0に設定します。crfを試してみてください。 。しかし、値がターゲットではなく上限として機能するため、高ビットレートの方法も機能します。
- @Mulvya:ビットレート0は制限がないことを意味しますか?'これはmanページで見つかりません。
- ビットレートがゼロに設定されていない場合、CRFはその値によって制約されます。ゼロの場合、'そうではありません。' VPnエンコーダの癖です。
- わかりました。ただし、ビットレートパラメータを完全に省略すると、品質が非常に悪くなります。'ビットレートの上限を指定します。
- リンク(200k)(最初のoptiを参照)オン)。 WebM b:v 0については、このページを参照してください。
回答
回答
2パスの一定品質モードを使用します:¹
ffmpeg -i input.mp4 -b:v 0 -crf 30 -pass 1 -an -f webm /dev/null ffmpeg -i input.mp4 -b:v 0 -crf 30 -pass 2 output.webm
説明:
ビデオビットレートをゼロに設定し、CRF(Constant Rate Factor)も指定すると、特定の知覚品質レベルを対象とする一定品質モードが有効になります。 VP9の場合、CRFの範囲は0(最高品質)から63(最小ファイルサイズ)です。
ビデオのビットレートをゼロに設定することが重要です。ビデオのビットレートを指定しない場合、デフォルトで低い値に設定され、各フレームに最大ビットレートが設定される制約付き品質モードになります。これはストリーミングには役立ちますが、動きの多いフレームでは見栄えを良くするために必要な帯域幅がないため、品質が大幅に低下します。
品質が低下するもう1つの理由は、webm
(VP9)は、最良の結果を得るために2つのパスでエンコードすることを好みます。最初のパスはビデオに関する統計をコンパイルし、2番目のパスで使用してより小さく高品質のビデオを作成します。
ffmpegVP9ドキュメントを参照してください。 詳細を知りたい場合。
トランスコーディングに関する一言
ちなみに、一般的に、トランスコーディング形式(圧縮されたビデオを取得し、異なるコーデック)は、不可逆ビデオエンコーディングからの通常のエラーを追加するだけでなく、古いものからのアーティファクトを保持しようとして新しい形式でビットを浪費するため、悪い考えです。
文字通り「品質を損なうことなく」を意味します
ffmpegのVP9エンコーダーの-lossless 1
オプションは、ロスレス品質モードを有効にしますが、ファイルサイズが大幅に増加する可能性があります。
必要なのはこれだけです:
ffmpeg -i input.mp4 -lossless 1 output.webm
低品質のivで-lossless 1
を試したときid = “b3d6c164f5″>
、結果のwebm
は100倍大きく、これは私には受け入れられる。ただし、mp4
ファイルがすでに非常に高品質である場合、サイズの違いはそれほど大きくないと思います。
脚注1: 「UNIXではなくMicrosoftWindowsを使用している場合は、/dev/null
をNUL
に変更してください。
コメント
- すばらしい回答ありがとうございます
-
/dev/null
?これはどういう意味ですか?Windowsユーザーにとって同等のものは何ですか?上書きしていますか<最初のパスでdivid = "87635a08a5">
?この回答には、各コンポーネントが正確に何をしているのかについてさらに説明する必要があります。'中間ユーザーには多くの説明がありません。