players - Streaming al Android MediaPlayer
vlc (1)
El servidor
HTTP
fue alojado en el propio teléfono. Fue muy simple: solo unthread
escucha en un socket para una solicitudHTTP GET
. Cuando obtuviera la solicitudHTTP
, haría unnew socket
, volvería a escribir algunos encabezadosHTTP
y comenzaría a descargar los datos de audioMP3
de nuevo en elsocket
. Este servidorHTTP
no hizo nada más.El
Android Media Player
estaba reproduciendo la música mientras yo la transmitía. ElMedia Player
comportó muy mal si subuffer
reproducción se vació mientras se reproducía el audio. Para mí era muy importante asegurarme de que mi servidorHTTP
seguía escribiendo datos en esesocket
. Moví los bytes en el socket en trozos pequeños (10 kB). Los encabezados en mi respuestaHTTP
terminaron pareciéndose a esto:
// 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");
Mientras mantuve la tubería encendida, el
Android Media Player
siguió consumiéndolo sin quejarse. Reproducción de audio sólo requiere una solicitud y respuesta. Terminó funcionando bastante bien.
Estoy tratando de escribir un servidor HTTP
ligero en mi aplicación para feed
datos MP3
generados dinámicamente al Android
MediaPlayer
integrado. No tengo permitido almacenar mi contenido en la SD card
.
Mis datos de entrada son esencialmente de una longitud infinita. Le digo a MediaPlayer
que su fuente de datos debería ser básicamente algo como "http://localhost/myfile.mp3"
. Tengo un servidor simple configurado que espera a que MediaPlayer
realice esta solicitud. Sin embargo, MediaPlayer
no es muy cooperativo. Al principio, hace un HTTP GET
y trata de agarrar todo el archivo. Se agota el tiempo si intentamos y simplemente volcamos los datos en el socket
por lo que intentamos usar el encabezado HTTP
Range para escribir los datos en fragmentos. MediaPlayer
no le gusta esto y no sigue solicitando los fragmentos posteriores.
¿Alguien ha tenido éxito en la transmisión de datos directamente a MediaPlayer
? ¿Necesito implementar un servidor RTSP
o Shoutcast
en su lugar? ¿Simplemente estoy perdiendo un HTTP header
crítico? ¿Qué estrategia debo usar aquí?