2011-08-08 8 views
13

En un proyecto mío, estoy implementando una radio en vivo usando una transmisión sin fin. Puedo sin ningún problema usar el Android MediaPlayer nativo, también en dispositivos con una versión anterior de Android, ya que la transmisión es de tipo audio/mpeg. He probado esto en un HTC Magic con 1.6 y funciona sin problemas. Incluso cuando cambio de WLAN a 3G solo se amortigua y solo noto un pequeño contratiempo y luego sigue jugando como si nada hubiera pasado. También rara vez se desconecta la conexión, ya que he estado escuchando en la radio durante el día de trabajo y también en el camino hacia y desde el trabajo para asegurarme de que la experiencia del usuario sea exactamente como yo quiero. He repetido el mismo procedimiento para otros dispositivos como HTC Legend con Android 2.1, HTC Wildfire con 2.2 y Samsung Galaxy Tab con 2.2 con los mismos resultados. Todos los dispositivos manejan la secuencia perfectamente.Comportamiento extraño al transmitir usando MediaPlayer de Android en HTC Desire con Android 2.2

Sin embargo, y aquí es donde me quedé atascado, en el HTC Desire en ejecución 2.2 tengo serios problemas para que la transmisión funcione. Cuando uso la implementación estándar de MediaPlayer, es setDataSource (String path), se reproduce durante 10-30 segundos y luego pierde la conexión incluso cuando tengo recepción completa en WLAN y 3G. He intentado diferentes métodos para resolver este problema utilizando el NPR News del proyecto StreamProxy que en realidad funciona bastante bien después de algunas modificaciones. Sin embargo, el HTC Desire sigue abandonando las conexiones de vez en cuando y, en algunas ocasiones, intenta volver a conectarse de 4 a 5 veces hasta que logra mantener una conexión estable.

El error que estoy consiguiendo cuando se utiliza el proxy tiene el siguiente

08-08 09:35:17.810: ERROR/AwesomePlayer(67): Not sending buffering status because duration is unknown. 
08-08 09:35:19.849: ERROR/HTTPStream(67): recv failed, errno = 11 (Try again) 
08-08 09:35:19.849: INFO/HTTPDataSource(67): Retry ... 2 times left 
08-08 09:35:19.849: WARN/HTTPStream(67): Calling connect()... 
08-08 09:35:19.849: WARN/HTTPStream(67): Returned from connect()... 
08-08 09:35:20.739: ERROR/(1576): Broken pipe 
08-08 09:35:20.739: ERROR/(1576): java.net.SocketException: Broken pipe 
08-08 09:35:20.739: ERROR/(1576):  at org.apache.harmony.luni.platform.OSNetworkSystem.writeSocketImpl(Native Method) 
08-08 09:35:20.739: ERROR/(1576):  at org.apache.harmony.luni.platform.OSNetworkSystem.write(OSNetworkSystem.java:723) 
08-08 09:35:20.739: ERROR/(1576):  at org.apache.harmony.luni.net.PlainSocketImpl.write(PlainSocketImpl.java:578) 
08-08 09:35:20.739: ERROR/(1576):  at org.apache.harmony.luni.net.SocketOutputStream.write(SocketOutputStream.java:59) 
08-08 09:35:20.739: ERROR/(1576):  at org.jmvo.radio.StreamProxy.processRequest(StreamProxy.java:263) 
08-08 09:35:20.739: ERROR/(1576):  at org.jmvo.radio.StreamProxy.run(StreamProxy.java:138) 
08-08 09:35:20.739: ERROR/(1576):  at java.lang.Thread.run(Thread.java:1102) 

y cuando se utiliza el MediaPlayer directamente sin necesidad de utilizar el proxy

08-08 09:41:30.799: ERROR/AwesomePlayer(67): Not sending buffering status because duration is unknown. 
08-08 09:41:32.849: ERROR/HTTPStream(67): recv failed, errno = 11 (Try again) 
08-08 09:41:32.849: INFO/HTTPDataSource(67): Retry ... 2 times left 
08-08 09:41:32.849: WARN/HTTPStream(67): Calling connect()... 
08-08 09:41:32.870: WARN/HTTPStream(67): Returned from connect()... 
08-08 09:41:33.160: INFO/HTTPDataSource(67): retrying connection succeeded. 
08-08 09:41:34.839: VERBOSE/CacheingDataSource(67): partial readAt CachingDataSource::readAt(260221, 418):mSource->readAt(page<0xd0ff0>->mOffset 260416, mPageSize 1728) 
08-08 09:41:36.839: ERROR/HTTPStream(67): recv failed, errno = 11 (Try again) 
08-08 09:41:36.839: INFO/HTTPDataSource(67): Retry ... 1 times left 
08-08 09:41:36.839: WARN/HTTPStream(67): Calling connect()... 
08-08 09:41:36.859: WARN/HTTPStream(67): Returned from connect()... 
08-08 09:41:37.361: INFO/HTTPDataSource(67): retrying connection succeeded. 

Una cosa más. Para que el del StreamProxy de NPR News para trabajar muy bien tuve que modificar las siguientes líneas

byte[] buff = new byte[1024 * 50]; 
while (isRunning && (readBytes = data.read(buff, 0, buff.length)) != -1) { 
    client.getOutputStream().write(buff, 0, readBytes); 
} 

utilizando de esta manera resultaría en la corriente de perder la conexión cada 10 - 30 segundos. Pero cuando reduje el tamaño del búfer a tan poco como 4 bytes o incluso un byte, se reproduce bastante bien, aunque cuando se usan hipos 3G se producen con bastante frecuencia y tiene problemas para volver a conectarse.

Así que mi pregunta, ¿alguien tiene alguna idea de lo que es el trato con el software subyacente HTC Desires? Quiero decir, funciona perfectamente en HTC Wildfire ejecutando la misma versión del sistema operativo. No debería haber muchas diferencias entre el software de los dos dispositivos? También probé esta aplicación en múltiples HTC Desires para asegurarme de que no se trataba solo de un problema con mi dispositivo de prueba. Pero en los otros dispositivos ocurrieron los mismos problemas que en mi dispositivo de prueba.

¿Alguna idea?

+0

Tengo un proyecto similar, pero por el momento solo he estado utilizando el almacenamiento en búfer predeterminado de v2.2 con MediaPlayer. No fue su intención, pero su publicación ayudó a demostrar que el uso de StreamProxy valdrá la pena. Además, su nota sobre cómo cambiar el tamaño del búfer me hizo pensar en lo que está sucediendo aquí. Parece que MediaPlayer-default y StreamProxy-default usan búferes que son demasiado grandes y causan problemas con los fragmentos. – Civilian

+0

http://stackoverflow.com/questions/8671479/android-mediaplayer-works-fine-in-our-custom-audio-streaming-application-up-to-a –

Respuesta

1

El problema es que la transmisión de tipo de contenido "audio/aacp" no es compatible directamente. Algunos biblioteca de decodificación puede ser demandado para jugar "AACP", consulte la solución a continuación:

Freeware Advanced Audio (AAC) Decoder for Android

How to use this library?

Consider legal issues while using it.

Para detalles, véase this.

0

Olvídese de la transmisión en Android 2.2. Simplemente no funciona bien, excepto por la transmisión de flash.

Cuestiones relacionadas