2013-09-03 15 views
6

Ich versuche eine Wiedergabeliste von Videos zu implementieren, damit sie reibungslos von einem Video zum nächsten wechseln können. Das mediaPlayer-Objekt verfügt über eine prepareasync() -Methode, die das Video vorzuspüren scheint, damit es wiedergegeben werden kann. Wie rufe ich die Prepareasync-Methode vom VideoView-Objekt aus auf? Die Beispiele, die ich für mediaPlayer gefunden habe, verwenden entweder kein VideoView und scheinen die Oberfläche von Grund auf zu erstellen. Oder die Beispiele verwenden den mediaPlayer als Rückgabeparameter für Videobild-Ereignislistener, die anscheinend erst nach der videoview.play() -Erweiterung auftreten. Ich hätte gerne Zugriff auf den Mediaplayer von videoview, bevor ich die play-Methode aufrufen würde, damit ich prepareasync() und später play_() aufrufen kann.Aufruf von MediaPlayer.PrepareAsync von VideoView

Antwort

0

VideoView ist ein Wrapper für MediaPlayer und SurfaceView, sodass Sie es nicht selbst machen müssen. Ich glaube, der Wrapper macht die Vorbereitung, wenn Sie setVideoURI aufrufen. Es ist möglich, den Mediaplayer im VideoView durch den onPrepared Eventhandler zu erreichen, und sobald Sie es haben, können Sie sich anrufen nach dem ersten Mal vorbereiten, aber ich nehme an, die Interna sind knifflig und nicht so gut dokumentiert funktioniert möglicherweise nicht wie erwartet.

1

Genau wie user1023110 erwähnt, VideoView ist ein Wrapper um MediaPlayer. Tauchen in den Quellcode (da die Dokumente überhaupt nicht sinnvoll sind) Ich bestätigte, dass es ruft intern prepareAsync() in seiner privaten Methode Open():

private void openVideo() { 
    if (mUri == null || mSurfaceHolder == null) { 
     // not ready for playback just yet, will try again later 
     return; 
    } 
    // Tell the music playback service to pause 
    // TODO: these constants need to be published somewhere in the framework. 
    Intent i = new Intent("com.android.music.musicservicecommand"); 
    i.putExtra("command", "pause"); 
    mContext.sendBroadcast(i); 

    // we shouldn't clear the target state, because somebody might have 
    // called start() previously 
    release(false); 
    try { 
     mMediaPlayer = new MediaPlayer(); 
     if (mAudioSession != 0) { 
      mMediaPlayer.setAudioSessionId(mAudioSession); 
     } else { 
      mAudioSession = mMediaPlayer.getAudioSessionId(); 
     } 
     mMediaPlayer.setOnPreparedListener(mPreparedListener); 
     mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener); 
     mMediaPlayer.setOnCompletionListener(mCompletionListener); 
     mMediaPlayer.setOnErrorListener(mErrorListener); 
     mMediaPlayer.setOnInfoListener(mOnInfoListener); 
     mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener); 
     mCurrentBufferPercentage = 0; 
     mMediaPlayer.setDataSource(mContext, mUri, mHeaders); 
     mMediaPlayer.setDisplay(mSurfaceHolder); 
     mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     mMediaPlayer.setScreenOnWhilePlaying(true); 
     mMediaPlayer.prepareAsync(); 
     // we don't set the target state here either, but preserve the 
     // target state that was there before. 
     mCurrentState = STATE_PREPARING; 
     attachMediaController(); 
    } catch (IOException ex) { 
     Log.w(TAG, "Unable to open content: " + mUri, ex); 
     mCurrentState = STATE_ERROR; 
     mTargetState = STATE_ERROR; 
     mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0); 
     return; 
    } catch (IllegalArgumentException ex) { 
     Log.w(TAG, "Unable to open content: " + mUri, ex); 
     mCurrentState = STATE_ERROR; 
     mTargetState = STATE_ERROR; 
     mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0); 
     return; 
    } 
}