2010-03-24 6 views
22

Ich versuche, einen leichtgewichtigen HTTP Server in meiner app zu feed dynamisch generierte MP3 Daten des eingebauten in AndroidMediaPlayer zu schreiben. Ich bin nicht berechtigt, meine Inhalte auf der SD card zu speichern.Streaming auf Android Mediaplayer

Meine Eingabedaten sind im Wesentlichen unendlich lang. Ich sage MediaPlayer, dass seine Datenquelle im Grunde so etwas wie "http://localhost/myfile.mp3" sein sollte. Ich habe einen einfachen Server eingerichtet, der auf MediaPlayer wartet, um diese Anfrage zu stellen. MediaPlayer ist jedoch nicht sehr kooperativ. Zuerst macht es eine HTTP GET und versucht, die ganze Datei zu greifen. Wenn wir versuchen, Daten einfach in die socket zu schreiben, versuchen wir es mit dem HTTP Range-Header, um Daten in Chunks zu schreiben. MediaPlayer mag dies nicht und fordert nicht die nachfolgenden Chunks an.

Hat jemand Erfolg gehabt Streaming-Daten direkt in MediaPlayer? Muss ich stattdessen einen RTSP oder Shoutcast Server implementieren? Fehle ich einfach eine kritische HTTP header? Welche Strategie soll ich hier verwenden?

+0

Haben Sie diesen Ansatz auch für die Wiedergabe von Videodateien verwendet? Hat es dasselbe wie Audiodateien ausgeführt? –

+0

Hey Rob hast du einen Workaround für das Problem? können Sie Beispielcode freigeben? –

+0

ich weiß es spät. aber das ist für diejenigen, die hier in der Zukunft landen. Dieser [** Link **] (http://stackoverflow.com/questions/5343730/mediaplayer-stutters-at-start-of-mp3-playback/5432091#5432091) hat Code, mit dem zu beginnen. – Samuel

Antwort

3

Der HTTP Server in der Tat wurde auf dem Telefon selbst gehostet. Es war sehr einfach: nur ein thread hören auf einem Sockel für eine HTTP GET Anfrage. Wenn es die HTTP Anfrage bekam, würde es ein new socket, schreiben Sie zurück einige HTTP Überschriften und fangen an, die MP3 Audiodaten zurück zu der socket zu verschütten. Dieser HTTP Server hat nichts anderes getan.

Die Android Media Player spielte die Musik, als ich zu es strömte. Das Media Player verhielt sich sehr schlecht, wenn seine Wiedergabe buffer geleert wurde, während es Audio spielte. Es war sehr wichtig für mich, sicherzustellen, dass mein HTTP Server weiterhin Daten in diese socket schreibt. I verschoben Bytes in den Sockel in kleinen Brocken (10 kB). Die Header auf meine HTTP Antwort suchen endete wie folgt aus:

// Build response headers 
StringBuilder sb = new StringBuilder(); 
sb.append("HTTP/1.1 200 OK\r\n"); 
sb.append("Content-Type: audio/mpeg\r\n"); 
sb.append("Connection: close\r\n"); 
sb.append("Accept-Ranges: bytes\r\n"); 
sb.append("Content-Length: " + totalFileSize + "\r\n"); 
sb.append("Content-Disposition: inline; filename=xxxxx.mp3\r\n\r\n"); 

Solange ich das Rohr gehalten geschürt, hielt die Android Media Player es klaglos raubend. Abspielen von Audio benötigt nur eine Anfrage und Antwort. Es endete ziemlich gut.

+1

Gibt es eine Chance, dass der gesamte Code irgendwo gehostet wird? Ich versuche, das gleiche mit Live-Videos von der MediaRecorder + Camera zu machen und bin erschöpft davon, verschiedene Versuche und Bibliotheken zu jagen. Wenn nicht, welche Größe würde es brauchen, um hier mehr Details hinzuzufügen? – ChiefTwoPencils