您现在的位置是:首页 >技术交流 >【Android】【Java】播放多段视频切换时出现的短暂黑屏现象处理网站首页技术交流

【Android】【Java】播放多段视频切换时出现的短暂黑屏现象处理

未来源起 2023-06-25 20:00:02
简介【Android】【Java】播放多段视频切换时出现的短暂黑屏现象处理

逻辑描述

当A视频正在播放中,点击A视频跳过A视频剩余内容并加载B视频

Bug描述

在切换视频时,显示短暂黑屏,如下图所示:
在这里插入图片描述

解决思路

当看到这个bug出现时,第一反应是第二段视频在初始化视频时有一定的延时,导致黑屏的出现,那么我们只要想办法填补上这段延时就可以了。

具体解决方案

首先将B视频的第一帧图片获取到
用FrameLayout作为父布局,将帧图盖到最上面一层(也就是VideoView上面)

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <xyz.doikki.videoplayer.player.VideoView
        android:id="@+id/player"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </xyz.doikki.videoplayer.player.VideoView>

    <ImageView
        android:id="@+id/img_sleep"
        android:visibility="gone"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@mipmap/sleep"
        />
</FrameLayout>

然后监听videoview的点击事件,点击时加载B视频,并且将imageview的visibility改为可见

   player.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                        //A视频点击,加载B视频
                        currentStatus = 1;
                        AssetFileDescriptor fd = getResources().openRawResourceFd(R.raw.home);
                        player.setLooping(false);
                        player.setAssetFileDescriptor(fd);
                        player.replay(false);   
                        img_sleep.setVisibility(VISIBLE);                                                             
            }
        });

之后在videoView的播放状态监听方法里调用

  player.setOnStateChangeListener(new BaseVideoView.OnStateChangeListener() {
            @Override
            public void onPlayerStateChanged(int playerState) {
                Log.e("SleepActivity", "onPlayerStateChanged: " + playerState);
            }

            @Override
            public void onPlayStateChanged(int playState) {
                Log.e("SleepActivity", "onPlayStateChanged: " + playState);
                if (currentStatus == 1 && playState == 3) {
                handler.postDelayed(new Runnable() {  // 开启的runnable也会在这个handler所依附线程中运行,即主线程
            @Override
            public void run() {
                // 可更新UI或做其他事情
                // 注意这里还在当前线程,没有开启新的线程
                // new Runnable(){},只是把Runnable对象以Message形式post到UI线程里的Looper中执行,并没有新开线程。
                img_sleep.setVisibility(View.GONE);
            }
        }, 80); // 延时80MS执行run内代码
                }
            }
        });

注意上面代码,当B视频开始播放时,不能让帧图过早的消失,否则可能还会出现黑屏效果,所以我在这里加了80MS的延时(这里根据硬件去改为合适的值)

最终效果

在这里插入图片描述
可以清楚地看到,已经没有肉眼可见的黑屏现象了。

好了这篇随意的分享就到这里。下一期,我将分享一些大厂关于Android、JAVA的面试总结以及知识导图,有兴趣的小伙伴一定要关注我!

***欢迎各位同学关注,接下来我会经常更新分享java 、小程序、Android、大前端、全栈方面的知识或是源码,坚持分享共同进步。


风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。