Wie ändere ich die Bildgröße unter Beibehaltung der Breite (mit ffmpeg)?


21

Ich bin neu in dieser StackExchange-Site und verwende den FFmpeg-Encoder. Ich habe ein Video mit einer Auflösung von 720 x 480 (3: 2), das ich zu 720 x 406 (16: 9) ändern möchte, um es mit den anderen Videos einer Website abzugleichen. Ich habe verschiedene Befehlskombinationen ausprobiert, darunter:

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

Am Ende habe ich ein Video, das auf die angegebene Höhe verkleinert, aber die Breite nicht beibehalten hat. Es endet bei 608x406 oder so. Ich habe heute mit verschiedenen GUI-Versionen von FFmpeg gespielt, und sie scheinen dasselbe zu tun.

Welche Optionen / Parameter sollten übergeben werden (vorausgesetzt, ich habe mehr Kontrolle über die Befehlszeile), um die gewünschte Bildgröße zu erreichen?

Antworten:


36

Die Verwendung des Skalierungsfilters reicht aus, aber es steckt noch ein bisschen mehr dahinter.

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

erstellt einen Film mit den erforderlichen Pixelabmessungen. Wenn Sie sich jedoch die Ausgabe ansehen, werden Informationen zu den Metadaten hinzugefügt, sodass diese mit dem gleichen Seitenverhältnis wie das Original wiedergegeben werden, wobei nicht quadratische Pixel verwendet werden. Wenn Sie den Film also anamorph auf ein neues Seitenverhältnis strecken möchten, müssen Sie das Pixelseitenverhältnis, das als SAR für "Sample Aspect Ratio" bezeichnet wird, manuell festlegen. Verwenden Sie also für quadratische Pixel Folgendes:

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

Alternativ können Sie das Seitenverhältnis der Anzeige wie gewünscht einstellen:

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

Was ich mit dem Befehl -vf und den folgenden Ausdrücken x = y, z = mache, ist das Erstellen einer Kette von Filtern . Filter können sehr komplex sein, nehmen jedoch im einfachsten effect=parameter,nexteffect=anotherparameterFall die Form an und werden in der Reihenfolge verarbeitet, in der Sie sie schreiben.

Möglicherweise möchten Sie zusätzliche Befehle für den Codec usw. eingeben, z. B. -c:v libx264den x264-MP4-Encoder verwenden und -crf 20den konstanten Ratenfaktor auf 20 setzen (normalerweise ein guter Kompromiss zwischen Größe und Qualität). Ein einigermaßen vollständiger Befehl würde also so aussehen:

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

Das Hauptprofil ist gut für die Gerätekompatibilität. Die slowVoreinstellung für den libx264-Encoder ist ein ziemlich gutes Gleichgewicht zwischen Geschwindigkeit und Qualität. Dies ist also ein gutes allgemeines Arbeitspferd für die Webcodierung. Sie können es schneller machen, indem Sie fastoder verwenden veryfastoder langsamer mit veryslowund placeboes wird immer ein bisschen besser als veryslowauf Kosten von viel mehr Verarbeitungszeit (daher der Name).

Übrigens: Verwenden Sie -c copy nicht , das heißt, Sie kopieren die Video- und Audiostreams, ohne sie zu verändern , und nichts, was Sie in Bezug auf Skalierung, Codec, Bitrate usw. tun, hat Auswirkungen.


1
Wenn Sie aktuelle Versionen von ffmpeg verwenden, müssen Sie nicht mehr x264 als Codec festlegen, aber es lohnt sich möglicherweise trotzdem, die gewünschten Einstellungen zu überprüfen.
Stib

1
Ich denke, Metadaten haben nur ein DAR-Feld. Wenn Sie also verwenden, setsarwird der DAR nur indirekt eingestellt?
Jiggunjer

Ich muss "-c copy" verwenden, aber auf der anderen Seite möchte ich die Bildschirmgröße ändern. Wie kann ich das erreichen?
Dr.jacky

1
@ Mr.Hyde Sie sollten dies als neue Frage stellen, anstatt in einem Kommentar zu fragen
stib
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.