ffmpeg - Zuordnung mehrerer Audios zu einem Kanal

0

Ich möchte eine Videodatei mit mehreren Sounds ausgeben, diese jedoch in einem Kanal speichern.
Ich habe einige Möglichkeiten ausprobiert, aber ich bekomme immer ein Video mit mehreren Sound-Streams.
So was

Mein Befehl ist

ffmpeg -r 30 -i test_%03d.png 
-itsoffset 10 -ss 5 -t 20 -i s01.wav
-itsoffset 15 -ss 10 -t 30 -i s02.wav 
-map 0:v -map 1:a:0 -map 2:a:0 -c:v libopenh264 -c:a mp3 test.mp4

Neuer Befehlstest

-framerate 30 -i test_%03d.png -ss 0.2 -t 1 -i sound01.wav -ss 1 -t 2 -i sound02.wav
-filter_complex
"[1] aformat=sample_fmts=s16p:sample_rates=44100:channel_layouts=mono [a1];
 [2] aformat=sample_fmts=s16p:sample_rates=44100:channel_layouts=mono [a2]; 
 [a1]adelay=400|400,apad[b1]; 
 [a2]adelay=900|900[b2]; 
 [b1][b2]amerge=2[a]" 
 -map 0:v -map "[a]" -c:v libopenh264 -c:a mp3 -ac 2 output.mp4

Da Filter ihre Formate nicht auswählen konnten, trat ein Fehler auf, und ich fügte dem Befehl ein Format hinzu. Aber jetzt tritt ein anderer Fehler auf. Kein Kanallayout für Eingang 1 und Ausgang Video fehlt Sound01, bitte helfen Sie mir!

Ives
quelle
Es funktioniert, nachdem channel_layouts = ** mono ** in stereo geändert wurde , aber ich habe immer noch kein Kanallayout für den Fehler von Eingang 1 erhalten .
Ives

Antworten:

0

Um mehrere Audio-Streams zu einem zu kombinieren, müssen Sie Filter verwenden, um die Streams zusammenzuführen:

ffmpeg -framerate 30 -i test_%03d.png -i s01.wav -i s02.wav \
       -filter_complex "[1][2]amerge=2[a]" \
       -map 0:v -map "[a]"   
       -c:v libopenh264 -c:a mp3 -ac 2 test.mp4

Dies framerateist die richtige Option für Bild- und RAW-Streams.

Das -ac 2Downmixen des zusammengeführten Audios auf 2 Kanäle, da dies die Obergrenze für den MP3-Encoder ist.


Für den aktualisierten Befehl

ffmpeg -framerate 30 -i test_%03d.png 
       -ss 5 -t 20 -i s01.wav
       -ss 10 -t 30 -i s02.wav
       -filter_complex "[1]adelay=10000|10000,apad[a1];
                        [2]adelay=15000|15000[a2];
                        [a1][a2]amerge=2[a]" \
       -map 0:v -map "[a]" -c:v libopenh264 -c:a mp3 test.mp4

Das adelayPad füllt das Audio vor und nimmt den Wert in Millisekunden pro Kanal an. Die apadPads klingen am Ende und werden benötigt, da Amerge mit dem kürzesten Stream endet.

Gyan
quelle
danke, es führt die Streams zusammen, wenn ich mehr Audios zusammenführen möchte, kann ich einfach -filter_complex "[1] [2] [3] [4] amerge = 4 [a] ?
Ives
Und ich habe festgestellt, dass beim Zusammenführen der Streams die einzelnen Einstellungen wie -itsoffset -ss -t ignoriert werden.
Ives
Kann ich einfach -filter_complex ändern? "[1] [2] [3] [4] amerge = 4 [a]? -> yes.
Gyan
Ja, diese werden ignoriert und enden mit dem kürzesten Stream. Daher sollten Sie sie vorher kürzen.
Gyan
Ich kann das also nicht in einer Zeile ausführen. Ich muss sie zuschneiden und die Dauer der Audiodateien der Videodauer angleichen und sie dann zum Video zusammenführen.
Ives