Android/Kotlin

Android Exoplayer 현재 재생 중인 Stream 의 Format 확인 방법

wannagohome97 2024. 1. 12. 15:54

ExoPlayer 를 이용해서 개발을 하다 보면 현재 재생되고 있는 Stream 이 어떤 형식으로 오는지 알아야 하는 경우가

생깁니다.( 디버깅 시 필요 하다던지, UI 에 재생 정보를 표기해야한다던지와 같은 이유...)

 

오늘은 이 방법에 대해 공유해볼까 합니다.

 

아래는 ExoPlayer 에서 재생중인 Stream 의 Format List 를 가져오는 코드입니다.

private fun getFormats(): List<Format> {
    val formats: MutableList<Format> = java.util.ArrayList()
    if (mPlayer != null){
        val groups = mPlayer?.currentTracks?.groups
        val size = groups?.size!!
        for (i in 0 until size) {
            val trackGroup = groups[i].mediaTrackGroup
            val length = trackGroup.length
            for (j in 0 until length) {
                val format = trackGroup.getFormat(j)
                formats.add(format)
            }
        }
    }
    return formats
}

 

해당 메서드를 아래와 같이 사용 할 수 있습니다.

...
mPlayer?.addListener(object : Player.Listener{
    override fun onPlayerError(error: PlaybackException) {
    }
    override fun onPlaybackStateChanged(playbackState: Int) {
        super.onPlaybackStateChanged(playbackState)
        when (playbackState) {
            Player.STATE_READY -> {
                val formats = getFormats()
            }
            Player.STATE_BUFFERING -> {
            }
            Player.STATE_ENDED -> {
            }
            Player.STATE_IDLE -> {
            }
        }
    }
})
...

 

Format 으로 현재 스트림의 화질 이나 코덱, MimeType 등을 확인할 수 있습니다. 

 

그리고 MimeType 으로 포맷명을 가져오는 코드를 아래와 같이 구현해보았습니다.

 

object FormatInfo {

    val AUDIO_MP4 = MimeTypes.BASE_TYPE_AUDIO + "/mp4"
    val AUDIO_AAC = MimeTypes.BASE_TYPE_AUDIO + "/mp4a-latm"
    val AUDIO_MATROSKA = MimeTypes.BASE_TYPE_AUDIO + "/x-matroska"
    val AUDIO_WEBM = MimeTypes.BASE_TYPE_AUDIO + "/webm"
    val AUDIO_MPEG = MimeTypes.BASE_TYPE_AUDIO + "/mpeg"
    val AUDIO_MPEG_L1 = MimeTypes.BASE_TYPE_AUDIO + "/mpeg-L1"
    val AUDIO_MPEG_L2 = MimeTypes.BASE_TYPE_AUDIO + "/mpeg-L2"
    val AUDIO_MPEGH_MHA1 = MimeTypes.BASE_TYPE_AUDIO + "/mha1"
    val AUDIO_MPEGH_MHM1 = MimeTypes.BASE_TYPE_AUDIO + "/mhm1"
    val AUDIO_RAW = MimeTypes.BASE_TYPE_AUDIO + "/raw"
    val AUDIO_ALAW = MimeTypes.BASE_TYPE_AUDIO + "/g711-alaw"
    val AUDIO_MLAW = MimeTypes.BASE_TYPE_AUDIO + "/g711-mlaw"
    val AUDIO_AC3 = MimeTypes.BASE_TYPE_AUDIO + "/ac3"
    val AUDIO_E_AC3 = MimeTypes.BASE_TYPE_AUDIO + "/eac3"
    val AUDIO_E_AC3_JOC = MimeTypes.BASE_TYPE_AUDIO + "/eac3-joc"
    val AUDIO_AC4 = MimeTypes.BASE_TYPE_AUDIO + "/ac4"
    val AUDIO_TRUEHD = MimeTypes.BASE_TYPE_AUDIO + "/true-hd"
    val AUDIO_DTS = MimeTypes.BASE_TYPE_AUDIO + "/vnd.dts"
    val AUDIO_DTS_HD = MimeTypes.BASE_TYPE_AUDIO + "/vnd.dts.hd"
    val AUDIO_DTS_EXPRESS = MimeTypes.BASE_TYPE_AUDIO + "/vnd.dts.hd;profile=lbr"
    val AUDIO_DTS_X = MimeTypes.BASE_TYPE_AUDIO + "/vnd.dts.uhd;profile=p2"
    val AUDIO_VORBIS = MimeTypes.BASE_TYPE_AUDIO + "/vorbis"
    val AUDIO_OPUS = MimeTypes.BASE_TYPE_AUDIO + "/opus"
    val AUDIO_AMR = MimeTypes.BASE_TYPE_AUDIO + "/amr"
    val AUDIO_AMR_NB = MimeTypes.BASE_TYPE_AUDIO + "/3gpp"
    val AUDIO_AMR_WB = MimeTypes.BASE_TYPE_AUDIO + "/amr-wb"
    val AUDIO_FLAC = MimeTypes.BASE_TYPE_AUDIO + "/flac"
    val AUDIO_ALAC = MimeTypes.BASE_TYPE_AUDIO + "/alac"
    val AUDIO_MSGSM = MimeTypes.BASE_TYPE_AUDIO + "/gsm"
    val AUDIO_OGG = MimeTypes.BASE_TYPE_AUDIO + "/ogg"
    val AUDIO_WAV = MimeTypes.BASE_TYPE_AUDIO + "/wav"
    val AUDIO_MIDI = MimeTypes.BASE_TYPE_AUDIO + "/midi"


    const val VIDEO_MP4 = MimeTypes.BASE_TYPE_VIDEO + "/mp4"
    const val VIDEO_MATROSKA = MimeTypes.BASE_TYPE_VIDEO + "/x-matroska"
    const val VIDEO_WEBM = MimeTypes.BASE_TYPE_VIDEO + "/webm"
    const val VIDEO_H263 = MimeTypes.BASE_TYPE_VIDEO + "/3gpp"
    const val VIDEO_H264 = MimeTypes.BASE_TYPE_VIDEO + "/avc"
    const val VIDEO_H265 = MimeTypes.BASE_TYPE_VIDEO + "/hevc"
    const val VIDEO_VP8 = MimeTypes.BASE_TYPE_VIDEO + "/x-vnd.on2.vp8"
    const val VIDEO_VP9 = MimeTypes.BASE_TYPE_VIDEO + "/x-vnd.on2.vp9"
    const val VIDEO_AV1 = MimeTypes.BASE_TYPE_VIDEO + "/av01"
    const val VIDEO_MP2T = MimeTypes.BASE_TYPE_VIDEO + "/mp2t"
    const val VIDEO_MP4V = MimeTypes.BASE_TYPE_VIDEO + "/mp4v-es"
    const val VIDEO_MPEG = MimeTypes.BASE_TYPE_VIDEO + "/mpeg"
    const val VIDEO_PS = MimeTypes.BASE_TYPE_VIDEO + "/mp2p"
    const val VIDEO_MPEG2 = MimeTypes.BASE_TYPE_VIDEO + "/mpeg2"
    const val VIDEO_VC1 = MimeTypes.BASE_TYPE_VIDEO + "/wvc1"
    const val VIDEO_DIVX = MimeTypes.BASE_TYPE_VIDEO + "/divx"
    const val VIDEO_FLV = MimeTypes.BASE_TYPE_VIDEO + "/x-flv"
    const val VIDEO_DOLBY_VISION = MimeTypes.BASE_TYPE_VIDEO + "/dolby-vision"
    const val VIDEO_OGG = MimeTypes.BASE_TYPE_VIDEO + "/ogg"
    const val VIDEO_AVI = MimeTypes.BASE_TYPE_VIDEO + "/x-msvideo"
    const val VIDEO_MJPEG = MimeTypes.BASE_TYPE_VIDEO + "/mjpeg"
    const val VIDEO_MP42 = MimeTypes.BASE_TYPE_VIDEO + "/mp42"
    const val VIDEO_MP43 = MimeTypes.BASE_TYPE_VIDEO + "/mp43"
    const val VIDEO_RAW = MimeTypes.BASE_TYPE_VIDEO + "/raw"
    const val VIDEO_UNKNOWN = MimeTypes.BASE_TYPE_VIDEO + "/x-unknown"



    fun getCodecName(mimeType: String): String {
        return when (mimeType) {
            AUDIO_MP4 -> "mp4"
            AUDIO_AAC -> "AAC"
            AUDIO_MATROSKA -> "Matroska"
            AUDIO_WEBM -> "WebM"
            AUDIO_MPEG -> "MPEG"
            AUDIO_MPEG_L1 -> "MPEG-L1"
            AUDIO_MPEG_L2 -> "MPEG-L2"
            AUDIO_MPEGH_MHA1 -> "MPEGH MHA1"
            AUDIO_MPEGH_MHM1 -> "MPEGH MHM1"
            AUDIO_RAW -> "Raw"
            AUDIO_ALAW -> "ALaw"
            AUDIO_MLAW -> "MLaw"
            AUDIO_AC3 -> "AC3"
            AUDIO_E_AC3 -> "E-AC3"
            AUDIO_E_AC3_JOC -> "E-AC3 JOC"
            AUDIO_AC4 -> "AC4"
            AUDIO_TRUEHD -> "TrueHD"
            AUDIO_DTS -> "DTS"
            AUDIO_DTS_HD -> "DTS-HD"
            AUDIO_DTS_EXPRESS -> "DTS Express"
            AUDIO_DTS_X -> "DTS:X"
            AUDIO_VORBIS -> "Vorbis"
            AUDIO_OPUS -> "Opus"
            AUDIO_AMR -> "AMR"
            AUDIO_AMR_NB -> "AMR-NB"
            AUDIO_AMR_WB -> "AMR-WB"
            AUDIO_FLAC -> "FLAC"
            AUDIO_ALAC -> "ALAC"
            AUDIO_MSGSM -> "GSM"
            AUDIO_OGG -> "Ogg"
            AUDIO_WAV -> "WAV"
            AUDIO_MIDI -> "MIDI"
            VIDEO_MP4 -> "MP4"
            VIDEO_MATROSKA -> "Matroska"
            VIDEO_WEBM -> "WebM"
            VIDEO_H263 -> "H.263"
            VIDEO_H264 -> "H.264"
            VIDEO_H265 -> "H.265"
            VIDEO_VP8 -> "VP8"
            VIDEO_VP9 -> "VP9"
            VIDEO_AV1 -> "AV1"
            VIDEO_MP2T -> "MPEG-2 Transport Stream"
            VIDEO_MP4V -> "MP4V"
            VIDEO_MPEG -> "MPEG"
            VIDEO_PS -> "PS"
            VIDEO_MPEG2 -> "MPEG-2"
            VIDEO_VC1 -> "VC-1"
            VIDEO_DIVX -> "DivX"
            VIDEO_FLV -> "FLV"
            VIDEO_DOLBY_VISION -> "Dolby Vision"
            VIDEO_OGG -> "Ogg"
            VIDEO_AVI -> "AVI"
            VIDEO_MJPEG -> "MJPEG"
            VIDEO_MP42 -> "MP42"
            VIDEO_MP43 -> "MP43"
            VIDEO_RAW -> "Raw"
            VIDEO_UNKNOWN -> "Unknown"
            else -> "Unknown"
        }
    }
}