본문 바로가기

OS/Android

삼성폰 HLS 재생 안됨 디버깅

반응형

몇몇 HLS 스트리밍 주소가 삼성 기기에서 재생이 안되는 이슈가 생겼다.

왜 안되는지 확실히 모르니 일단 ts 파일을 받아보자.

ts 파일을 다운받기 위해선 먼저 m3u 파일을 다운받아야 한다.

크롬에 hls 프로토콜을 사용하는 주소를 입력하면 m3u 파일이 다운로드 된다.

m3u 파일을 메모장으로 열어보면 다음과 같은 내용들이 나온다.

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=119402
chunklist_w396990040.m3u8?tid=1fbe88e08b769b82b81cade5f1d9983f

내가 받은 m3u 파일은 한번 더 m3u 파일을 다운로드 해줘야 했다.

chunklist_w396990040.m3u8?tid=1fbe88e08b769b82b81cade5f1d9983f 이 부분을 도메인과 합쳐서 크롬에 입력하면 다른 m3u 파일이 다운로드가 된다.

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:NO
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:135257
#EXTINF:5.085,
media_w396990040_135257.ts?tid=1fbe88e08b769b82b81cade5f1d9983f
#EXTINF:5.085,
media_w396990040_135258.ts?tid=1fbe88e08b769b82b81cade5f1d9983f
#EXTINF:5.085,
media_w396990040_135259.ts?tid=1fbe88e08b769b82b81cade5f1d9983f

이번 m3u는 다행히 ts 파일 정보를 가지고 있었다.

media_w396990040_135259.ts?tid=1fbe88e08b769b82b81cade5f1d9983f 이 부분을 위와 같이 도메인과 합쳐서 크롬에 입력하면 ts 파일이 다운로드가 된다.

media_w396990040_135259.ts
0.07MB

 

ts 파일을 미디어 플레이어로 재생해본다. (갤럭시 10 5G)

class MainActivity : AppCompatActivity()
{
    val TAG = "main"

    private var mp1 : MediaPlayer? = null

    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mp1 = MediaPlayer.create(this, R.raw.a) // ts 파일 media_w396990040_135259
        mp1?.setOnErrorListener { mediaPlayer, i, i2 ->
            return@setOnErrorListener false
        }
    }

    private fun test1(view: View)
    {
        mp1?.start()
    }
}

재생이 안된다.

ts 파일 자체가 문제가 있어서 재생이 안되는걸수도 있으니 PC에 VLC 플레이로 재생해보았다.

재생이 잘된다.

이건 파일 자체의 문제가 아닌 코덱 문제일 확률이 크다.

 

혹시 ts 파일 옵션 문제일 수도 있으니 url로 재생이 잘 되는 ts 파일을 받아본다.

과정은 위와 같다.

media_w1239373420_135306.ts
0.07MB

 

새롭게 받은 ts 파일이 제대로 재생이 되는지 확인해본다.

class MainActivity : AppCompatActivity()
{
    val TAG = "main"

    private var mp1 : MediaPlayer? = null
    private var mp2 : MediaPlayer? = null

    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mp1 = MediaPlayer.create(this, R.raw.a) // media_w396990040_135259.ts
        mp1?.setOnErrorListener { mediaPlayer, i, i2 ->
            return@setOnErrorListener false
        }

        mp2 = MediaPlayer.create(this, R.raw.b) // media_w1239373420_135306.ts
        mp2?.setOnErrorListener { mediaPlayer, i, i2 ->
            return@setOnErrorListener false
        }
    }

    private fun test1(view: View)
    {
        mp1?.start()
    }
    private fun test2(view: View)
    {
        mp2?.start()
    }
}

재생이 잘 된다.

두 파일을 비교해본다.

재생이 안되는 ts 파일
재생이 잘 되는 ts 파일

 

두 파일 모두 bit rate랑 samplerate는 같은데 채널이 다르다.

다른건 채널밖에 없으니 채널이 모노인 파일을 스테레오로 바꿔서 재생해봐야겠다.

Video Converter 프로그램으로 ts 채널을 1에서 2로 컨버팅했다.

media_w396990040_135259.ts
0.16MB

 

 

재생이 되는지 확인해보자.

class MainActivity : AppCompatActivity()
{
    val TAG = "main"

    private var mp1 : MediaPlayer? = null
    private var mp2 : MediaPlayer? = null
    private var mp3 : MediaPlayer? = null

    override fun onCreate(savedInstanceState: Bundle?)
    {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mp1 = MediaPlayer.create(this, R.raw.a) // ts 파일 채널 1
        mp1?.setOnErrorListener { mediaPlayer, i, i2 ->
            return@setOnErrorListener false
        }

        mp2 = MediaPlayer.create(this, R.raw.b) // ts 파일 채널 2
        mp2?.setOnErrorListener { mediaPlayer, i, i2 ->
            return@setOnErrorListener false
        }

        mp3 = MediaPlayer.create(this, R.raw.c) // a 채널 2로 변경한 것
        mp3?.setOnErrorListener { mediaPlayer, i, i2 ->
            return@setOnErrorListener false
        }
    }

    private fun test1(view: View)
    {
        mp1?.start()
    }
    private fun test2(view: View)
    {
        mp2?.start()
    }
    private fun test3(view: View)
    {
        mp3?.start()
    }
}

 

재생 잘된다.

채널 문제가 맞는 것 같다.

더 정확히 디버깅하기 위해선 MediaCodec으로 비교를 해봐야될것같다.

만약 Mediacodec으로도 위와 똑같은 결과가 나온다면 하드웨어 문제라고 봐야할 것 같다.

 

반응형