使用Vitamio媒体播放器时,我没有看到视频实际开始渲染时的常量(如自从api 17以来一直使用普通的Android MediaPlayer)。 onPreparedListeners不检测渲染物理何时开始,因此,视频启动之前的黑屏似乎是不可避免的。Vitamio相当于MEDIA_INFO_VIDEO_RENDERING_START
有没有什么方法可以检测视频何时开始在Vitamio中渲染?
使用Vitamio媒体播放器时,我没有看到视频实际开始渲染时的常量(如自从api 17以来一直使用普通的Android MediaPlayer)。 onPreparedListeners不检测渲染物理何时开始,因此,视频启动之前的黑屏似乎是不可避免的。Vitamio相当于MEDIA_INFO_VIDEO_RENDERING_START
有没有什么方法可以检测视频何时开始在Vitamio中渲染?
虽然这是一个黑客攻击的一位,我发现这种方式创造奇迹:
VideoView.
MediaPlayer.MEDIA_INFO_BUFFERING_END
yourVideoView.getCurrentPosition() != 0.
注意0可能太低 - - 有时getCurrentPosition
会在开始前返回一个高于零的数字,但通常返回的值不会高于1000 /(您的视频的fps)。我使用了40.在OnCompletionListener中,将创建的布尔值设置为false。
公共类AnimationCanvas扩展VideoView {
public static AnimationCanvas animationCanvas;
private static boolean bufferedOnce = false;
public AnimationCanvas(Context context, AttributeSet attrs){
super(context, attrs);
animationCanvas = this;
getHolder().addCallback(this);
this.setOnInfoListener(new MediaPlayer.OnInfoListener() {
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
if (!bufferedOnce && what == MediaPlayer.MEDIA_INFO_BUFFERING_END) {
bufferedOnce = true;
while (getCurrentPosition() < 40) {
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
MainActivity.frameLayout.removeView(MainCanvas.mainCanvas);
return true;
}
return false;
}
});
this.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
bufferedOnce = false;
MainActivity.frameLayout.addView(MainCanvas.mainCanvas);
MainActivity.frameLayout.removeView(animationCanvas);
}
});
}
编辑:注意,另一种选择是创建一个单独的Runnable这确实等待(while(vv.getCurrentPosition() < 40){}
),然后在同一个Runnable接口,调用runOnUIThread()运行第二个runnable,如果需要,它可以更改/删除/添加视图(视图只能由创建它们的线程触及)。这样,不需要onInfoListener - 只需启动第一个Runnable在onPreparedListener中。