【问题标题】:How to detect when VideoView starts playing (Android)?如何检测 VideoView 何时开始播放(Android)?
【发布时间】:2011-04-03 12:29:05
【问题描述】:

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

【问题讨论】:

    标签: android events android-videoview


    【解决方案1】:

    这里有一篇关于 MediaPlayer 的精彩文章 - http://www.malmstein.com/blog/2014/08/09/how-to-use-a-textureview-to-display-a-video-with-custom-media-player-controls/

    您可以在 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;
        }
    

    【讨论】:

    • 谢谢,可惜需要 API > 16
    • 这里的链接坏了
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      此处接受的答案并非 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

      【讨论】:

        【解决方案4】:

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

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

        如果你想按照选项一 - 你可以得到VideoView from here的来源

        【讨论】:

          【解决方案5】:

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

          Android MediaPlayer.isPlaying()

          【讨论】:

            【解决方案6】:

            检测 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();
            

            【讨论】:

            • 天啊,请不要往这边走!您正在轮询一段时间(真)。这真的很糟糕。
            • 我同意@edoardotognoni
            • 答案的重点不是循环部分,而是getCurrentPosition()方法。我只是想定期调用这个函数来检测视频是否启动。如果需要,您可以使用不同的结构进行定期操作。但就像我说的,这不是“我的视频是否开始”问题的重要部分
            • 如果你说明我应该使用什么而不是 while(true),我会很高兴。
            【解决方案7】:

            请试试这个:

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

            【讨论】:

              猜你喜欢
              • 2017-02-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-01-07
              • 1970-01-01
              相关资源
              最近更新 更多