소켓을 통해 서버에서 전송받은 .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
,