Wie kann ich Audiodateien kodieren und segmentieren, ohne Lücken (oder Audio-Popups) zwischen Segmenten zu haben, wenn ich sie rekonstruiere?

8

Ich arbeite an einer Webanwendung, die das Streamen und Synchronisieren mehrerer Audiodateien erfordert. Dazu verwende ich die Web-Audio-API über HTML5-Audio-Tags wegen der Wichtigkeit des Timings von Audio.

Momentan verwende ich FFMPEGs Segmentierungsfunktion, um die Audiodateien in kleinere Stücke zu codieren und zu segmentieren. Der Grund, warum ich sie segmentiere, ist, dass ich von der Mitte der Datei aus streamen kann, anstatt von Anfang an zu beginnen (sonst hätte ich die Dateien einfach unter Verwendung der UNIX-Aufteilung geteilt, wie hier gezeigt . Das Problem ist, dass wenn ich die Audio-Segmente wieder zusammen string, bekomme ich einen Audio-Pop zwischen Segmenten.

Wenn ich die Segmente mit einer PCM-Kodierung (pcm_s24le) in einer .wav-Datei kodiere, läuft die Wiedergabe nahtlos ab, was mich glauben lässt, dass der Encoder entweder den Anfang oder das Ende der Datei auffüllt. Da ich mit vielen verschiedenen Audiodateien zu tun habe, würde die Verwendung von .wav viel zu viel Bandbreite erfordern.

Ich suche nach einer der folgenden Lösungen für das Problem:

  • Wie kann ich codierte Audiodateien nahtlos segmentieren,
  • Wie kann ich einen Encoder dazu zwingen, Audioframes NICHT mit ffmpeg (oder einem anderen Dienstprogramm) oder
  • zu puffern?
  • Was ist ein besserer Weg, Audio zu streamen (beginnend mit einer beliebigen Track-Zeit), ohne ein Audio-Tag zu verwenden?

Systeminformationen

  • Benutzerdefinierter node.js-Server
  • Beim Hochladen einer Audiodatei leitet node.js die Daten in den Encoder von ffmpeg
  • Sie müssen die HTML5-Web-Audio-API-unterstützte Codierung verwenden
  • Server sendet Audio-Chunks 1 gleichzeitig über einen WebSockets-Socket

Vielen Dank im Voraus. Ich habe versucht, so klar wie möglich zu sein, aber wenn Sie Klärung benötigen, wäre ich mehr als bereit, es zu liefern.

    
fenduru 13.02.2013, 03:35
quelle

1 Antwort

2

Da PCM ein unkomprimiertes Format ist, wird eine nahtlose Wiedergabe erwartet. Es gibt nichts, was einen Fehler verursachen könnte. Das Gleiche würde passieren, wenn Sie einen verlustfreien Codec wie Flac verwenden. Auf der anderen Seite, wenn Sie einen verlustbehafteten Codec wie MP3, WMA, etc ... verwenden, gibt es keine Möglichkeit, Störungen ohne irgendwelche Interventionen zu vermeiden. WMA-Decoder zum Beispiel wird Ihnen immer mehr PCM geben, als Sie ursprünglich während der Codierung bereitgestellt haben. Diese zusätzlichen Bytes erzeugen einen Störimpuls und es wird auch die Dauer vermasseln. Außerdem hat eine solche verkettete Wiedergabe (Schnittliste) eine längere Dauer als sie sollte. Sie können versuchen, den Störimpuls mit etwas DSP-Filterung zu glätten. Sie können sogar einige einfache Aktionen wie Überblendungen der Übergänge etc. ausprobieren. Vielleicht würde es einige nützliche Ergebnisse geben.

Wenn ein verlustfreier Codec wegen der Bandbreite nicht akzeptabel ist, wäre ein anderer Ansatz, komprimierte Dateien mit verlustbehaftetem Codec wie mp3 zu erstellen und von der berechneten Position aus zu streamen. Natürlich können Sie nicht genau auf Sample wie in PCM suchen und Sie werden eine kleine Menge nutzlosen PCM während der Decodierung bekommen, weil Sie beginnen werden, komprimierte Daten in der Mitte zu dekodieren, ohne "vorherige Daten", die vom Decoder benötigt werden. Ich würde eine konstante Bitrate vorschlagen, wenn Sie solche Dateien kodieren, da Sie die Suchposition in der komprimierten Datei genauer berechnen können, bevor Sie mit dem Streaming beginnen.

Wenn Sie hier anfangen, solche mp3-Dateien zu kodieren und diese Dateien OHNE den Encoder anzuhalten, dann wird es beim Verschieben von Dateien keinen Fehler geben, weil Sie die komprimierten Daten einfach in mehr Dateien aufgeteilt haben. Natürlich müssen Sie dies wahrscheinlich selbst implementieren.

    
user1764961 16.05.2013 07:29
quelle