HTTP Live Streaming mit Audiodateien unterschiedlicher Länge

9

Ich versuche, Audio auf iOS- und Safari-Clients zu streamen, indem ich das HTTP-Live-Streaming-Protokoll von Apple verwende. Im Gegensatz zu vielen gängigen Implementierungen von HTTP Live Streaming ist es mein Ziel, kurze Audioclips zu verwenden, die von Natur aus unterschiedliche Längen haben, meistens im Bereich von 10-30 Sekunden. Zusätzlich zum Streaming des Audios von diesen Segmenten möchte ich auf Metadaten für jedes Segment zugreifen, um die Anzeige zu aktualisieren und / oder dem Benutzer zusätzliche Optionen zu geben, um mehr Informationen über ein bestimmtes Audiosegment zu erhalten.

Zur Zeit habe ich ein paar Testfälle eingerichtet, die mein Quell-Audio (MP3) in verschiedene Formate umwandeln und M3U-Dateien zum Testen auf iOS-Geräten erstellen, aber keiner meiner Ansätze hat richtig funktioniert (richtiges Streamen und Übermitteln von Metadaten) der Kunde). Ich verwende AVPlayer , um die erstellten M3U-Dateien zu laden und abzuspielen:

%Vor%

Ansatz 1: Raw MP3-Dateien

Ich habe meine ursprünglichen MP3-Quelldateien mit den Metadaten von id3v2 (v2.3.0) aufgenommen und sie einer M3U-Wiedergabeliste hinzugefügt.

%Vor%

Ergebnisse: Die Eigenschaft timedMetadata wird aktualisiert, sobald die Wiedergabe mit der korrekten ID3-Information für die erste Spur beginnt. Der erste Titel wird abgespielt, aber am Ende abgeschnitten. ID3-Daten für die zweite Spur werden angezeigt, aber die zweite Spur wird nicht wiedergegeben. Nach ein paar Augenblicken bekomme ich einen Fehler auf der Konsole:

%Vor%

Ansatz 2: Verwenden Sie das Mediafilesegment von Apple, um einzelne MP3-Dateien zu erstellen

Bei diesem Ansatz verwende ich mediafilesegmenter , um für jedes Segment eine neue MP3-Datei zu erstellen. Das Segmentierungswerkzeug von Apple wird normalerweise für das Segmentieren verwendet, aber da meine Audioclips alle kurze und verschiedene Längen haben, passt das nicht wirklich zu meiner Anwendung. Ich übergebe eine Zieldauer von 999 Sekunden an das Dienstprogramm, so dass es für jede Eingabedatei, die ich ihm gebe, eine einzige Ausgabedatei erstellt. Hier ist der Befehl, den ich verwende, um jede einzelne Spur zu erstellen:

%Vor%

Die resultierende MP3-Datei scheint einige Zeitstempel-Daten zu haben, da vbindiff mir eine Änderung im Dateikopf anzeigt und die Zeichenfolge "com.apple.streaming.transportStreamTimestamp" in den ersten paar Bytes der neuen Datei erscheint. Die Suche nach dieser Zeichenfolge führt zu einer Passage in der HTTP-Livestreaming-Entwurfsspezifikation :

  

Grundlegende Audio-Stream-Dateien müssen   signalisieren Sie den Zeitstempel des ersten   Probe in der Datei durch Voranstellen eines   ID3 PRIV-Tag [ID3] mit einem Besitzer   Kennung von   "com.apple.streaming.transportStreamTimestamp".   Die Binärdaten MÜSSEN ein 33-Bit sein   MPEG-2 Programm Elementary Stream   Timestamp als Big-Endian ausgedrückt   Acht-Oktett-Nummer, mit den oberen 31   Bits auf Null gesetzt.

Ich erstelle dann eine M3U-Datei wie in Approach 1. (Hinweis: Mit mediafilesegmenter kann ich auch ID3-Informationen mit vordefinierten ID3-Tag-Dateien und einer Meta-Datei mit ID3-Zeitversätzen weitergeben. Ich überspringe das hier, weil Ich kann diese Dateien nicht einmal richtig wiedergeben lassen.)

Ergebnisse: Der erste Track wird genau wie in Ansatz 1 gestreamt. Der Track wird am Ende wieder abgeschnitten und der zweite Track wird nicht abgespielt. Es sind keine Metadaten vorhanden, aber dies kann einfach mit der Option -M von mediafilesegmenter hinzugefügt werden.

Ansatz 3: Verwenden Sie ffmpeg, um MPEG-Transport-Stream-Dateien zu erstellen

Mit diesem letzten Ansatz übergebe ich meine Quell-MP3-Dateien durch ffmpeg, um MPEG-Transport Stream-Daten zu erstellen:

%Vor%

Ich erstelle dann eine M3U wie in den ersten beiden Ansätzen.

Ergebnisse: Dieser Ansatz funktioniert tatsächlich; Alle Dateien laufen reibungslos auf dem Client. Ich kann jedoch keine Metadaten an den Client weitergeben. Ich habe versucht, Argumente wie -metadata title="My Title" ohne Erfolg an ffmpeg zu übergeben.

    
pix0r 26.04.2011, 14:28
quelle

2 Antworten

1

nur ein Vorschlag .. haben Sie dieses Projekt versucht - Ссылка Ich benutze dies in meinem Projekt und es ist gut

Update 1 -

Sie können Metadaten-Informationen mithilfe des FFMPEG-Parameters - "-map_meta_data"

in eine andere Datei übertragen

Hier ist ein Beispiel -

%Vor%     
Saurabh 29.04.2011 07:44
quelle
0

Wenn die Segmente nicht als einzelner Stream vorbereitet werden, kann der Decoder nicht nahtlos zwischen ihnen wechseln.

Sie sollten eine # EXT-X-DISCONTINUITY Zeile immer wenn der Decoder zurückgesetzt werden muss. Wenn Sie nicht eine einzelne, lange MP3-Datei, die segmentiert wird, müssen Sie die Diskontinuität vor jedem neuen mp3 markieren.

    
vipw 17.04.2012 08:32
quelle

Tags und Links