영상 재생 시, 약 1초간 검은 화면으로 깜빡거린다.
바로 렌더링이 아직 끝나지 않았기 때문인데, 아예 없앨 수는 없는 것 같고...
가리는 방법 밖에 없는 듯 하다.
https://stackoverflow.com/questions/68674774/video-flashes-black-just-before-playing-exoplayer
exoPlayView.setShutterBackgroundColor(Color.TRANSPARENT)
app:shutter_background_color="@color/transparent"
surface_view
, texture_view
다 안 됨.
app:surface_type="texture_view"
https://github.com/google/ExoPlayer/issues/4303
카메라나 OpenGL 등을 수행할 때 SurfaceView
를 사용하는데, 투명한 SurfaceView
를 만들면 해결할 수 있단 글을 봤다.
그러나 안 됨.
기존 영상이 약 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
}
이렇게 구현하면 깜빡거리지 않지만, 썸네일로 가린 것 뿐..
그리고 깜빡거리는 동안 썸네일이 뜨기 때문에 영상이 살짝 늦게 시작하는 것처럼 보인다.
뭐 애니메이션을 넣거나 해서 눈속임은 가능할지도 모르겠다.
더 좋은 해결 방법이 있다면 추가해야지... 있다면.. ㅠ