2011-10-04 9 views
8

Estoy implementando un reproductor multimedia que reproduce una transmisión desde una máquina remota. A través de mi aplicación, puedo controlar la máquina remota (por ejemplo, buscar en segundo lugar). Funciona como el encanto, pero: el Reproductor de Android Media amortigua unos 10-15 segundos de locura (!!), lo que significa que cada clic ('buscar') tarda de 10 a 15 segundos en surtir efecto a pesar de que es menos de un segundo hasta que el nuevo los datos lleganCómo evitar 15 segundos de retraso/almacenamiento en caché en Android Media Player cuando se reproduce la secuencia

Mi pregunta: ¿Hay alguna forma de controlar (limitar) el almacenamiento en caché? ¿O simplemente estoy haciendo algo mal? ¿Soy el único que tiene este problema?

Mi código es muy simple:

player = new MediaPlayer() 
player.setDataSource(url); 
player.setOnPreparedListener(new OnPreparedListener() { 

    public void onPrepared(MediaPlayer mp) { 
     mp.start(); 
    } 
}); 
player.prepareAsync(); 

ACTUALIZACIÓN: estoy usando un mini servidor HTTP autónomo local construido para conectar el flujo de bytes al reproductor de medios androides. Parece que Android DRM está retrasando/almacenando en caché en este caso. Todavía no estoy del todo claro por qué (y por qué no si me conecto a mi IIS que aloja un archivo). Además, no tengo idea de cómo solucionar esto.

Entrada bienvenida!

Gracias! Daniel

Respuesta

1

Ok, por su parte me acercaba a la solución. Resultó que la fuente de mi problema es Android DRM! (No, no estoy reproduciendo un archivo protegido. Es su mp3 estándar).

DRM parece haber sido introducido en Android 3.1 (estaba probando en un Galaxy Tab 10.1). Funciona bien en el emulador (¿quizás DRM no está implementado allí?)

¿Alguna idea de cómo puedo desactivar o acelerar esto? Parece que hay un temporizador de 10 segundos en algún lugar profundo de la implementación DRM de Android que espera, lo que sea, ni idea. Mi registro de errores:

10-06 17:38:19.020: ERROR/MediaExtractor(226): **********MediaExtractor::Create 
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(226): add uniqueid 
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 1 
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :ADD_UNIQUEID 
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 3 
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :ADD_CLIENT 
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(226): Entering BpDrmManagerService::openDecryptSession 
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 27 
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI 
10-06 17:38:19.020: ERROR/DrmManagerService(Native)(225): Entering DrmManagerService::openDecryptSession with uri 

10 seconds wait 

10-06 17:38:29.040: ERROR/DrmManager(Native)(225): DrmManager::openDecryptSession: no capable plug-in found 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): NULL decryptHandle is returned 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(226): no decryptHandle is generated in service side 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(226): remove uniqueid 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 2 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :REMOVE_UNIQUEID 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 4 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :REMOVE_CLIENT 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(226): setDrmServiceListener 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 5 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER 
10-06 17:38:29.040: ERROR/DrmManagerService(Native)(225): Entering setDrmServiceListener 
+0

¿Alguna vez has encontrado una solución para esto? – ernazm

+1

ninguna que me atreví a compartir :) En una versión anterior de Android 3.0 podría trabajar a su alrededor reemplazando mis líneas de respuesta HTTP de \ r \ n a \ n \ r. Sí, estaba pensando en devolver mi CS en ese momento :). Tal vez exploté algún error allí. No tengo un dispositivo para probar esto más desafortunadamente, así que no puedo reproducirlo. – Daniel

0

Pruebe esto. esto sin duda ayudará a ::

private class TouchandshowTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... arg0) { 
     try { 
     player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     player.setDataSource("URL"); 
     player.prepare(); 
    } catch (Exception e) { 
     // TODO: handle exception 
    } 

     return null; 
    } 
    protected void onPostExecute(final Void unused) { 

    } 
} 

OnCreate()

new TouchandshowTask().execute(); 
+0

lamentablemente eso no ayudó. Y lo que es peor, traté de acelerar la transferencia al principio para minimizar el retraso: transferí el primer megabyte (de 3) en un segundo, ¡y aun así tardé más de 10 segundos en comenzar a reproducirlo! No tengo idea de lo que sucede allí, pero no parece un problema de almacenamiento en caché. – Daniel

+0

nunca me he enfrentado a este problema, también recibo sonido del servidor pero no recibo ningún retraso. Obtengo 50 sonidos pero nunca planteo el problema –

+1

Cuando simplemente transmito un archivo desde un servidor, también funciona perfectamente para mí. Pero una vez que estoy sintonizando una transmisión, aparece la demora ... – Daniel

0

El problema podría ser no solo en Android Media Player. El servidor que está transmitiendo video debe ser compatible con el formato de necesidad.

Si es mp4 necesita instalar el módulo h264-pseudo-streaming (lo mismo para HLS) Si se trata de MSS (transmisión suave de Microsoft), hay módulos especiales para IIS.

Además, después de que el usuario 'hace una búsqueda' eso significa que el Reproductor nativo enviará la solicitud de rango, que debe ser soportado por el servidor. Nginx los admite de forma predeterminada, ISS & Apache tiene algunos problemas con esto. Aunque fácil de configurar.

0

Una cosa que me di cuenta en las versiones más nuevas de Android es que parece tener problemas con los archivos VBR MP3. Los reproduce, pero almacena demasiados datos antes de que comience. (3+ MB, la mayoría de mis archivos de prueba).

Una solución (mal hack) es eliminar el encabezado XING de los archivos MP3 (aquí es donde se almacena la información VBR). Esto parece hacer que el jugador recurra a un algoritmo más simple y comience la reproducción con éxito para todos mis archivos después de almacenar solo 100 kb ...

Cuestiones relacionadas