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"
}
}
}