0

使用 Vitamio 媒体播放器时,我看不到视频实际开始渲染的常量(就像自 api 17 以来的普通 android MediaPlayer 一样)。onPreparedListeners 不会检测物理渲染何时开始,因此,视频开始之前的黑屏似乎是不可避免的。

有什么方法可以检测视频何时真正开始在 Vitamio 中渲染?

4

1 回答 1

0

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

  • 创建一个布尔值,默认为 false,它确定缓冲是否第一次完成。
  • 在您的 Vitamio 上设置 onInfoListenerVideoView.
  • 寻找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){}(通过创建它们的线程。)这样,就不需要 onInfoListener - 只需在 onPreparedListener 中启动第一个 Runnable。

于 2015-07-20T23:23:03.077 回答