使用Vitamio媒体播放器时,我看不到视频实际开始渲染的常数(因为自api 17以来一直存在普通的Android MediaPlayer)。 onPreparedListeners不会检测渲染物理启动的时间,因此,视频启动之前的黑屏似乎是不可避免的。
有没有办法检测视频何时实际开始在Vitamio中渲染?
答案 0 :(得分:0)
虽然这有点像黑客,但我发现这种方式可以创造奇迹:
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 - 只需在onPreparedListener中启动第一个Runnable。