Ich versuche, ein paar M4A-Audiodateien zusammenzufügen. Es scheint, als ob alles problemlos funktioniert.
Ich verwende diesen Befehlffmpeg -f concat -safe 0 -i files.txt -y -af anlmdn output.m4a
Ich habe bemerkt, dass ich zwischen den Audiodaten eine Lücke bekomme
Vielleicht weiß jemand, wie man diese Leerzeichen entfernt und die einzelnen Einträge nacheinander aneinanderfügt.
Antwort1
Wenn ffmpeg einen AAC-Stream lädt, fügt es intern zwei zusätzliche Stille-Frames als Auffüllung hinzu, was oft als „Priming Samples“ bezeichnet wird. Der obige Kommentar, der besagt, dass ein Inpoint von 0,2322 hinzugefügt werden soll, ist für eine bestimmte Abtastrate korrekt, allerdings muss noch mehr getan werden, wenn es perfekt nahtlos sein soll.
Um eine nahtlose Verkettung ohne Lücken zu erreichen, können Sie Folgendes tun:
- Berechnen Sie die AAC-Framelänge basierend auf der Abtastrate, zB 1024/44100 = 0,02321995 für 44,1 kHz.
- Codieren Sie am Anfang und Ende jedes Segments zwei zusätzliche AAC-Frames.
- Berücksichtigen Sie die 2 stillen Füllrahmen, die ffmpeg immer intern hinzufügt.
- Weisen Sie in der Concat-TXT-Datei Inpoint- und Outpoint-Direktiven zu, sodass beim Erstellen der Ausgabedatei nur der „gute“ Inhalt verwendet wird.
Die 2 zusätzlichen Anfangsframes sind erforderlich, da jeder AAC-Frame von bis zu 2 Frames davor abhängig ist. Um den ersten Frame also richtig zu kodieren, ist dieser Kontext erforderlich. Die 2 zusätzlichen Frames am Ende sind erforderlich, da ffmpeg den Ton am Ende verjüngt, um ein plötzliches Knacken zu vermeiden. Indem wir 2 zusätzliche Frames hinzufügen, verschieben wir die Verjüngung, sodass sie unseren eigentlichen Inhalt nicht beeinflusst. Diese zusätzlichen Frames werden dann mit Inpoint und Outpoint entfernt, um wiederholten Inhalt zu vermeiden.
Bei dieser Methode ist es wichtig, dass alle Segmente eine Länge haben, die ein genaues Vielfaches der Dauer eines AAC-Frames beträgt. Ist dies nicht der Fall, treten an den Segmentgrenzen unvorhersehbare Artefakte auf.
Ich habe vor Kurzem ein Repo veröffentlicht, das dies mit echtem Code weiter demonstriert:https://github.com/wistia/seamless-aac-split-and-stitch-demo.