2013-09-03 36 views
6

Tôi đang cố triển khai danh sách phát video để chúng có chuyển đổi suôn sẻ từ video này sang video khác tiếp theo. Đối tượng mediaPlayer có một phương thức prepareasync() có vẻ như đã tạo sẵn video để sẵn sàng phát. Làm cách nào để gọi phương thức prepareasync từ đối tượng VideoView? Các ví dụ tôi tìm thấy cho mediaPlayer hoặc là không sử dụng VideoView và dường như tạo bề mặt từ đầu. Hoặc các ví dụ sử dụng mediaPlayer như tham số trả về trên videoview eventlisteners mà dường như chỉ xảy ra sau khi videoview.play(). Tôi muốn có quyền truy cập vào mediaplayer của videoview trước khi gọi phương thức play để tôi có thể gọi đến prepareasync() và sau đó là play().Gọi MediaPlayer.PrepareAsync từ VideoView

Trả lời

0

VideoView là trình bao bọc xung quanh MediaPlayer và SurfaceView, do đó bạn không phải tự làm điều đó. Tôi tin rằng các wrapper không chuẩn bị khi bạn gọi setVideoURI. Có thể giữ được mediaplayer bên trong VideoView thông qua event handler onPrepared, và một khi bạn đã có nó, tôi đoán bạn có thể gọi chuẩn bị cho mình sau lần đầu tiên, nhưng tôi thu thập nội bộ rất phức tạp và không được ghi chép đầy đủ có thể không hoạt động như mong đợi.

1

Giống như user1023110 được đề cập, VideoView là trình bao bọc xung quanh MediaPlayer. Lặn vào mã nguồn (vì tài liệu không hữu ích chút nào) Tôi đã xác nhận rằng nội bộ gọi là PrepareAsync() theo phương thức riêng của mình openVideo():

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; 
    } 
} 
Các vấn đề liên quan