我正在使用全屏VideoView
并播放原始文件夹中的< 1mb视频文件。
出于某种原因,无论我做什么(我已经尝试过每一个我能想到的kludge),在播放视频之前,播放器会变黑约1/4秒。
我已尝试将VideoView
的可见性设置为隐藏,并使用onPreparedListener
回调不会将其公开,直到它返回。我已经尝试过将一个普通的定时器放在它上面,然后再将它的可见性恢复到可见状态,我已经尝试了seek()
到它的1秒位置,我甚至试过加载视频onCreate
(直到应用程序的后期才需要它),以便当用户到达时它将被加载并准备就绪,但无论我做什么,它都会在它前面闪烁着黑暗播放。
如果VideoView
没有出现,直到它真正准备开始播放,我会喜欢一些指导。
我很乐意发布代码,但它是非常通用的VideoView
播放代码。我没有做任何不寻常的事。
答案 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();
}