android - 从 VideoView 调用 MediaPlayer.PrepareAsync

标签 android android-videoview

我正在尝试实现一个视频播放列表,以便它们可以从一个视频平稳过渡到下一个。 mediaPlayer 对象有一个 prepareasync() 方法,它似乎可以预先缓冲视频以便播放。如何从 VideoView 对象调用 prepareasync 方法?我为 mediaPlayer 找到的示例要么不使用 VideoView,要么似乎是从头开始创建表面。或者示例使用 mediaPlayer 作为 videoview 事件监听器的返回参数,这似乎只在 videoview.play() 之后发生。我想在调用播放方法之前访问 videoview 的媒体播放器,这样我就可以调用 prepareasync(),然后再调用 play()。

最佳答案

正如user1023110提到,VideoView 是 MediaPlayer 的包装器。深入研究源代码(因为文档根本没有用)我确认它在其私有(private)方法 openVideo() 内部调用了 prepareAsync():

   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;
    }
}

关于android - 从 VideoView 调用 MediaPlayer.PrepareAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18598675/

相关文章:

android - Actionbarsherlock 后退按钮不返回

java - Android HttpURLConnection 方法在 API 23 中被删除?

c# - 部署 Xamarin.Android 应用的发布版本时遇到问题

android - AlertDialog 在 Nexus 设备上看起来不同

android - 当我的代码没有出现在堆栈上时,如何解释 ANR traces.txt?

android - 视频播放完毕后启动 Activity

android - 如何在视频 View 中播放 youtube 视频

android - 如何在android中获取视频缩略图?

android - 两个VideoView重叠

android - 在线为Android应用程序VideoView存储视频