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:
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:
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:
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.
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 übertragenHier ist ein Beispiel -
%Vor%Tags und Links ios safari http-live-streaming