2010-03-24 11 views
22

Estoy intentando escribir una HTTP servidor ligero en mi aplicación a feed generadas dinámicamente MP3 datos a la incorporada en el AndroidMediaPlayer. No tengo permitido almacenar mi contenido en el SD card.Transmisión a la MediaPlayer Android

Mis datos de entrada son esencialmente de una longitud infinita. Le digo al MediaPlayer que su fuente de datos debe ser básicamente algo así como "http://localhost/myfile.mp3". Tengo una configuración de servidor simple que espera MediaPlayer para hacer esta solicitud. Sin embargo, MediaPlayer no es muy cooperativo. Al principio, hace un HTTP GET e intenta capturar todo el archivo. Se agota el tiempo si intentamos y simplemente volcamos datos en el socket, así que tratamos de usar el encabezado del rango HTTP para escribir datos en fragmentos. MediaPlayer no le gusta esto y no sigue solicitando los siguientes fragmentos.

¿Alguien ha tenido éxito al transmitir datos directamente al MediaPlayer? ¿Debo implementar un servidor RTSP o Shoutcast? ¿Me estoy perdiendo un crítico HTTP header? ¿Qué estrategia debería usar aquí?

+0

¿Usó también este método para reproducir archivos de video? ¿Funcionó igual que los archivos de audio? –

+0

Hey Rob ¿tiene alguna solución para el problema? puedes compartir código de muestra? –

+0

lo sé tarde. pero esto es para aquellos que terminan aquí en el futuro. esto [** Link **] (http://stackoverflow.com/questions/5343730/mediaplayer-stutters-at-start-of-mp3-playback/5432091#5432091) tiene un código para comenzar. – Samuel

Respuesta

3

El servidor HTTP fue efectivamente alojado en el teléfono. Fue muy simple: solo un thread escuchando en un socket para una solicitud HTTP GET . Cuando obtuvo la solicitud HTTP, sería una a new socket, escribir de nuevo algunos encabezados HTTP y comenzar a vaciar los datos de audio MP3 de vuelta al socket. Este servidor HTTP no hizo nada más.

La Android Media Player estaba reproduciendo la música mientras estaba transmitiendo a . El Media Player se comportó muy mal si su reproducción buffer se vació mientras se estaba reproduciendo audio. Para mí fue muy importante para asegurarme de que mi servidor HTTP seguía escribiendo datos en ese socket. I moví los bytes al zócalo en trozos pequeños (10 kB). Los encabezados en mi respuesta HTTP terminaron con este aspecto:

// 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 me quedé con el tubo de avivado, la Android Media Player mantuvo consumirlo sin queja. Reproducir audio solo requirió una solicitud y respuesta de . Terminó funcionando bastante bien.

+1

¿Hay alguna posibilidad de que el código completo esté alojado en alguna parte? Estoy tratando de hacer lo mismo con el video en vivo proveniente de MediaRecorder + Camera y estoy agotado con la búsqueda de diferentes intentos y bibliotecas. Si no, ¿qué recompensa de tamaño se necesitaría para agregar más detalles aquí? – ChiefTwoPencils

Cuestiones relacionadas