2010-11-17 16 views
13

SDK nivel 8 (Froyo) ha introducido la capacidad nativa de MediaPlayer para conectarse a una fuente de transmisión, como Shoutcast. Las versiones anteriores de SDK podían hacer soluciones provisionales, como ejecutar un proxy local en el dispositivo (consulte NPR).Streaming con Android MediaPlayer en SDK 8

Tomé el mismo enfoque que NPR y estoy usando un StreamProxy. Sin embargo, NPR primero comprueba si el SDK actualmente en ejecución es menor que 8. De ser así, usa el proxy. De lo contrario, se conecta directamente.

Mi StreamProxy solicita metadatos del servidor de Shoutcast, por lo que no se limita a enrutar los datos de Shoutcast a mi cliente. En cambio, analiza los metadatos y los utiliza en consecuencia, y solo enruta los datos de música.

Al intentar utilizar StreamProxy en SDK nivel 8 o superior, el MediaPlayer no se puede preparar. Mi StreamProxy recibe la conexión y la acepta, pero después de escribir con éxito la línea de estado y los encabezados para el cliente, la siguiente escritura produce java.net.SocketException: Connection reset by peer. Esto da como resultado que el jugador del cliente arroje un Error(1,-1007).

Estoy tratando de averiguar por qué el MediaPlayer no puede conectarse a mi proxy local. Debería ser lo mismo que conectarse a la fuente original sin los metadatos, que hace el trabajo. Estoy reenviando en todos los encabezados de la fuente externa, a través de mi proxy, que incluye el tipo de contenido.

Seguiré investigando, pero siento que estoy en un callejón sin salida. Avíseme si se necesitan más detalles.

+0

Cómo jugar SHOUTcast? Http: //stackoverflow.com/a/8833346/265167 –

Respuesta

12

EDIT: Ok, ahora creo que tengo la respuesta!

Stagefright es estricto cuando se trata de finales de línea en el encabezado HTTP; Deben ser CR, LF y no solo LF, que funcionó antes.

Así que si usted construye sus propias cabeceras, reemplace ninguna "\ n" con "\ r \ n" y que debe estar bien.

(Si desea comprobar esto por sí mismo, mira receive_line() en media/libstagefright/HTTPStream.cpp)

ahora puedo transmitir shoutcast con metadatos de 2,2 teléfonos/Stagefright .. .

...

he estado corriendo en el mismo problema;

Primero intenté escribir los datos transmitidos en un archivo de longitud fija y ajustarlo y reproducirlo con setLooping (verdadero). Esto causa fallas cuando el MP3 se repite, aunque extraigo fotogramas enteros de MP3 y trato de rellenar los bytes irregulares al final con 0xff y 0x00. Esta podría ser una solución aceptable si tiene un archivo suficientemente grande.

Luego hice el proxy que funciona en mi Samsung Galaxy S (v2.2) pero no en el emulador y aparentemente no en el deseo (No funciona = Error -1007 como se mencionó anteriormente). Una sugerencia puede ser que el Galaxy S Mediaplayer pide HTTP1.0, mientras que es 1.1 en el emulador.

El método de fuerza bruta sería abrir 2 arroyos en paralelo, la lectura de meta-datos de uno y el streaming de la otra;)

De todos modos, también quiero saber si alguien más ha tenido más suerte. ..

+0

El -1007 ocurre con Stagefright y no con Opencore. Parece que Galaxy S v2.2 todavía usa OpenCore. – Sasq

1

MediaPlayer transmisión está disponible desde el nivel 1 de API. Hice un reproductor de video RTSP de demostración hace año y medio. Nagare El cliente de shoutcast ya tiene dos años.

¿Falta algo aquí?

+0

La conexión directa a una fuente de Shoutcast nunca ha funcionado antes 2.2. SDK 8 introdujo StageFright (http://developer.android.com/sdk/android-2.2-highlights.html#PlatformTechnologies), un nuevo marco para reproductores multimedia. Veré cómo lo han implementado en Nagare, y me gustaría ver si hace lo mismo para pre-2.2 y post-2.2. – Dharwin

+0

Thx por explicación. –

+0

¡Ningún problema! No entiendo completamente las capacidades cambiantes yo mismo. Sin embargo, me hizo preguntarme si de alguna manera puedo configurar mi reproductor de medios para usar el viejo marco. Mirando eso ahora. – Dharwin

Cuestiones relacionadas