[Android] ExoPlayer Blink 해결하기

Hoojeong Kim·2022년 11월 10일
0
post-thumbnail

영상 재생 시, 약 1초간 검은 화면으로 깜빡거린다.

바로 렌더링이 아직 끝나지 않았기 때문인데, 아예 없앨 수는 없는 것 같고...
가리는 방법 밖에 없는 듯 하다.


실패한 방법들..

1. shutter_background_color

https://stackoverflow.com/questions/68674774/video-flashes-black-just-before-playing-exoplayer


코드로 설정하거나 XML에서 설정할 수 있음. 그러나 안 됨.
exoPlayView.setShutterBackgroundColor(Color.TRANSPARENT)
app:shutter_background_color="@color/transparent"

2. surface_type

surface_view, texture_view 다 안 됨.

app:surface_type="texture_view"

3. CustomSurfaceView

https://github.com/google/ExoPlayer/issues/4303

카메라나 OpenGL 등을 수행할 때 SurfaceView를 사용하는데, 투명한 SurfaceView를 만들면 해결할 수 있단 글을 봤다.

그러나 안 됨.


4. 해상도 조절

기존 영상이 약 15~20MB 정도 됐었는데, 6~12MB까지 줄여보기도 했다. 그러나 전과 동일하게 계속 깜빡거림. ㅠ


적용한 방법

결국엔 동영상의 0번째 프레임으로 썸네일을 추출하여 렌더링 되는 동안 띄워주기로 했다.

썸네일 생성

MediaMetadataRetriever 를 사용해 영상의 특정 프레임을 이미지로 변환할 수 있다.

그래서 0번째 프레임을 비트맵 이미지로 추출하여, ExoPlayer 위에 전체 이미지뷰로 추가했다.

private fun getThumbnail() {

	val uri = MethodStorage.readVideoUri(videoData.video).toString()

	val mediaMetadataRetriever = MediaMetadataRetriever()
    mediaMetadataRetriever.setDataSource(uri)

    val bitmap: Bitmap? = mediaMetadataRetriever.getFrameAtIndex(0)

    binding.ivThumbnail.setImageBitmap(bitmap)
}

사실 처음엔 ThumbnailUtils를 사용했었는데, 이미지 생성이 안 돼서 MediaMetadataRetriever를 사용했다. 하하

ThumbnailUtils 참고

https://developer.android.com/reference/android/media/ThumbnailUtils#public-methods


썸네일 숨기기

onRenderedFirstFrame() 렌더링이 끝난 이후에 호출되는 콜백 함수이다.

내부에 썸네일 이미지뷰를 GONE 처리하는 코드를 추가하면, 렌더링이 끝난 시점에 사라지는 것을 확인할 수 있다.

override fun onRenderedFirstFrame() {
    super.onRenderedFirstFrame()

	ivThumbnail.visibility = View.GONE
}

이렇게 구현하면 깜빡거리지 않지만, 썸네일로 가린 것 뿐..
그리고 깜빡거리는 동안 썸네일이 뜨기 때문에 영상이 살짝 늦게 시작하는 것처럼 보인다.

뭐 애니메이션을 넣거나 해서 눈속임은 가능할지도 모르겠다.


더 좋은 해결 방법이 있다면 추가해야지... 있다면.. ㅠ

profile
나 애기 개발자 👶🏻

0개의 댓글