players - Streaming al Android MediaPlayer
vlc (1)
El servidor
HTTPfue alojado en el propio teléfono. Fue muy simple: solo unthreadescucha en un socket para una solicitudHTTP GET. Cuando obtuviera la solicitudHTTP, haría unnew socket, volvería a escribir algunos encabezadosHTTPy comenzaría a descargar los datos de audioMP3de nuevo en elsocket. Este servidorHTTPno hizo nada más.El
Android Media Playerestaba reproduciendo la música mientras yo la transmitía. ElMedia Playercomportó muy mal si subufferreproducción se vació mientras se reproducía el audio. Para mí era muy importante asegurarme de que mi servidorHTTPseguía escribiendo datos en esesocket. Moví los bytes en el socket en trozos pequeños (10 kB). Los encabezados en mi respuestaHTTPterminaron 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 Playersiguió 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í?