有没有办法在VideoPlayer中播放视频之前避免瞬间黑屏?

时间:2014-01-16 16:06:50

标签: android android-videoview

我正在使用全屏VideoView并播放原始文件夹中的< 1mb视频文件。

出于某种原因,无论我做什么(我已经尝试过每一个我能想到的kludge),在播放视频之前,播放器会变黑约1/4秒。

我已尝试将VideoView的可见性设置为隐藏,并使用onPreparedListener回调不会将其公开,直到它返回。我已经尝试过将一个普通的定时器放在它上面,然后再将它的可见性恢复到可见状态,我已经尝试了seek()到它的1秒位置,我甚至试过加载视频onCreate(直到应用程序的后期才需要它),以便当用户到达时它将被加载并准备就绪,但无论我做什么,它都会在它前面闪烁着黑暗播放。

如果VideoView没有出现,直到它真正准备开始播放,我会喜欢一些指导。

我很乐意发布代码,但它是非常通用的VideoView播放代码。我没有做任何不寻常的事。

1 个答案:

答案 0 :(得分:4)

所以,解决方案结果是我将视频加载到VideoView中,其可见性未设置为View.VISIBLE。

至少在撰写本文时(Android v.4.3),VideoView本身必须是可见的才能开始加载过程。但是,非常高兴能够成为包装器Layout的孩子,其可见性设置为View.INVISIBLE(尚未尝试过View.GONE,但怀疑也没问题)。

所以......关键是要有一个隐形的包装器布局,在VideoView上设置一个OnPrepared监听器,当它触发时,暴露包装器布局。在我的情况下,我注意到仍然有一个闪烁,所以我在使用Handler和Runnable之前添加了另外400ms的延迟,然后暴露父布局并且它完美地工作。

<!-- THIS VIEW SHOULD BE INVISIBLE SO THAT WE CAN PRE-LOAD THE VIDEO WITHOUT THE BLACK SCREEN -->
<RelativeLayout
    android:id="@+id/vidContainer"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:layout_marginTop="230dp" 
    android:layout_marginBottom="200dp"
    android:visibility="invisible"
    >

    <!-- THIS VIEW MUST BE VISIBLE IN ORDER TO LOAD VIDEO!!!!!! -->
    <VideoView
        android:id="@+id/videoView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_centerInParent="true"
         />
</RelativeLayout>

然后在android

private void playVideo(int vidid) {
    //vid id is whatever the video resource is, as in R.raw.myVideo
    Uri vid = Uri.parse("android.resource://" + getPackageName() + "/"
            + vidid);
    winnerVidPlayer = (VideoView) findViewById(R.id.videoView);

    //Let the preparer fire and when it does, wait a little longer to avoid ANY flicker before exposing
    //the wrapper Layout
    winnerVidPlayer.setOnPreparedListener(new OnPreparedListener() {        
        @Override
        public void onPrepared(MediaPlayer mp) {    
            new Handler().postDelayed(new Runnable(){
                public void run(){                                                              

        ((RelativeLayout)findViewById(R.id.vidContainer)).setVisibility(View.VISIBLE);  

                                   }
            },400);

        }           
    });

   winnerVidPlayer.setVideoURI(vid); 
   winnerVidPlayer.start();       
}