使用 Vitamio 媒体播放器时,我看不到视频实际开始渲染的常量(就像自 api 17 以来的普通 android MediaPlayer 一样)。onPreparedListeners 不会检测物理渲染何时开始,因此,视频开始之前的黑屏似乎是不可避免的。
有什么方法可以检测视频何时真正开始在 Vitamio 中渲染?
使用 Vitamio 媒体播放器时,我看不到视频实际开始渲染的常量(就像自 api 17 以来的普通 android MediaPlayer 一样)。onPreparedListeners 不会检测物理渲染何时开始,因此,视频开始之前的黑屏似乎是不可避免的。
有什么方法可以检测视频何时真正开始在 Vitamio 中渲染?
虽然这有点 hack,但我发现这种方式可以创造奇迹:
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){}
(通过创建它们的线程。)这样,就不需要 onInfoListener - 只需在 onPreparedListener 中启动第一个 Runnable。