[Gelöst] ffmpeg, stream syntax in filter_complex

Sound, Digitalkameras, TV+Video und Spiele.
Antworten
pepre
Beiträge: 83
Registriert: 30.06.2013 12:10:25

[Gelöst] ffmpeg, stream syntax in filter_complex

Beitrag von pepre » 26.01.2023 10:32:15

Hallo und guten Tag!

Quellmaterial:

Code: Alles auswählen

ffmpeg -i s01e01_rose.mkv 2>&1 | grep "Stream #0"
    Stream #0:0(eng): Video: mpeg2video (Main), yuv420p(tv, bt470bg, top first), 720x576 [SAR 64:45 DAR 16:9], 25 fps, 25 tbr, 1k tbn, 50 tbc
    Stream #0:1(ger): Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s (default)
    Stream #0:2(eng): Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s
Warum gibt dies hier einen Fehler?

Code: Alles auswählen

ffmpeg -i s01e01_rose.mkv -filter_complex "[0:v:0]copy;[0:a:0]copy;[0:a:1]copy" zout.mkv
...
Stream specifier ':a:0' in filtergraph description [0:v:0]copy;[0:a:0]copy;[0:a:1]copy matches no streams

Ich finde nicht wirklich etwas zur Syntax der Streamwahl in "filter_complex". Wenn man sich jedoch die Beispiele im Netz ansieht, dann ist das wohl die gleiche wie bei "map". Es müsste also funktionieren. Tut's aber nicht. Varianten wie

Code: Alles auswählen

[0:a], [a:0] oder [0:a:1]copy;[0:a:2]copy
bringen auch nichts. Any hints?
Zuletzt geändert von pepre am 29.01.2023 15:43:50, insgesamt 1-mal geändert.

wanne
Moderator
Beiträge: 7462
Registriert: 24.05.2010 12:39:42

Re: ffmpeg, stream syntax in filter_complex

Beitrag von wanne » 26.01.2023 16:25:21

Filter sind Sachen um Streams zu bearbeiten. filter Complex können dabei mehrere Inputs und Outputs haben (Wasserzeichen über ein anders Video legen einen Pfeifton über ein Audio legen...) Ich weiß nicht, was du mit deinem Beispiel machen willst. Aber es ergibt keinen Sinn.

Edit: Den Filter copy gibt es. Der kopiert wirklich das Bild aus einem Stream in einen anderen. Da du den Output weg gelassen hast wird der erste genommen: Aber du kannst unmöglich zwei Audiostreams in einen Videostream kopieren.
rot: Moderator wanne spricht, default: User wanne spricht.

pepre
Beiträge: 83
Registriert: 30.06.2013 12:10:25

Re: ffmpeg, stream syntax in filter_complex

Beitrag von pepre » 26.01.2023 17:14:49

Code: Alles auswählen

ffmpeg -i s01e01_rose.mkv -filter_complex "[0:v:0]copy[out1];[0:a:0]copy[out2];[0:a:1]copy[out3]" -map out1 -map out2 -map out3 zout.mkv

Aber dies geht ja genauso wenig. Gleiche Fehlermeldung ("specifier ... matches no streams"), obwohl nun ein ordentliches Mapping vorliegt. Statt einer komplexen Filterchain habe ich halt "copy" genommen, geht ja auch. Am Output liegt es also schon mal nicht. IMO stimmt einfach die Syntax für die Stream-Benamsung nicht. :?

Oder ich habe einen prinzipiellen Denkfehler drin. :roll:

wanne
Moderator
Beiträge: 7462
Registriert: 24.05.2010 12:39:42

Re: ffmpeg, stream syntax in filter_complex

Beitrag von wanne » 27.01.2023 10:29:53

Oder ich habe einen prinzipiellen Denkfehler drin. :roll:
Ja. Ich zitiere mich nochmal selbst:
wanne hat geschrieben:Aber du kannst unmöglich zwei Audiostreams in einen Videostream kopieren.
Bitte ließ dir nochmal durch was der Copy-Filter macht.
ffmpeg hat geschrieben:Copy the input video source unchanged to the output. This is mainly useful for testing purposes.
Aber dies geht ja genauso wenig.
Ich weiß nicht, was du machen willst. Aber was du machst gibt keinen Sinn. Wenn du wirklich einen Filter bauen willst, der nichts macht (also sich genau gleich verhält, wie wenn die Option nicht angegeben worden wäre): Für Audio gibt es acopy. Aber auch dann guck dir nochmal die Syntax an. Mit : kannst du vermutlich nicht mehrere Unterschiedliche Filter aneinander kleben.
Wenn dann so:

Code: Alles auswählen

-filter_complex "[0:v:0] copy [out1]" -filter_complex "[0:a:0] acopy [out2]"  -filter_complex "[0:a:1] acopy [out3]"
Copy the input audio source unchanged to the output. This is mainly useful for testing purposes.
Aber selbst dann brauchst du keinen filter_complex, weil ja nur eine source und eine Destination. Da reicht ein einfacher filter.
Statt einer komplexen Filterchain habe ich halt "copy" genommen
Warum schreibst du dann filter_complex?
geht ja auch.
Ne.
rot: Moderator wanne spricht, default: User wanne spricht.

pepre
Beiträge: 83
Registriert: 30.06.2013 12:10:25

Re: ffmpeg, stream syntax in filter_complex

Beitrag von pepre » 29.01.2023 13:25:17

Ich wollte nur ein Beispiel bringen, das nicht ffmpeg-typisch endlos lang ist. Deshalb das simple "copy" statt komplizierter Filterkettensyntax. ;-)

Der tatsächliche Einsatzzweck ist eine ebu_r128 Codierung von zwei Tonspuren. Nun wollte ich die Videofilter (crop, resize, aspekt) ebenfalls in den filter_complex hängen, weil dann das Script einfacher zu bauen wäre.

Es funktioniert, wenn ich NUR die beiden Audiospuren im filter_complex halte ("0 : a : 0" und "0 : a : 1" [spaces wegen Forensyntax eingefügt] mit je unterschiedlichen Startwerten für das ebu_r128). Die Videospur filtere ich extra in einer "-vf" Chain.

Sobald ich jedoch Video und Audio gleichzeitig in filter_complex schreibe (egal ob mit/ohne Output und/oder Mapping) wirft ffmpeg ab der zweiten Spur o.g. Fehlermeldung. Gemäß der Doku (falls ich die nicht völlig falsch verstehe¹) sollte es eigentlich möglich sein, allerspätestens mit

Code: Alles auswählen

-filter_complex "[0:v:0]videofilter[v0]; [0:a:0]audiofilter1[a0]; [0:a:1]audiofilter2[a1]" -map v0 -map a0 -map a1 outfile.mkv

Es läuft aber bereits mit

Code: Alles auswählen

-filter_complex "[0:a:0]audiofilter1; [0:a:1]audiofilter2" outfile.mkv
Beide Audiostreams werden wie gewünscht ins outfile geschrieben, ganz ohne mapping. Sobald jedoch eine Videospur mit drin ist geht nichts mehr. Auch nicht, wenn die Videospur einen eigenen filter_complex bekommt.

---
¹ Die Input-Streams im filter_complex können, müssen aber nicht miteinander verheiratet werden. Parallele Ausgabe (zum Muxen im Zielcontainer) ist also möglich. Mit zwei unabhängigen Audiospuren funktioniert es ja bereits.

---
PS: Doppelpunkte und Strichpunkte sind hier optisch kaum voneinander zu unterscheiden. Ist das bei euch auch so?

pepre
Beiträge: 83
Registriert: 30.06.2013 12:10:25

Re: [Gelöst] ffmpeg, stream syntax in filter_complex

Beitrag von pepre » 29.01.2023 15:52:30

Gelöst.
  • Audio will "acopy" statt "copy".
  • Nicht alle Filter sind miteinander/parallel innerhalb (eines oder mehrerer) filter_complex Statements kombinierbar.
Zum letzten Punkt: Video (crop, resize, etc) und Audio (ebu_r128, bzw loudnorm) scheinen nicht parallel nutzbar zu sein. Warum auch immer.

wanne
Moderator
Beiträge: 7462
Registriert: 24.05.2010 12:39:42

Re: [Gelöst] ffmpeg, stream syntax in filter_complex

Beitrag von wanne » 30.01.2023 03:19:42

Code: Alles auswählen

[quote]-filter_complex "[0:v:0]videofilter[v0]; [0:a:0]audiofilter1[a0]; [0:a:1]audiofilter2[a1]" -map v0 -map a0 -map a1 outfile.mkv[/quote]
Wie gesagt. Ein direktes kopieren ohne Filter ist um ein vielfaches schneller als filter und filter schneller als filter_complex. Für den Fall, dass du (wie in all deinen Beispielen) nur einen input pro Filter hast, solltest du niemals filter_complex sondern -vf und -va verwenden.
Sobald jedoch eine Videospur mit drin ist geht nichts mehr. Auch nicht, wenn die Videospur einen eigenen filter_complex bekommt.
ebur128 hat einen Audio-Input und einen Video-Output. Natürlich kannst du ihn mit einem anderen Video-Filter verwenden. Aber dann brauchst du einen 2. Videostream als output ich tippe dazu brauchst du dann ein map, weil du per default nur eine Video-Spur im Output hast und ebur128 den nicht automatisch hinzufügt. Oder einen weiteren Videofilter, wie overlay der die die beiden Videos in einen Stream merged. Overlay ist ein Beispiel wo du wirklich filter_complex brauchst, weil du 2 inputs hast.
Wenn du echte Beispiele nennen würdest, statt aliase könnte ich dir sagen, was du falsch machst.
rot: Moderator wanne spricht, default: User wanne spricht.

pepre
Beiträge: 83
Registriert: 30.06.2013 12:10:25

Re: [Gelöst] ffmpeg, stream syntax in filter_complex

Beitrag von pepre » 30.01.2023 12:36:27

Hm... von der Geschwindigkeit her stelle ich keinen signifikanten Unterschied zwischen "-af", "-vf" und "-filter_complex" fest.

Dann: "ebur128" gibt völlig andere Werte aus als der 1st pass von "loudnorm". :roll: Verstehe ich nicht. Ergo: ich bleibe bei loudnorm.

Nach diversen Tests: die Variante

Code: Alles auswählen

-filter_complex "[0:a:0]loudnorm=...; [0:a:1]loudnorm=..."
ist die einfachste, um die Filter bei multiplen Audiostreams (idF 2pass mit unterschiedlichen Startwerten) anzustoßen. Den Videostream filtere ich über "-vf". Alle Versuche, diesen ebenfalls in das "-filter_complex"-Kommando zu hängen fruchten nichts. Ist ja aber eh egal. Es funktioniert so und das ist ja die Hauptsache. :THX:

tldr: bei zwei Audiostreams im Container funktioniert paralleles Filtern so:

Code: Alles auswählen

ffmpeg -i input.mkv -vf "crop, scale, etc" -filter_complex "[0:a:0]loudnorm=...; [0:a:1]loudnorm=..." out.mkv

Man benötigt weder outstreams noch mapping.

Antworten