Exoplayer2를 이용한 video codec 알아내기

Updated:

Video Codec 알려줄 수 있겠니?

회사에서 작업을 하면서 비디오 파일을 재생시킬 때 코덱을 알아야하는 경우가 생겼다.


하지만 아무리 찾아봐도 나오질않던 codec… :video_camera:

내가 검색 능력이 아직 많이 모자란 탓이지만…

mediaCodec 으로 알 수 있었나 했지만 결과로는 container 만 나왔고….

exoplayer2 의 내장 리스너인 addAnalyticsListener 를 이용해서 알 수 있을까 하고 해봤지만 fps, duration 만 알 수 있었고 더는 알기가 어렵다고 생각했다.


그래서 더는 안되겠다 싶어서 exoplayer2 에 이슈로 질문을 올렸었다.(큰 기대 없이)


그렇게 기다리던 와중에!! 대답을 받을 수 있었다…(친절…) :bowing_man:

원문 링크

비디오 코덱은 - onVideoDecoderInitialized , 오디오 코덱은 - onAudioDecoderInitialized

에 존재하는 decoderName 을 이용하여 코덱의 내임을 알 수 있다는 것이었다.


그래서 회사 동료분께 다양한 코덱을 가진 비디오 리스트를 부탁드렸고,

아래의 안드로이드 지원 코덱을 가진 비디오들을 이용해 decoderName 을 로그로 출력해 보았다.

source code - kotlin

player?.let { it ->
    with(it) {
    		...
    		
        addAnalyticsListener(object : EventLogger(trackSelector as MappingTrackSelector) {
            override fun onVideoDecoderInitialized(
                eventTime: AnalyticsListener.EventTime,
                decoderName: String,
                initializationDurationMs: Long
            ) {
                super.onVideoDecoderInitialized(
                    eventTime,
                    decoderName,
                    initializationDurationMs
                )
                Log.d("TAG_DEBUG", "decoder Name : $decoderName")
            }
        })
        
        ...
    }
}



logcat message

와 같이 각 codec 별로 decoder 의 이름이 다르게 나오는 것을 확인 할 수 있었다.

여기서 decoderName 과 codec 을 대조해보면

decoderName codec
OMX.Exynos.av1.dec AV1
OMX.Exynos.h263.dec H263
OMX.Exynos.avc.dec H264
OMX.Exynos.hevc.dec H265
OMX.Exynos.mpeg4.dec MPEG4
OMX.Exynos.vp8.dec VP8
OMX.Exynos.vp9.dec VP9

와 같은 결과를 얻을 수 있었다.


정리

exoplayer2addAnalyticsListener 내부의 EventLogger 를 이용하여 영상 파일에 대한 다양한 정보를 알 수 있었으며

그중에 내가 원하던 codec 정보는 decoderName 에서 얻어 낼 수 있었다. :smile:


구글링을 해서 원하는 결과를 못 찾거나, 내부 라이브러리를 뜯어서 보고, 공식 문서를 보고 또 봐도 이해가 가지 않을 때에는 issue 에 직접 질문을 하는 것도 좋은 방법이라고 배울 수 있었던 문제 해결이었다. (하지만 종종 대답을 주지 않는 사람들도 아주 많다…… 고마워요 루이스)