2013-05-31 26 views
3

我的問題是,應用程序停留約3-4秒,在prepareAsync: 這需要長期,所以我需要改變一些東西,以減少它在那裏停留的時間。的MediaPlayer需要長期的prepareAsync,如何最大限度地減少時間

這是我的代碼:

if (path_to_play == "") { 
       fragmentNavigator.setErrorMessage("notif test: Video url cannot be accessed"); 
      } 
      setSurfaceHolder(); 
      updateStatistics(); 
      loading.setVisibility(View.VISIBLE); 
      break; 
    mMediaPlayer = new MediaPlayer(); 

     try { 
      mMediaPlayer.setDataSource(path_to_play); 
      if ((holder != null) && (holder.getClass() != null) && holder.getSurface().isValid()) { 
       mMediaPlayer.setDisplay(holder); 
      } else { 
       LogService.log(TAG, "notif test: holder: " + holder); 
       setSurfaceHolder(); 
      } 
      mMediaPlayer.setOnPreparedListener(this); 
      mMediaPlayer.setOnCompletionListener(this); 
      mMediaPlayer.setOnVideoSizeChangedListener(this); 
      mMediaPlayer.setOnErrorListener(this); 
      mMediaPlayer.setOnSeekCompleteListener(this); 
      mMediaPlayer.prepareAsync(); 
     } catch (IllegalArgumentException e) { 
      LogService.log(TAG, "notif test: IllegalArgumentException called"); 
      LogService.err(TAG, e.getMessage(), e, 1); 
     } catch (IllegalStateException e) { 
      LogService.log(TAG, "notif test: IllegalStateException called"); 
      LogService.err(TAG, e.getMessage(), e, 1); 
     } catch (IOException e) { 
      LogService.log(TAG, "notif test: IOException called"); 
      doCleanUp(); 
     try { 
      mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     } catch (NullPointerException e) { 
      LogService.log(TAG, "notif test: NullPointerException called"); 
      LogService.err(TAG, e.getMessage(), e, 1); 
     } 

這是我onPrepare功能是什麼樣子:

public void onPrepared(MediaPlayer mediaplayer) { 
    startVideoPlayback(); //function that starts the video 
} 

這是StartVideoPlayback功能:

private void startVideoPlayback() { 
    LogService.log(TAG, "startVideoPlayback()"); 

    if (holder.getSurface() == null) { 
     setSurfaceHolder(); 
    } 
    if (record_canceled) { 
     wasPaused = true; 
     LogService.log(TAG, "waspaused intent: " + wasPaused); 
    } 
    if (/* VideoDataManager.getInstance().getVideoRecorded() || */wasPaused) { 
     LogService.log(TAG, "seek"); 
     mMediaPlayer.seekTo(100); 
     play.setImageResource(R.drawable.play); 
    } else if (record_canceled) { 
     if (mMediaPlayer.isPlaying()) { 
      mMediaPlayer.pause(); 
     } 
     play.setImageResource(R.drawable.play); 
    } else { 
     LogService.log(TAG, "dont seek: " + wasPaused); 
     mMediaPlayer.start(); 
     mMediaPlayer.seekTo(100); 
     wasPaused = false; 
     play.setImageResource(R.drawable.pause); 
    } 
    updateButtonStates(); 
    updateStatistics(); 

    loading.setVisibility(View.INVISIBLE); 

    if (VideoDataManager.getInstance().getVideoRecorded() && wasPaused) { 
     LogService.log(TAG, "------- pause the new recorded video, setVideoRecorded(false)"); 
     // VideoDataManager.getInstance().setVideoRecorded(false); 
    } 

    if (VideoDataManager.getInstance().getVideoRecorded() && mReloadVideo) { 
     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     // NetworkInfo ni = cm.getActiveNetworkInfo(); 
     // if ((ni != null) && (ni.getState() == 
     // NetworkInfo.State.CONNECTED)) { 
     // fragmentNavigator.uploading(); 
     // } 
     mReloadVideo = false; 
    } else if ((VideoHolderActivity.notificationBar.getTextMessageTag(VideoHolderActivity.notificationTextMessage).equals("new") || VideoHolderActivity.notificationBar.getTextMessageTag(VideoHolderActivity.notificationTextMessage).equals("gcm")) && (all_videos.size() > 1)) { 
     fragmentNavigator.BackButtonForNotification(); 
     VideoDataManager.getInstance().setVideoRecorded(false); 
    } else if (runOfflineReload) { 
     setVideoPlayback(); 
     runOfflineReload = false; 
    } 

} 

也試過onBufferingUpdate監聽器,而不是onPrepared,使用此代碼:

@Override 
public void onBufferingUpdate(MediaPlayer mp, int percent) { 
    LogService.log(TAG, "-------------------Onbuffering time: " + (System.currentTimeMillis() - startTimePrepare) + "||||percentage: " + percent); 
    if (isAsync) { 
     LogService.log(TAG, "-------------------Onbuffering time: " + (System.currentTimeMillis() - startTimePrepare)); 
     mIsVideoReadyToBePlayed = true; 
     PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
     if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown && pm.isScreenOn()) { 
      startVideoPlayback(); 
      downloadService(); 
      mp.setOnBufferingUpdateListener(null); 
      isAsync = false; 
     } 
    } 

} 

有時,當onBufferingUpdate被調用兩次,一次爲100次,一次約爲60-80%時,我設法節省大約1000ms。但這還不夠。不知怎的,我能不能更快地調用它?在30%左右?

+0

我沒有爲這個真正的答案,但這樣會幫助你的應用對用戶(HTTP少折騰://計算器.COM /問題/ 6582908 /爲什麼 - 不,它走那麼長的換機器人,媒體播放器到準備 - 一些活流/ 42042218#42042218) – LiTTle

回答

1
if (mediaPlayer == null) { 
mediaPlayer = new MediaPlayer(); 
mediaPlayer.setOnErrorListener(....); 
mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 
    public void onPrepared(MediaPlayer mp) { 
     ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton); 
     playButton.setClickable(true); 
     mp.start(); 
     } 
    }); 
} 

編輯

我認爲有與服務器端的一些兼容性問題。這很奇怪,因爲模擬器在我的情況下處理它 - 即使它是相同的API版本,也不在我的Froyo Galaxy S上。

這可能是一個編解碼器問題,HTTP流的問題,我不知道。但所有失敗的服務器往往都是舊的,最底層的「Copyright 1998-2004」......並不是最近的或最新的你會想到的。

一個潛在的解決方法(我還沒有嘗試過)會使用StreamProxy,這樣也會使你的代碼太2.1甚至更早版本兼容。在額外的工作,額外的代碼的成本,毫無疑問額外的錯誤...

+0

好,這是我的代碼做什麼,只是做一些測試之前 –

相關問題