9

这是问题所在,当视频流开始在 videoview 中播放时,我想将播放按钮更改为暂停按钮,但我不知道如何检测该事件?

4

7 回答 7

20

这里有一篇关于 MediaPlayer 的精彩文章 - http://www.malmstein.com/blog/2014/08/09/how-to-use-a-textureview-to-display-a-video-with-custom-媒体播放器控制/

您可以在 VideoView 上设置 infoListener

setOnInfoListener(new MediaPlayer.OnInfoListener() {
    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {

        if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
            // Here the video starts
            return true;
        }
        return false;
    }
于 2015-09-14T13:54:27.120 回答
12

我最终使用了 VideoView.setOnPreparedListener。这足以解决我的问题(播放按钮可绘制更改为暂停)

于 2011-04-06T07:45:11.590 回答
9

这里接受的答案不是 100% 准确的。

有时 onprepared 在第一帧被渲染前 3 秒调用。我建议对该事件进行回调(MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START)

mMediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
    @Override
    public boolean onInfo(MediaPlayer mediaPlayer, int i, int i1) {
        if (i == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START){
            //first frame was bufered - do your stuff here
        }
        return false;
    }
});

有关信息/警告的更多回调,请参阅媒体信息文档: https ://developer.android.com/reference/android/media/MediaPlayer.html#MEDIA_INFO_VIDEO_RENDERING_START

于 2017-03-01T09:04:00.123 回答
1

据我所知,在 VideoView 中开始播放视频时没有发送任何事件,但我可以想到两个选项:

  1. 自己创建一个 VideoView 版本,在这些情况下发送事件。
  2. 使用 MediaController(在 VideoView 中是默认的)

如果您想遵循选项一 - 您可以从此处获取 VideoView的来源

于 2011-04-03T13:12:16.453 回答
-1

可以调用isPlaying()来测试MediaPlayer对象是否在Started

Android MediaPlayer.isPlaying()

于 2011-04-03T12:47:18.057 回答
-1

另一种检测 videoview 是否启动的方法是使用 videoView.getCurrentPosition()。如果流未开始, getCurrentPosition()返回 0。

    protected Runnable playingCheck = new Runnable() {
        public void run() {
            while (true) {
                if (vw.getCurrentPosition() != 0) {
                    // do what you want when playing started
                    break;
                } else {
                    try {
                        Thread.sleep(250);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    };

然后调用:

new Thread(playingCheck).start();
于 2014-03-04T09:57:24.153 回答
-1

请试试这个:

final Handler h = new Handler();
                h.postDelayed( new Runnable() {
                    public void run() {
                            if (videoView.getCurrentPosition() != 0) {
                                ((ProgressBar) rootView.findViewById(R.id.pgStreaming)).setVisibility(View.GONE);
                            } else {
                                h.postDelayed(this, 250);
                            }
                    }
                }, 250);
于 2015-04-26T05:39:53.120 回答