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?
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
http://stackoverflow.com/questions/8671479/android-mediaplayer-works-fine-in-our-custom-audio-streaming-application-up-to-a –