I'm trying to write a light-weight HTTP server in my app to feed dynamically generated MP3 data to the built-in Android MediaPlayer. I am not permitted to store my content on the SD card.
My input data is essentially of an infinite length. I tell MediaPlayer that its data source should basically be something like "http://localhost/myfile.mp3". I've a simple server set up that waits for MediaPlayer to make this request. However, MediaPlayer isn't very cooperative. At first, it makes an HTTP GET and tries to grab the whole file. It times out if we try and simply dump data into the socket so we tried using the HTTP Range header to write data in chunks. MediaPlayer doesn't like this and doesn't keep requesting the subsequent chunks.
Has anyone had any success streaming data directly into MediaPlayer? Do I need to implement an RTSP or Shoutcast server instead? Am I simply missing a critical HTTP header? What strategy should I use here?
Start/Pause the playback: After loading the media file, you can start playing the media file by using the start() method. Similarly, you can pause the playing media file by using the pause() method. Stop the playback: You can stop playback by using the reset() method.
Go to Devices > Bluetooth and other Devices”. Click “Add bluetooth or other device” then choose your Android phone to connect. You can now play audio from your PC to your Android phone.
The
HTTPServer was indeed hosted on the phone itself. It was very simple: just athreadlistening on a socket for anHTTP GETrequest. When it got theHTTPrequest, it would one anew socket, write back someHTTPheaders and start dumping theMP3audio data back to thesocket. ThisHTTPserver didn't do anything else.The
Android Media Playerwas playing the music as I was streaming to it. TheMedia Playerbehaved very poorly if its playbackbufferwas emptied while it was playing audio. It was very important for me to make sure myHTTPserver kept writing data into thatsocket. I moved bytes into the socket in small chunks (10 kB). The headers on myHTTPresponse ended up looking like this:// 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");As long as I kept the pipe stoked, the
Android Media Playerkept consuming it without complaint. Playing audio only required one request and response. It ended up working pretty well.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With