본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] MediaPlayer 관련 개발 Tip들.

by 돼지왕 왕돼지 2012. 2. 18.
반응형


안녕하세요 돼지왕 왕돼지입니다.
오늘은 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 를 만들 수 있습니다.
그럼 모두들 화이팅입니다.~


 
로그인 없이 추천 가능합니다. 손가락 꾸욱~





반응형

댓글