몇몇 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 파일이 다운로드가 된다.
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 파일을 받아본다.
과정은 위와 같다.
새롭게 받은 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()
}
}
재생이 잘 된다.
두 파일을 비교해본다.
두 파일 모두 bit rate랑 samplerate는 같은데 채널이 다르다.
다른건 채널밖에 없으니 채널이 모노인 파일을 스테레오로 바꿔서 재생해봐야겠다.
Video Converter 프로그램으로 ts 채널을 1에서 2로 컨버팅했다.
재생이 되는지 확인해보자.
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으로도 위와 똑같은 결과가 나온다면 하드웨어 문제라고 봐야할 것 같다.
'OS > Android' 카테고리의 다른 글
Android 위젯 (Widget) (0) | 2022.01.04 |
---|---|
Android Bundle(.aab) release crash 삽질 (0) | 2021.08.27 |
안드로이드 패턴.. 어떤걸 쓰지?? (0) | 2021.05.25 |
안드로이드 기존 버전 apk에서 -> 신규 버전 bundle로 업데이트 (0) | 2021.04.08 |
Android 유닛 테스트 (0) | 2021.04.06 |