Ich muss Videos auf 640 x 360 anpassen (das Maximum, das der Player meines Telefons verarbeiten kann) und gleichzeitig das Seitenverhältnis beibehalten , aber ich möchte auch, dass das Video unverändert bleibt, wenn es kleiner als 640 x 360 ist (es macht keinen Sinn, es zu vergrößern).
Gibt es eine Möglichkeit, dieses Verhalten über die Befehlszeile von ffmpeg zu ermitteln?
min(…)
aber mit einem einfachen Skript, das die Dimensionen analysiert, definitiv einfacher ist. Sehen Sie meinen Befehl hier für ein Beispiel von dem, was getan werden kann: superuser.com/questions/547296/...Antworten:
Bei neueren ffmpeg-Versionen können Sie
scale
dieforce_original_aspect_ratio
Filteroption verwenden. So passen Sie beispielsweise ein Video ohne Upscaling in 1280 × 720 ein ( weitere Informationen finden Sie in diesem Beitrag ):Hier
scale
skaliert der Filter auf 1280 × 720, wenn das Eingangsvideo größer ist. Wenn es kleiner ist, wird es nicht hochskaliert. Derpad
Filter ist erforderlich, um das ausgegebene Video auf 1280 × 720 zu bringen, falls sein Seitenverhältnis oder seine Größe von der Zielgröße abweicht.Bei älteren ffmpeg-Versionen gibt es eine etwas hackige Problemumgehung. Definieren Sie zunächst die Breite, Höhe und das Seitenverhältnis Ihrer Ausgabe. Dies erspart uns einige Eingaben.
Wenden wir nun den super komplexen Filterbefehl an, den Jim Worrall geschrieben hat :
Ich werde nicht wirklich erklären, was das alles macht, aber im Grunde kann man jedes Video füttern, und es wird nur verkleinert, nicht hochskaliert. Wenn Sie dazu bereit sind, können Sie den Filter in seine einzelnen Ausdrücke zerlegen. Es könnte möglich sein, dies zu verkürzen, aber es funktioniert auch so.
quelle
Eine besser lesbare Version kann wie folgt aussehen:
640 / iw ist der horizontale Skalierungsfaktor und 360 / ih ist der vertikale Skalierungsfaktor
Sie möchten das skalierte Bild in das Ausgabefeld einpassen und das (Speicher-) Seitenverhältnis beibehalten. Dazu wählen Sie den kleinsten Skalierungsfaktor mit der Mindestfunktion aus: min (640 / iw, 360 / ih)
Sie möchten eine Hochskalierung verhindern (dh einen Skalierungsfaktor> 1,0), also fügen Sie eine weitere Mindestfunktion hinzu: min (1, min (640 / iw, 360 / ih))
Der nächste Schritt besteht darin, die Ausgabeauflösung zu berechnen, indem der Skalierungsfaktor mit der Eingabebreite und der Eingabehöhe multipliziert wird:
Ausgabebreite = iw * min (1, min (640 / iw, 360 / ih))
Ausgabehöhe = ih * min (1, min (640 / iw, 360 / ih))
Der letzte Schritt besteht darin, den Filterbefehl zu erstellen. Die Ausgabehöhe muss nicht angegeben werden. Sie können -1 angeben, und ffmpeg behält das Seitenverhältnis bei, indem der gleiche Skalierungsfaktor wie für die Breite angewendet wird.
quelle
Ich hatte das gleiche Problem auch, aber gelöst, indem ich das Video in ein Quadrat 640x640 passte (wegen vertikaler Videos, die mit Smartphones erstellt wurden).
Mit immerzi Logik und etwas Forschung komme ich zu folgendem Ergebnis :
Der letzte Teil dient dazu, eine durch 2 teilbare Höhe zu haben, die von vielen Encodern benötigt wird.
quelle