2015-07-20 128 views
0

使用Vitamio媒体播放器时,我没有看到视频实际开始渲染时的常量(如自从api 17以来一直使用普通的Android MediaPlayer)。 onPreparedListeners不检测渲染物理何时开始,因此,视频启动之前的黑屏似乎是不可避免的。Vitamio相当于MEDIA_INFO_VIDEO_RENDERING_START

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

回答

0

虽然这是一个黑客攻击的一位,我发现这种方式创造奇迹:

  • 创建一个布尔值,默认为false,这决定了缓冲是否已经完成了第一次。
  • 设置一个onInfoListener您Vitamio VideoView.
  • 查找MediaPlayer.MEDIA_INFO_BUFFERING_END
  • 如果您创建的布尔是假的,然后将其设置为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 - 只需启动第一个Runnable在onPreparedListener中。