소켓을 통해 서버에서 전송받은 .mp4 녹음 파일을 안드로이드 어플리케이션에서 재생하려고 했는데
다음과 같은 예외를 만났다.
error (1, -2147483648)
java.io.IOException: Prepare failed.: status=0x1
at android.media.MediaPlayer.prepare(Native Method)
if ( player == null ) { player = new MediaPlayer(); player.setOnCompletionListener(comlistener); } player.setDataSource(filePath); player.prepare(); player.start();
그래서 위와 같이 되어 있던 소스를 다음과 같이 FileDescriptor를 이용하도록 바꾸어보았다.
(참고로, 'player' 변수의 null 검사 부분의 조건문은 이 글에서 별로 중요하지 않다. 단지 변수의 객체 타입을 파악하기 쉽도록 하기 위해 제외하지 않았다.)
if ( player == null ) { player = new MediaPlayer(); player.setOnCompletionListener(comlistener); } File sourceFile = new File(filePath); if ( sourceFile.exists() ) { FileInputStream fs = new FileInputStream(sourceFile); FileDescriptor fd = fs.getFD(); fs.close(); player.setDataSource(fd); player.prepare(); player.start(); }
그러자 이번엔 다음과 같은 예외가 발생했다.
Unable to to create media player
java.io.IOException: setDataSourceFD failed.: status=0x80000000
at android.media.MediaPlayer.setDataSource(Native Method)
스트림이 닫히는 순서가 문제일까 싶어서 다음과 같이 FileInputStream의 닫는 순서를 약간 변경해보았다.
if ( player == null ) { player = new MediaPlayer(); player.setOnCompletionListener(comlistener); } File sourceFile = new File(filePath); if ( sourceFile.exists() ) { FileInputStream fs = new FileInputStream(sourceFile); FileDescriptor fd = fs.getFD(); player.setDataSource(fd); fs.close(); // 데이터 소스를 설정한 후 스트림을 닫았다. player.prepare(); player.start(); }
이번엔 파일이 정상적으로 다운로드 되어있는 경우, 문제 없이 재생이 되었다.
0x80000000 예외일 경우 대부분 파일이 잘못된 경우가 많으니 파일 크기를 확인하거나, 먼저 다른 플레이어로 재생해보는 편이 좋다.
'Development > Failure Log' 카테고리의 다른 글
[Android ViewPager] java.lang.OutOfMemoryError (0) | 2013.07.08 |
---|---|
이클립스 안드로이드 라이브러리 및 프로젝트 속성 에러 (0) | 2013.06.13 |
java.io.StreamCorruptedException: invalid stream header: 6572726F (0) | 2013.04.25 |
Android 재부팅 후 SharedPreferences가 초기화될 때 (0) | 2013.04.08 |
Eclipse ADT 설치 후 아이콘 및 메뉴가 안 보일 때 (8) | 2013.03.01 |