2012-09-21 14 views
8

Mam dziwny problem z aplikacją do strumieniowego przesyłania wideo, nad którą pracuję. Rzeczywiste przesyłanie wideo/audio działa dobrze na wszystkich moich urządzeniach testowych. Jednak na pozornie dowolnym urządzeniu 4.0+, gdy używa się adresu URL RTSP, prepare() zwraca natychmiast (powoduje to problem zapewniający odpowiednią informację dla użytkowników podczas ładowania wideo i przeszkadza w kilku innych systemach, które mam na miejscu).Android 4.0.4 Problem z przygotowaniem MediaPlayer przy użyciu adresów URL RTSP

Poniżej znajduje się fragment kodu, gdzie zainicjalizować i skonfigurować mój MediaPlayer, ale zachować kilka rzeczy na uwadze:

  • metoda My initPlayer nazywa z AsyncTask.
  • Obraz wideo ostatecznie odtwarza się poprawnie, ale natychmiastowe przygotowanie do powrotu powoduje brak informacji zwrotnej dla użytkownika podczas ładowania wideo.
  • Żadne błędy nie występują podczas całego procesu
  • Funkcja start() jest wywoływana w MediaPlayer za pomocą metody onPrepared w moim OnPreparedListener, co oczywiście staje się problemem, gdy prepare() zwraca, zanim będzie gotowy do odtworzenia .
  • Strumienie HTTP wydają się działać dobrze, a na każdym urządzeniu testowym poniżej 4.0 problem nie występuje.

Próbowałem to naprawić przez śmieszną ilość czasu i nie byłem w stanie znaleźć nikogo innego, kto wpadł na ten problem. Wszelkie pomysły będą mile widziane.

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

Jestem stoi ten sam problem teraz. Czy rozwiązałeś problem? jeśli tak, proszę odpowiedzieć na pytanie z rozwiązaniem. Czekanie...!!! –

+1

Jakieś rozwiązanie? –

+0

Niestety, nigdy nie znalazłem rozwiązania, chociaż przestałem pracować nad tym projektem jakiś czas temu. – bread

Odpowiedz

0

Zastosowanie mp.prepareAsync() jak to jest lepsze dla mediów strumieniowych. Używanie bloków, dopóki MediaPlayer nie będzie gotowy do odtwarzania lub wystąpi wyjątek IllegalStateException. Ponadto w Androidzie 4 (ICS) blokowanie dowolnego wątku UI jest jeszcze bardziej rygorystyczne i może spowodować wyświetlenie okna dialogowego ANR (Activity not responding).

Jedna ostateczna myśl, staraj się unikać używania e.printStackTrace(); w aplikacjach na Androida. Zamiast tego należy użyć Log.e("TAG_STRING", e.getMessage(), e);, aby wydrukować błędy w systemie rejestrowania w Androidzie, do którego można uzyskać dostęp pod numerem logcat.

W sumie powinno to wyglądać tak:

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

Dzięki petey. Wołam przygotowanie z AsyncTask, więc nie blokuje wątku UI. Niezależnie od tego, próbowałem używać metody prepareAsync() z tymi samymi wynikami. – bread

Powiązane problemy