안드로이드 개발 질문/답변
(글 수 45,052)
아래와 같이 byte array로 전달 받은 data를 local에 file로 저장하여 media player에서 재생시에
03-08 01:45:56.366: ERROR/PlayerDriver(31): Command PLAYER_SET_DATA_SOURCE completed with an error or info PVMFErrNotSupported
03-08 01:45:56.366: ERROR/MediaPlayer(217): error (1, -4)
위와 같은 로그와 함께 재생 실패합니다.
MediaPlayer.setDataResource에 전달되는 file Path는 "/data/data/com.xxx.xxx/cache/sampleFile.wav" 이런 식입니다.
SD card에 저장해서 재생하게 되면 정상적으로 재생되구요.
혹시나 file write가 잘못되었나 싶어 ddms로 해당 파일을 뽑아서 pc에서 재생 해 보았는데 잘 동작합니다.
ByteArrayInputStream inStream = new ByteArrayInputStream(nRawData);
File cacheDir = getCacheDir();
File tmpFile = null;
try {
tmpFile = File.createTempFile("sampleFile.wav", null, sampleDir);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
OutputStream outStream = null;
try {
outStream = new FileOutputStream(tmpFile);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte buf[]=new byte[(int)nDataSize];
int len;
try {
while((len=inStream.read(buf))>0)
outStream.write(buf,0,len);
outStream.close();
inStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
MediaPlayer mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(tmpFile.getAbsolutePath());
mMediaPlayer.prepare();
mMediaPlayer.start();
03-08 01:45:56.366: ERROR/PlayerDriver(31): Command PLAYER_SET_DATA_SOURCE completed with an error or info PVMFErrNotSupported
03-08 01:45:56.366: ERROR/MediaPlayer(217): error (1, -4)
위와 같은 로그와 함께 재생 실패합니다.
MediaPlayer.setDataResource에 전달되는 file Path는 "/data/data/com.xxx.xxx/cache/sampleFile.wav" 이런 식입니다.
SD card에 저장해서 재생하게 되면 정상적으로 재생되구요.
혹시나 file write가 잘못되었나 싶어 ddms로 해당 파일을 뽑아서 pc에서 재생 해 보았는데 잘 동작합니다.
ByteArrayInputStream inStream = new ByteArrayInputStream(nRawData);
File cacheDir = getCacheDir();
File tmpFile = null;
try {
tmpFile = File.createTempFile("sampleFile.wav", null, sampleDir);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
OutputStream outStream = null;
try {
outStream = new FileOutputStream(tmpFile);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte buf[]=new byte[(int)nDataSize];
int len;
try {
while((len=inStream.read(buf))>0)
outStream.write(buf,0,len);
outStream.close();
inStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
MediaPlayer mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(tmpFile.getAbsolutePath());
mMediaPlayer.prepare();
mMediaPlayer.start();
2010.03.08 11:38:50
SD카드에 저장한후에 해보세요 잘 될겁니다. SD카드에서 잘된다면 파일 문제가 아니라 퍼미션 문제로 접근 못하는걸텐데. 내부 메모리에 저장하더라도 미디어플레이어에 패스가 아니라 파일 디스크립터로 넘겨주면 잘될거에요.
2010.03.08 13:00:14
답변 감사합니다^^
회색님 말씀대로 fileDescriptor를 넘겨주기 위해서 아래와 같이 fileOutputStream을 만들고
FileOutputStream outStream = null;
try {
outStream = this.openFileOutput("sample", this.MODE_WORLD_READABLE);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//fileDescription 전달
mMediaPlayer.setDataSource(outStream.getFD());
이처럼 구현하였는데 아래 로그가 뜨면서 역시 재생이 안되네요.. 제가 fileDescription을 잘못 리턴해 준건가요??
03-08 03:54:20.947: ERROR/MediaPlayer(213): Unable to to create media player
03-08 03:54:20.957: INFO/dalvikvm(213): Ljava/io/IOException;: setDataSourceFD failed.: status=0x80000000
03-08 03:54:20.957: INFO/dalvikvm(213): at android.media.MediaPlayer.setDataSource(Native Method)
03-08 03:54:20.957: INFO/dalvikvm(213): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:643)
회색님 말씀대로 fileDescriptor를 넘겨주기 위해서 아래와 같이 fileOutputStream을 만들고
FileOutputStream outStream = null;
try {
outStream = this.openFileOutput("sample", this.MODE_WORLD_READABLE);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//fileDescription 전달
mMediaPlayer.setDataSource(outStream.getFD());
이처럼 구현하였는데 아래 로그가 뜨면서 역시 재생이 안되네요.. 제가 fileDescription을 잘못 리턴해 준건가요??
03-08 03:54:20.947: ERROR/MediaPlayer(213): Unable to to create media player
03-08 03:54:20.957: INFO/dalvikvm(213): Ljava/io/IOException;: setDataSourceFD failed.: status=0x80000000
03-08 03:54:20.957: INFO/dalvikvm(213): at android.media.MediaPlayer.setDataSource(Native Method)
03-08 03:54:20.957: INFO/dalvikvm(213): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:643)



