Wie kann man mit FFMPEG unterschiedliche Flags für Eingänge angeben?

Sie können mehrere Eingaben für FFMPEG angeben und sie zu einer einzigen Ausgabe mischen. Ich verstehe die Grundlagen davon, zum Beispiel:

ffmpeg -i vid1.mp4 -i vid2.mp4 [commands] output.mp4

Was ich nicht herausfinden kann, ist, wie ich verschiedene Befehle für jede Eingabe angeben kann. Zum Beispiel habe ich folgendes, was ich versuche:

 ffmpeg -i vid1.m2t -i vid2.mp4 -map 0:a -filter_complex "[0:v:0][1:v:0]vstack=inputs=2" -crf 24 -c:a aac -b:a 128k -ac 1 -movflags +faststart output.mp4

vid1.m2tist ein anamorphotischer 1440-HDV-MPEG-Stream und vid2.mp4ein regulärer 1920-h.264-Stream. Mit -filter_complex "[0:v:0][1:v:0]vstack=inputs=2"Ich versuche, vid1 auf vid2 zu stapeln, aber ich erhalte die Fehlermeldung, dass es nicht fortgesetzt werden kann, weil die beiden Videos nicht die gleiche Breite haben. Nun ja, außer im Display ist der m2t tatsächlich 1920 breit, nicht 1440.

wenn ich nur das hdv von selbst umwandle, nutze ich -filter_complex "scale=1920:1080,setsar=1"dafür quadratische pixel. Ich weiß, dass das gut funktioniert, aber wie kann ich das in diesen vstack-Befehl integrieren? Wenn ich es mit dem anderen einfüge, bekomme ich Fehler. Ich habe verschiedene Möglichkeiten ausprobiert, einschließlich vor der Eingabe (ich dachte, dies würde dazu führen, dass ffmpeg es nur auf die Eingabe anwendet, bevor es an die anderen Befehle zur Ausgabe gesendet wird), aber alle machen Fehler.

Außerdem frage ich mich, ob der -crf 24Befehl für jede Eingabe angegeben werden kann. Beim individuellen Konvertieren muss der m2t bei 24 oder weniger liegen, oder es sieht schlecht aus, während der mp4 bis zu 30 erreichen kann. Ich verstehe möglicherweise nicht, was vstack tut, aber ich würde denken, wenn ich ffmpeg sagen kann, dass er andere Aufmerksamkeit schenken soll zu Qualität für jede Eingabe würde die Dateigröße verringern.


Ich habe das gleiche Problem mit hstack. FFMPEG rendert die Ausgabe, aber die m2t-Datei ist 1440 breit und daher verzerrt. Die Gesamtvideobreite beträgt also 3360 statt 3840.


Vielleicht spezifischer für dieses genaue Problem, wie kann ich vstack oder hstack verwenden, wenn die Eingaben unterschiedliche Dimensionen haben?

Antworten (1)

Angenommen, ein Videostream ist 1440 x 1080 mit einem Abtast-/Pixel-Seitenverhältnis von 1,333, was zu einer Anzeige von 1920 x 1080 führt. Beachten Sie, dass die tatsächliche Auflösung des Streams und das, was in der Datei gespeichert ist, 1440 x 1080 beträgt. Das Seitenverhältnis-Flag teilt der verbrauchenden App (Player/Editor...) mit, dass sich das beabsichtigte Anzeigeverhältnis von dem Rohverhältnis von Breite zu Höhe unterscheidet und dass das Seitenverhältnis verwendet werden sollte, um das Video neu zu skalieren, um eine genaue Anzeige zu erzeugen. FFmpeg erstellt nicht automatisch ein quadratisches Pixelvideo, da der Benutzer dies möglicherweise nicht möchte.

Die Stapelfilter erfordern, dass alle Streams an der Schnittstelle, an der sie zusammengeführt werden, dieselbe Größe haben - für hstack ist das die Höhe und für vstack die Breite. Es kommt nur auf die Rohgröße an, das Seitenverhältnis ist nur ein Informationskennzeichen.

Sie müssen also die erste Eingabe vor dem Stapeln neu skalieren.

Verwenden

ffmpeg -i vid1.m2t -i vid2.mp4 -filter_complex "[0:v:0]scale=iw*sar:ih,setsar=1[vid1];[vid1][1:v:0]vstack=inputs=2" -map 0:a -crf 24 -ac 1 -c:a aac -b:a 128k -movflags +faststart output.mp4

Was den Encoder betrifft, wird er nur mit einem Stream von 1920x2160 dargestellt - die historische Herkunft und Zusammensetzung geht verloren. Wenn Sie nun verschiedene Komprimierungsstufen auf Teile des Frames anwenden möchten, wird dies als R egion Of I nterest - Codierung bezeichnet . Einige erste Patches wurden letzten Monat angewendet, um dies für x264 und x265 zu ermöglichen, aber es ist noch nicht betriebsbereit. Ich werde diese Antwort aktualisieren, wenn dies der Fall ist, aber im Moment können Sie nur einen einzigen CRF-Wert für den gesamten Frame zuweisen.

Danke, Gjan. Funktioniert wie erwartet. Ich musste auch die Helligkeit und Sättigung auf dem m2t anpassen, aber nicht auf dem mp4, also habe ich damit herumgespielt und kam auf -filter_complex "[0:v:0]scale=iw*sar:ih,setsar=1,eq=brightness=0.2:saturation=1.5[vid1];[vid1][1:v:0]vstack=inputs=2". Ich bin sehr froh, dass es funktioniert, aber ich verstehe die Syntax in diesem Befehl nicht. Kannst du ein bisschen erklären, wie die , ;und [vid1]hier arbeiten?
Beantwortung meiner eigenen Frage hier: Separate Filter mit einer ,. Eine Reihe von ,getrennten Filtern wird als Filterkette bezeichnet. Trennen Sie Filterketten mit einer ;. Eine Reihe ;getrennter Filterketten wird als Filtergraph bezeichnet. Referenzeingänge mit [x]am Anfang der Kette. A [y]am Ende der Kette kann den Filtergraphen hinunter zu einer anderen Kette gesendet werden. [0:v:0]ruft die erste Eingabe auf (insbesondere nur den ersten Videostream). Filter werden in der Kette angewendet, dann heißt diese Ausgabe [vid1]. [vid1]wird dann sofort aufgerufen, als wäre es eine Eingabe in der nächsten Filterkette.