Vitamio相当于MEDIA_INFO_VIDEO_RENDERING_START

时间:2015-07-20 23:12:12

标签: android android-mediaplayer vitamio

使用Vitamio媒体播放器时,我看不到视频实际开始渲染的常数(因为自api 17以来一直存在普通的Android MediaPlayer)。 onPreparedListeners不会检测渲染物理启动的时间,因此,视频启动之前的黑屏似乎是不可避免的。

有没有办法检测视频何时实际开始在Vitamio中渲染?

1 个答案:

答案 0 :(得分:0)

虽然这有点像黑客,但我发现这种方式可以创造奇迹:

  • 创建一个布尔值,默认为false,用于确定缓冲是否第一次完成。
  • 在Vitamio VideoView.
  • 上设置onInfoListener
  • 寻找MediaPlayer.MEDIA_INFO_BUFFERING_END
  • 如果您创建的布尔值为false,则将其设置为true并使用while循环等待,直到yourVideoView.getCurrentPosition() != 0.注意0可能太低 - 有时getCurrentPosition将返回更高的数字在它开始之前比零为零,但通常返回的值不会高于1000 /(视频的fps)。我用了40。
  • 执行所需的代码(删除其他视图以使VideoView可见,或将VideoView添加到布局中)。
  • 在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。