소켓을 통해 서버에서 전송받은 .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 예외일 경우 대부분 파일이 잘못된 경우가 많으니 파일 크기를 확인하거나, 먼저 다른 플레이어로 재생해보는 편이 좋다.

Posted by Kugi
TAG ,

댓글을 달아 주세요