Mit FFmpeg viele Audiodateien in eine überblenden?

474
setouk

Mit FFmpeg versuche ich, viele Audiodateien zu einer langen zu kombinieren, wobei jeweils eine Überblendung erfolgt. Um die Zahlen einfach zu halten, nehmen wir an, ich habe 10 Eingabedateien, jede 5 Minuten, und ich möchte eine 10-Sekunden-Überblendung zwischen beiden. (Die Dauer würde 48:30 betragen.) Angenommen, alle Eingabedateien haben denselben Codec / Bitrate.

Ich war angenehm überrascht, als ich herausfand, wie einfach es war, zwei Dateien zu überblenden :

ffmpeg -i 0.mp3 -i 1.mp3 -vn -filter_complex acrossfade=d=10:c1=tri:c2=tri out.mp3 

Der acrossfadeFilter lässt jedoch keine 3+ Eingaben zu. Meine naive Lösung besteht also darin, wiederholt zu laufen ffmpegund die vorherige Zwischenausgabe mit der nächsten Eingabedatei zu überblenden. Das ist nicht ideal. Es führt mich zu zwei Fragen:

1. Kopiert acrossfadeverlustfrei die Streams? (Außer dort, wo sie aktiv überblendet werden.) Oder werden die gesamten Eingabeströme neu codiert?

Wenn die Eingabeströme vollständig neu codiert werden, ist mein naiver Ansatz sehr schlecht. Im obigen Beispiel ( acrossfade9 Aufrufe ) würde das erste 4:50 der ersten Datei 9 Mal erneut codiert! Wenn ich 50 Dateien kombiniere, wird die erste Datei 49-mal neu codiert!

2. Kann ich das viele Crossfade-Verhalten in einem einzigen ffmpegAnruf erzielen, um mehrere Läufe und das Problem der erneuten Codierung zu vermeiden ?

Ich kann mir vorstellen, dass ich eine lange Filtergrafik brauche, aber ich habe es noch nicht herausgefunden. Hat jemand ein Beispiel für das Überblenden von nur 3 Eingabedateien? Von hier aus konnte ich die Filtergraphik für längere Ketten automatisieren.

Danke für irgendwelche Tipps!

1

1 Antwort auf die Frage

3
Gyan

Filter arbeiten mit Rohdaten und geben diese aus. Die Dekodierung erfolgt, bevor Daten an die Filter gesendet werden, und die Kodierung erfolgt, nachdem alle Filterungen abgeschlossen sind. Wenn also der Filter einen Teil der Daten nicht ändert, bleibt dieser Teil erhalten.

In Ihrem Befehl geben Sie MP3-Dateien aus, sodass eine erneute Kodierung erzwungen wird. Sie können dies vermeiden, indem Sie es in eine WAV-Datei ausgeben.

ffmpeg -i 0.mp3 -i 1.mp3 -vn -filter_complex acrossfade=d=10:c1=tri:c2=tri out.wav 

Während des letzten Crossfade-Befehls können Sie eine MP3-Ausgabe durchführen.

Sie können auch alle Überblendungen in einem Anruf durchführen.

Beispiel mit 4 Dateien,

ffmpeg -i 0.mp3 -i 1.mp3 -i 2.mp3 -i 3.mp3 -vn -filter_complex "[0][1]acrossfade=d=10:c1=tri:c2=tri[a01]; [a01][2]acrossfade=d=10:c1=tri:c2=tri[a02]; [a02][3]acrossfade=d=10:c1=tri:c2=tri" out.mp3