(ffmpegを使用して)フレームサイズを変更し、幅を維持するにはどうすればよいですか?


21

このStackExchangeサイトは初めてで、FFmpegエンコーダーを使用しています。720x480(3:2)のビデオがあり、720x406(16:9)に変更して、サイトにある他のビデオと一致させたい。以下を含むさまざまなコマンドの組み合わせを試しました。

ffmpeg -i myfile.mv4 -s 720x406 outfile.mp4
ffmpeg -i myfile.m4v -c copy -aspect 16:9 outfile.mp4

最終的には、指定された高さに縮小されたビデオですが、幅は保持されませんでした。最終的には608x406程度になります。今日、私はFFmpegのさまざまなGUIバージョンで遊んでいますが、それらは同じことをしているようです。

目的のフレームサイズを実現するために渡す適切なオプション/パラメーターは何ですか(コマンドラインを介してより多くの制御ができると仮定した場合)。

回答:


36

スケールフィルターを使用すると実行できますが、もう少し処理が必要です。

ffmpeg -i input.mov -vf scale=720x406 output.mov 

は、必要なピクセルサイズでムービーを作成しますが、出力を見ると、メタデータに情報が追加され、非正方形ピクセルを使用して元と同じアスペクト比で再生されることがわかります。そのため、ムービーをアナモルフィックに新しいアスペクト比に拡大したい場合は、「サンプルアスペクト比」のSARと呼ばれるピクセルアスペクト比を手動で設定する必要があります。

ffmpeg -i input.mov -vf scale=720x406,setsar=1:1 output.mov

または、ディスプレイのアスペクト比を任意の値に設定できます。したがって、次のようになります。

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 output.mov

-vfコマンドとそれに続くx = y、z = a式を使用してフィルターのチェーンを作成しています。フィルターは非常に複雑になる可能性がありますが、最も単純な使用法ではの形式を取り、ユーザーがeffect=parameter,nexteffect=anotherparameter記述した順序で処理されます。

たとえば-c:v libx264、x264 mp4エンコーダーを使用したり-crf 20、一定レートファクターを20に設定したりするなど、コーデックなどに追加のコマンドを追加することもできます(通常、サイズと品質のバランスは非常に良好です)。したがって、合理的に完全なコマンドは次のようになります。

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 -c:v libx264 -preset slow -profile:v main -crf 20 output.mov

メインプロファイルはデバイスの互換性に優れてslowおり、libx264エンコーダーのプリセットは速度と品質のバランスが非常に良いため、これは優れた一般的なWebエンコーディングの主力製品です。あなたが使用してより速くそれを作ることができるfastか、veryfastまたは遅くveryslowplaceboなりますこと、ほんの少し良くよりveryslow多くの費用より多くの処理時間(それ故に名前)で。

ところで-cコピーを使用しないでください手段は、単に彼らに何もせずにビデオとオーディオストリームをコピーすることを、すべてのビットレートなどの規模、コーデック、の面であなたが何も何の効果もありませんので、。


1
ffmpegの最新バージョンを使用している場合は、コーデックとしてx264を指定する必要はありませんが、必要な設定を確認する価値はあります。
-stib

1
メタデータにはDARフィールドしかないと思います。では、使用setsarは間接的にDARを設定するだけですか?
ジグガンジャー

「-c copy」を使用する必要がありますが、反対側では画面のサイズを変更します。どうすればこれを達成できますか?
Dr.jacky

1
Mr.Hyde @あなたの代わりにコメントで尋ねるの新しい問題としてこれを尋ねるべき
STIB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.