2012-09-21 13 views
8

Sto riscontrando un problema strano con un'applicazione di streaming video su cui sto lavorando. Lo streaming reale di video/audio sta funzionando bene su tutti i miei dispositivi di test. Tuttavia, su apparentemente qualsiasi dispositivo 4.0+, quando si utilizza un URL RTSP, prepare() ritorna istantaneamente (questo causa un problema che fornisce un feedback adeguato agli utenti mentre un video si sta caricando e interferisce con alcuni altri sistemi che ho installato).Android 4.0.4 MediaPlayer prepara il problema utilizzando gli URL RTSP

Di seguito è il blocco di codice dove ho inizializzare e installare il mio MediaPlayer, ma tenere un paio di cose in mente:

  • metodo mio initPlayer viene chiamato da un AsyncTask.
  • Il video viene infine riprodotto correttamente, ma preparare la restituzione istantanea crea una mancanza di feedback all'utente durante il caricamento di un video.
  • Nessun errore di alcun genere si verificano durante l'intero processo di
  • start() viene chiamato sul MediaPlayer tramite il metodo onPrepared nel mio OnPreparedListener, che diventa ovviamente un problema quando preparare() restituisce prima che sia effettivamente pronto per essere giocato .
  • Gli stream HTTP sembrano funzionare correttamente e su ogni dispositivo di test inferiore alla 4.0 il problema non si verifica.

Ho cercato di risolvere questo problema per un periodo di tempo ridicolo, e non sono stato in grado di trovare nessun altro che si è imbattuto in questo problema. Qualsiasi idea sarebbe molto apprezzata.

public void initPlayer() { 
     //We first need to make sure the MediaPlayer isn't null 
     if(mMediaPlayer==null){ 
      mMediaPlayer = new MediaPlayer(); 
      mMediaPlayer.setOnPreparedListener(mediaPlayerPreparedListener); 
      mMediaPlayer.setOnCompletionListener(mediaPlayerCompletionListener); 
      mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     } 
     //If a video/stream has been chosen while another is already playing 
     else if(mMediaPlayer.isPlaying()){ 
      mMediaPlayer.reset(); 
     } 
     //Video is not in full screen mode 
     second = false; 
     try { 
      mMediaPlayer.setDataSource(videoString); 
      holder = mPreview.getHolder(); 
      mMediaPlayer.setDisplay(holder); 
      mMediaPlayer.prepare(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    //onPreparedListener 
    private OnPreparedListener mediaPlayerPreparedListener = new OnPreparedListener(){ 
     public void onPrepared(MediaPlayer mp) { 
      mp.start(); 
      vidPb.setVisibility(View.INVISIBLE); 
     } 
    }; 
+0

sto affrontando lo stesso problema in questo momento. Hai risolto il problema? se si, per favore rispondi alla tua domanda con la soluzione. in attesa...!!! –

+1

Qualche soluzione ??? –

+0

Purtroppo non ho mai trovato una soluzione, anche se ho smesso di lavorare su questo progetto un po 'di tempo fa. – bread

risposta

0

Utilizzare mp.prepareAsync() come è meglio per lo streaming multimediale. Utilizzo dei blocchi prepare() fino a quando MediaPlayer è pronto per la riproduzione o si verifica un IllegalStateException. Inoltre, in Android 4 (ICS), il blocco su qualsiasi thread dell'interfaccia utente è ancora più rigoroso e potrebbe causare la visualizzazione di una finestra di dialogo ANR (attività che non risponde).

Un ultimo pensiero, cerca di evitare l'uso di e.printStackTrace(); nelle app Android. Utilizzare invece Log.e("TAG_STRING", e.getMessage(), e); per stampare errori nel sistema di registrazione Android a cui è possibile accedere da logcat.

Tutto sommato, dovrebbe apparire qualcosa di simile:

try { 
     mMediaPlayer.setDataSource(videoString); 
     holder = mPreview.getHolder(); 
     mMediaPlayer.setDisplay(holder); 
     mMediaPlayer.prepareAsync(); 
    } catch (IllegalArgumentException e) { 
     Log.e("TAG_STRING", e.getMessage(), e); 
    } catch (SecurityException e) { 
     Log.e("TAG_STRING", e.getMessage(), e); 
    } catch (IllegalStateException e) { 
     Log.e("TAG_STRING", e.getMessage(), e); 
    } catch (IOException e) { 
     Log.e("TAG_STRING", e.getMessage(), e); 
    } 
+1

Grazie petey. Sto chiamando prepararsi da un AsyncTask, quindi non sta bloccando il thread dell'interfaccia utente. Indipendentemente da ciò, ho provato a utilizzare prepareAsync() con gli stessi risultati. – bread