[안드로이드] [자바] 멀티세그먼트 영상 전환 재생 시 단기 블랙스크린 현상 처리

논리적 설명

비디오 A가 재생 중일 때 비디오 A를 클릭하여 비디오 A의 나머지 콘텐츠를 건너뛰고 비디오 B를 로드합니다.

버그 설명

비디오를 전환할 때 다음 그림과 같이 짧은 검은색 화면이 표시됩니다.
여기에 이미지 설명 삽입

솔루션

이 버그가 나타나는 것을 보았을 때 첫 번째 반응은 두 번째 비디오가 비디오를 초기화할 때 특정 지연이 있어 검은 화면이 나타나므로 이 지연을 채울 방법을 찾아야 한다는 것입니다.

특정 솔루션

먼저 비디오의 첫 번째 프레임을 가져옵니다. 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의 가시성을 visible로 변경합니다.

   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, 큰 프런트 엔드 및 풀 스택에 대한 지식이나 소스 코드를 자주 업데이트하고 공유하고 공유하고 함께 발전하도록 주장합니다.


추천

출처blog.csdn.net/qq_31992051/article/details/130399820