2011-10-04 13 views
8

Sto implementando un lettore multimediale che riproduce uno streaming da una macchina remota. Tramite la mia app posso controllare la macchina remota (ad esempio cercare la seconda). Funziona come un incantesimo, ma: Android Media Player buffer alcuni folle 10-15 secondi (!!), il che significa che ogni clic ('cerca') richiede 10-15 secondi per avere effetto anche se è meno di un secondo fino al nuovo i dati arrivanoCome evitare 15 secondi di ritardo/memorizzazione nella cache in Android Media Player durante la riproduzione dello streaming

La mia domanda: C'è un modo per controllare (limitare) quella memorizzazione nella cache? O sto semplicemente facendo qualcosa di sbagliato? Sono l'unico ad avere questo problema?

Il mio codice è molto semplice:

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

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

UPDATE: Sto usando un server HTTP mini auto locale costruito per collegare il mio flusso di byte al lettore multimediale androidi. Sembra che Android DRM stia ritardando/nascondendo in questo caso. Ancora non del tutto chiaro perché (e perché no se mi collego al mio IIS che ospita un file). Inoltre non ha idea di come risolvere questo problema.

Ingresso benvenuto!

Grazie! Daniel

risposta

1

Ok, nel frattempo mi sono avvicinato alla soluzione. Ho scoperto che la fonte del mio problema è Android DRM! (No, non sto riproducendo un file protetto, il suo standard mp3).

DRM sembra essere stato introdotto in Android 3.1 (stavo testando su un Galaxy Tab 10.1). Funziona bene sull'emulatore (forse DRM non è implementato lì?)

Qualche idea su come posso disabilitare o accelerare questo? Sembra esserci un timer da 10 secondi da qualche parte nel sistema Android DRM che aspetta - qualunque cosa, nessuna idea. Il mio log degli errori:

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

Hai mai trovato una soluzione per questo? – ernazm

+1

nessuno che io abbia osato condividere :) Su alcune versioni precedenti di Android 3.0 avrei potuto lavorare attorno sostituendo le mie nuove linee di risposta HTTP da \ r \ n a \ n \ r. Sì, stavo pensando di restituire il mio diploma CS in quel momento :). Forse ho sfruttato qualche bug lì. Purtroppo non ho un dispositivo per testarlo, quindi non posso riprodurlo. – Daniel

0

Prova questo. questo sarà sicuramente aiutare a voi ::

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

sfortunatamente questo non ha aiutato. E ancora peggio, ho provato a turbocharge il trasferimento all'inizio per minimizzare il ritardo: ho trasferito il primo megabyte (su 3) in un secondo, e comunque ci sono voluti> 10 secondi per iniziare a giocare! Non ho idea di cosa stia succedendo, ma non sembra un problema di cache. – Daniel

+0

non ho mai affrontato questo problema, ricevo anche il suono dal server, ma non ho alcun ritardo.vengo 50 suoni ma non sollevo mai problemi –

+1

Quando faccio semplicemente lo streaming di un file da un server funziona perfettamente anche per me. Ma una volta che mi sono sintonizzato su uno stream c'è il ritardo ... – Daniel

0

Il problema potrebbe non riguardare solo Android Media Player. Il server che è in streaming video dovrebbe supportare il formato necessario.

Se è mp4 di è necessario installare il modulo (lo stesso per HLS) h264-pseudo-streaming Se si tratta di MSS (Microsoft Smooth Streaming) - ci sono moduli speciali per IIS.

Inoltre, dopo che l'utente "fa la ricerca", ciò significa che Native Player invierà la richiesta di intervallo, che dovrebbe essere supportata dal server. Nginx li supporta per impostazione predefinita, ISS & Apache ha alcuni problemi con questo. Anche se facilmente configurabile.

0

Una cosa che ho capito nelle versioni più recenti di Android è che sembra avere problemi con i file VBR MP3. Li riproduce, ma memorizza troppi dati prima che inizi. (3+ MB, la maggior parte dei miei file di test).

Una soluzione (non valida) consiste nel rimuovere l'intestazione XING dai file MP3 (qui sono archiviate le informazioni VBR). Questo sembra far ritornare il lettore su un algoritmo più semplice e avviare la riproduzione con successo per tutti i miei file dopo il buffering di soli 100kb ...