Android - Tamaño de búfer de MediaPlayer en ICS 4.0

Estoy usando un socket como proxy para el MediaPlayer, por lo que puedo descargar y descifrar el audio mp3 antes de escribirlo en el socket. Esto es similar al ejemplo que se muestra en la aplicación de noticias NPR; sin embargo, lo estoy usando para todas las versiones de Android 2.1 - 4 atm.

Código NPR StreamProxy -http://code.google.com/p/npr-android-app/source/browse/Npr/src/org/npr/android/news/StreamProxy.java

Mi problema es que la reproducción es rápida para 2.1 - 2.3, pero en el Android 4.0 ICS, el MediaPlayer almacena demasiados datos antes de disparar al oyente onPrepared.

Una cantidad de ejemplo de datos escritos en Socket OutputStream antes de onPrepared ():

En SGS2 con 2.3.4 - onPrepared () después de ~ 133920 bytes

En Nexus S con 4.0.4 - onPrepared () después de ~ 961930 bytes

Esto también ocurre en el Galaxy Nexus.

Extrañamente, el emulador 4.0 no almacena en búfer tantos datos como los dispositivos 4.0. ¿Alguien ha experimentado un problema similar con MediaPlayer en ICS?

EDITAR

Así es como el proxy está escribiendo en el socket. En este ejemplo, proviene de un CipherInputStream cargado desde un archivo, pero lo mismo ocurre cuando se carga desde el HttpResponse.

<code>final Socket client = (setup above)

// encrypted file input stream
final CipherInputStream inputStream = getInputStream(file);

// setup the socket output stream
final OutputStream output =  client.getOutputStream();

// Writing the header
final String httpHeader = buildHttpHeader(file.length());
final byte[] buffer = httpHeader.getBytes("UTF-8");
output.write(buffer, 0, buffer.length);

int writtenBytes = 0;
int readBytes;
final byte[] buff = new byte[1024 * 12]; // 12 KB

while (mIsRunning && (readBytes = inputStream.read(buff)) != -1) {
    output.write(buff, 0, readBytes);
    writtenBytes += readBytes;
}

output.flush();
output.close();
</code>

Los encabezados HTTP que se escriben en el MediaPlayer antes del audio ..

<code>private String buildHttpHeader(final int contentLength) {
    final StringBuilder sb = new StringBuilder();

    sb.append("HTTP/1.1 200 OK\r\n");
    sb.append("Content-Length: ").append(contentLength).append("\r\n");
    sb.append("Accept-Ranges: bytes\r\n" );
    sb.append("Content-Type: audio/mpeg\r\n");
    sb.append("Connection: close\r\n" );
    sb.append("\r\n");

    return sb.toString();
}
</code>

Busqué implementaciones alternativas, pero como tengo audio encriptado y MediaPlayer no es compatible con InputStreams como fuente de datos, mi única opción (creo ...) es usar un proxy como este.

Nuevamente, esto funciona bastante bien con Android 2.1 - 2.3, pero en ICS, el MediaPlayer almacena una gran cantidad de estos datos antes de jugar.

EDIT 2:

Pruebas adicionales muestran que esto también es un problema en el SGS2 una vez actualizado a Android 4.0.3. Así que parece que la implementación del búfer de MediaPlayer ha cambiado significativamente en 4.0. Esto es frustrante ya que la API no proporciona ninguna forma de alterar el comportamiento.

EDITAR 3:

Error de Android creado. Por favor agregue comentarios y comience allí tambiénhttp://code.google.com/p/android/issues/detail?id=29870

EDITAR 4:

Mi código de reproducción es bastante estándar. Tengo la llamada de inicio () en el MediaPlayer en mi método onPrepared ().

<code>mCurrentPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mCurrentPlayer.setDataSource(url);
mCurrentPlayer.prepareAsync();
</code>

Lo he intentado usando solo prepare () y también la forma recomendada de ajacian81 pero sin éxito.

Debo agregar que recientemente un empleado de Google se comunicó conmigo sobre mi pregunta y confirmó que el tamaño del búfer se incrementó intencionalmente en ICS (para contenido de alta definición). Se ha solicitado a los desarrolladores de API que agreguen la capacidad de establecer un tamaño de búfer en MediaPlayer.

Aunque creo que esta solicitud de cambio de API había existido antes de que llegara, no recomendaría a nadie que contenga la respiración.

Respuestas a la pregunta(2)

Su respuesta a la pregunta