2012-09-21 39 views
8

我遇到了一個我正在處理的視頻流應用程序的奇怪問題。視頻/音頻的實際流式傳輸在我的所有測試設備上運行良好。然而,在看似任何4.0+設備上,使用RTSP URL時,prepare()會立即返回(這會導致在視頻加載時干擾我所使用的其他幾個系統時向用戶提供正確反饋的問題)。Android 4.0.4 MediaPlayer使用RTSP網址準備問題

下面的代碼,我初始化和設置我的MediaPlayer塊,但要保持幾件事情:

  • 我initPlayer方法是從一個叫的AsyncTask。
  • 該視頻最終播放正確,但準備立即返回會在視頻加載過程中導致用戶缺乏反饋。在整個過程中發生
  • start()方法是通過onPrepared方法在我OnPreparedListener,這顯然成爲準備時(一個問題,叫上的MediaPlayer)返回
  • 任何種類的錯誤,然後它實際上是準備打。
  • HTTP流似乎正常工作,並且在低於4.0的每個測試設備上不會發生問題。

我一直在試圖解決這個問題的時間很長,而且一直沒有找到遇到這個問題的其他人。任何想法將不勝感激。

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

我面臨同樣的問題現在。你解決了這個問題嗎?如果是,請回答你自己的問題與解決方案。等候...!!! –

+1

任何解決方案??? –

+0

不幸的是,我從來沒有找到解決方案,儘管我不久前就停止了這個項目的工作。 – bread

回答

0

使用mp.prepareAsync(),因爲它對流媒體更好。使用prepare()塊,直到MediaPlayer準備好播放或發生IllegalStateException。此外,在Android 4(ICS)中,任何UI線程上的阻塞更加嚴格,並可能導致出現ANR(活動不響應)對話框。

最後一個想法,儘量避免在Android應用中使用e.printStackTrace();。 而是使用Log.e("TAG_STRING", e.getMessage(), e);將錯誤輸出到可從logcat訪問的android日誌記錄系統。

總而言之,它應該看起來是這樣的:

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

謝謝petey。我從AsyncTask調用prepare,所以它不會阻塞UI線程。無論如何,我已經嘗試使用prepareAsync()以及相同的結果。 – bread