如何检测VideoView何时开始播放(Android)?

这里的问题,我想改变播放button暂停button时,videostream开始在video播放,但我不知道如何检测该事件

Solutions Collecting From Web of "如何检测VideoView何时开始播放(Android)?"

我结束了使用VideoView.setOnPreparedListener。 这足以覆盖我的问题(播放buttondrawable更改为暂停)

在这里有一篇关于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; } 

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

有时准备好的是在第一帧被渲染前3秒。 我build议对该事件进行callback(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; } }); 

有关info / warning的更多callback,请参阅media info documantaion: https : //developer.android.com/reference/android/media/MediaPlayer.html#MEDIA_INFO_VIDEO_RENDERING_START

据我所知,当video开始在VideoView中播放时没有事件发生,但我可以想到两个select:

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

如果你想跟随选项一 – 你可以从这里得到VideoView的来源

可以调用isPlaying()来testingMediaPlayer对象是否在Started中

Android MediaPlayer.isPlaying()

另一种检测videoview是否开始的方法是使用videoView.getCurrentPosition()。 如果stream式传输未开始, 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(); 

请试试这个:

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