Best Practices für das Audio-Streaming

8

Ich schreibe eine Anwendung, um Audio vom Remote-Server abzuspielen. Ich habe verschiedene Möglichkeiten versucht, Streaming-Audio zu implementieren, aber alle sind nicht gut genug für mich. Das habe ich versucht:

Naive Nutzung von MediaPlayer

Etwas wie:

%Vor%

(oder prepareAsync , egal)

Aber der Standard MediaPlayer ist ziemlich instabil beim Abspielen von Remote-Inhalten. Es fällt oft ab oder stoppt die Wiedergabe und ich kann das nicht verarbeiten. Auf der anderen Seite möchte ich Media Caching implementieren. Aber ich habe keine Möglichkeit gefunden, gepufferten Inhalt vom MediaPlayer zu bekommen, um ihn irgendwo auf dem Gerät zu speichern.

Implementieren angepasster Pufferung

Dann kam die Idee, Mediendateien per Chunk herunterzuladen, sie zu einer lokalen Datei zu kombinieren und diese Datei abzuspielen. Das Herunterladen der gesamten Datei kann aufgrund schlechter Verbindung langsam sein, daher ist es in Ordnung, zunächst genug Stück herunterzuladen, dann die Wiedergabe zu starten und das Herunterladen und Anhängen der lokalen Datei fortzusetzen. Außerdem erhalten wir Caching-Funktionalität.

Klingt wie ein Plan, aber es hat nicht immer funktioniert. Es funktioniert perfekt auf HTC Sensation XE, aber nicht auf 4.1 Tablet-Wiedergabe gestoppt nach Abschluss dieses ersten Stück. Weiß nicht, warum ist das so. Ich habe question dazu gefragt, aber erhielt keine Antworten.

Verwendung von zwei MediaPlayern

Ich habe zwei MediaPlayer-Instanzen erstellt und versucht, sie gegenseitig zu ändern. Die Logik folgt:

  • Starten Sie den Download des ersten Medienstücks
  • Starten Sie nach dem Herunterladen die Wiedergabe über currentMediaPlayer. Der Rest der Medien geht weiter Herunterladen
  • Wenn das heruntergeladene Stück fast abgespielt wird (1 Sek. vor dem Ende), bereiten Sie den secondaryMediaPlayer mit derselben Quelldatei (wie sie während der Wiedergabe angehängt wurde)
  • vor
  • 261 ms vor dem Ende des aktuellenMediaPlayers - pausiere es, starte sekundär, setze den zweiten als aktuell, plane die Vorbereitung des nächsten sekundären Spielers.

Die Quelle:

%Vor%

Wieder - klingt wie ein Plan, funktioniert aber nicht perfekt. Die Momente des Wechselns von MediaPlayern sind durchaus hörbar. Hier habe ich entgegengesetzte Situation: auf 4.1 Tablet ist es ok, aber auf dem HTC Sensation gibt es deutliche Verzögerungen.

Ich habe auch versucht, verschiedene Download-Techniken zu implementieren. Ich habe Download von 10Kb Chunks und von MP3-Frames implementiert. Ich weiß es nicht genau, aber es scheint, dass im Falle von MP3-Frames suchen und besser arbeiten. Aber es ist nur ein Gefühl, ich weiß keine Erklärung.

StreamingMediaPlayer

Ich habe dieses Wort beim googlen mehrmals gesehen und diese Implementierung gefunden: Ссылка

Es ist eine Lösung, die jeder benutzt?

Wenn ja, ist es traurig, weil es auch nicht gut für mich ist. Und ich sehe keine neuen Ideen in der Implementierung.

Also, die Frage

Wie implementiert ihr Audio Streaming in euren Anwendungen? Ich glaube nicht, dass ich die einzige Person bin, die solche Probleme hatte. Es sollte einige gute Praktiken geben.

    
darja 06.05.2013, 18:38
quelle

1 Antwort

1

In meinem Fall verwende ich FFMPEG mit OpenSL ES. Der Nachteil ist Komplexität. Sie müssen mit vielen Dingen vertraut sein: JNI, OpenSL, FFMPEG. Es ist auch schwer zu debuggen (im Vergleich mit reinem Java Android App). In Ihrem Fall empfehle ich Ihnen, die Medien-API zu testen. Das einzige ist der Mangel an Beispielen. Aber es gibt ein unit test zeigt an, wie Sie mit Audio umgehen können (Sie müssen InputStream reference ändern - Zeile 82).

    
Eugene 06.05.2013, 20:30
quelle