반응형
안녕하세요 돼지왕 왕돼지입니다.
오늘은 MeidaPlayer 관련된 개발 Tip 들을 알려드리겠습니다.
무슨 개발 Tip이요? MediaPlayer 쓰는데 그런게 필요해요?
넵. 사실 저도 MediaPlayer 가 엄청나게 똘똘한 녀석이라,
API들만 호출하면 척척 잘 해주는 줄 알았습니다. 하지만, 버그가 많은 녀석이더라구요. ㅠ
그래서 이런 지식들 없이 개발하다가 많은 시간을 버리고 말았습니다.
상태관리를 잘하자.
State Machine 에 대해 아시는 분들은 잘 아시겠지만,
현재 상태에 따라 호출할 수 있는 함수가 다르며, 현재 상태에 따라 다른 상태로 전환될 수 있는가가 결정됩니다.
이미지 출처 : http://developer.android.com/reference/android/media/MediaPlayer.html
다이어그램을 참조해서 보면. Stopped 상태에서는 Started 상태로 갈 수 없습니다.
다시 Prepare 를 호출해야 하죠.
함수 자체 호출에는 큰 문제가 없지만, "MediaPlayer" 라는 Tag 로 에러 로그를 출력하곤 합니다.
물론, 원하는 구현도 이룰 수 없겠죠.
위의 다이어그램을 참조하여 올바른 상태 전환을 하는 것이 키 포인트 중 하나입니다.
이놈의 버그버그!!
솔찍히 버그인지, 구현정책인지는 모르겠지만 여러가지 우리의 개념으로 이해가 안 되는 상황들이 좀 있습니다.
preapre 되지 않은 상태로 불리는 onPrepared callback
제대로 준비를 하지 않았는데도 onPrepared 로 들어오는 경우가 있습니다.
따라서 onPrepared 를 100% 믿지 마십시요. 한번쯤은 확인을 해주어야 합니다.
제가 사용한 방법은 주로, getDuration() 을 통해서 했는데, 제대로 로드가 안 되었을 때는
dutation 이 0 혹은 매우 큰 값이 나옵니다. 따라서 이 상태를 체크해주어 다시 prepare 를 시켜줘야 하죠.
재생이 끝났는데 들어오지 않는 onPrepared
재생이 거의 끝나가는데 잠시 pause 를 했다가 다시 play 를 시킬 경우..
끝까지 재생을 하지 않고, onPrepared 도 호출하지 않습니다.
경험상 약 500ms 미만으로 재생시간이 남았을 경우 재생을 안 하는 것으로 보입니다.
이럴때를 위해서 getDuration() 과 threshold 를 통해 강제로 onPrepared 를 호출해주던가
아니면 상황에 맞는 구현을 해주시면 되겠습니다.
이 외에도 여러가지 버그들이 있습니다.
가끔 SurfaceView 에 initialize 에 실패하는 경우도 있고, 정상적인 경우인데도 Error 코드를 뿜는 경우도 많습니다.
사실 MediaPlayer 관련해서 답답한 사항이.. MediaPlayer 가 뿜어내는 Error 코드들에 대한 정확한 정의가 없다는 것이죠.
그래도, 이 3가지 사항이라도 확실히 처리를 해준다면 그래도 봐줄만한 Player 를 만들 수 있습니다.
그럼 모두들 화이팅입니다.~
로그인 없이 추천 가능합니다. 손가락 꾸욱~
반응형
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Android/안드로이드] MapView Overlay 관련 Apis 와 simple example. (0) | 2012.02.18 |
---|---|
[Android/안드로이드] 잘 쓰면 매우 쉬운 개발! 잘못쓰면 완전 짜증나는 xml. (0) | 2012.02.18 |
[Android/안드로이드] MediaPlayer APIs. (0) | 2012.02.18 |
[Android/안드로이드] Custom Attribute 정의해서 사용하기. (6) | 2012.02.17 |
[Android/안드로이드] String ( 문자열 ) 로 Resource 의 id 구하는 방법. (0) | 2012.02.17 |
댓글