2011-03-14 5 views
2

PCM 파일을 읽고 간단한 재생을하는 간단한 AudioTrack 예제 작업 중입니다. 그것은 안드로이드 에뮬레이터에서 훌륭하게 작동하지만, 테스트 폰에서는 readShort() 함수로 데이터를 읽을 때 실패합니다. 코드가 실패한 곳은 다음과 같습니다.Android : DataInputStream에서 읽는 것은 에뮬레이터에서 작동하지만 기기에서는 작동하지 않습니다.

//! Read in the raw audio file 
    audioData= new short[0]; 
    try { 
     InputStream is= this.getAssets().open("Vocals.pcm"); 

     BufferedInputStream bis = new BufferedInputStream(is); 
     DataInputStream audioFileStream = new DataInputStream(bis); 

     audioData= new short[audioFileStream.available()/2]; 

     int i = 0; 
     while (audioFileStream.available() > 0) 
     { 

      audioData[i]= audioFileStream.readShort(); 
      i++; 
     } 

     audioFileStream.close(); 

    } catch (IOException e) { 
     Log.e("AudioTrackTest", "Loading PCM audio file failed"); 
     e.printStackTrace(); 
    } 

readShort() 함수는 처음 호출 할 때 IOException을 던집니다. 예외에는 다른 세부 정보가 제공되지 않습니다. DataInputStream은 변수 audiodata를 올바른 길이의 배열로 변경하기 때문에 파일을 올바르게보고있는 것처럼 보입니다.

의견이 있으십니까?

편집 : 추가 스택 트레이스

03-14 13:45:40.248: ERROR/AudioTrackTest(1166): Loading PCM audio file failed 
03-14 13:45:47.438: ERROR/AudioTrackTest(1166): android.content.res.AssetManager.readAsset(Native Method) 
03-14 13:45:48.588: ERROR/AudioTrackTest(1166): android.content.res.AssetManager.access$700(AssetManager.java:36) 
03-14 13:45:49.478: ERROR/AudioTrackTest(1166): android.content.res.AssetManager$AssetInputStream.read(AssetManager.java:571) 
03-14 13:45:50.389: ERROR/AudioTrackTest(1166): java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:157) 
03-14 13:45:51.309: ERROR/AudioTrackTest(1166): java.io.BufferedInputStream.read(BufferedInputStream.java:346) 
03-14 13:45:52.169: ERROR/AudioTrackTest(1166): java.io.DataInputStream.readToBuff(DataInputStream.java:157) 
03-14 13:45:53.008: ERROR/AudioTrackTest(1166): java.io.DataInputStream.readShort(DataInputStream.java:374) 
03-14 13:45:53.908: ERROR/AudioTrackTest(1166): example.audiotrack.AudioTrackTest.loadPCMFile(AudioTrackTest.java:68) 
03-14 13:45:54.549: ERROR/AudioTrackTest(1166): example.audiotrack.AudioTrackTest.onCreate(AudioTrackTest.java:40) 
03-14 13:45:55.288: ERROR/AudioTrackTest(1166): android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
03-14 13:45:55.959: ERROR/AudioTrackTest(1166): android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
03-14 13:45:56.688: ERROR/AudioTrackTest(1166): android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
03-14 13:45:57.239: ERROR/AudioTrackTest(1166): android.app.ActivityThread.access$2300(ActivityThread.java:125) 
03-14 13:45:57.808: ERROR/AudioTrackTest(1166): android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
03-14 13:45:58.309: ERROR/AudioTrackTest(1166): android.os.Handler.dispatchMessage(Handler.java:99) 
03-14 13:45:59.058: ERROR/AudioTrackTest(1166): android.os.Looper.loop(Looper.java:123) 
03-14 13:45:59.808: ERROR/AudioTrackTest(1166): android.app.ActivityThread.main(ActivityThread.java:4627) 
03-14 13:46:00.409: ERROR/AudioTrackTest(1166): java.lang.reflect.Method.invokeNative(Native Method) 
03-14 13:46:01.029: ERROR/AudioTrackTest(1166): java.lang.reflect.Method.invoke(Method.java:521) 
03-14 13:46:01.448: ERROR/AudioTrackTest(1166): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
03-14 13:46:01.848: ERROR/AudioTrackTest(1166): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
03-14 13:46:02.429: ERROR/AudioTrackTest(1166): dalvik.system.NativeStart.main(Native Method) 
+0

이 스택 트레이스를 제공합니다. – pawelzieba

+0

예외의 메시지/설명을 인쇄하고 게시하십시오. 우리에게 유용한 것을 제공해야합니다! –

답변

1

그냥이 알아 냈어! 파일 크기가 너무 커서 읽지 못할 수도 있습니다. 더 작은 파일을 사용하면 효과적이었습니다. 이것에 대한 문서를 찾지 못했지만 다른 사람들에게 일어난 몇몇 게시물을 마침내 발견했습니다. 도와 주셔서 감사합니다!

+0

파일 크기 줄이기가 제대로 작동하지 않았습니다. – Guy

0

이 파일 확장자의 이름을 .jpg로 바꾸면 제대로 작동합니다. Android 패키지가이 파일을 압축하지 못하게합니다. 희망이 작동합니다

0

반바지 대신 바이트 배열이 작동합니다. 보기 다음과 같습니다 :

BufferedInputStream bis = new BufferedInputStream(in); 
    DataInputStream dis = new DataInputStream(bis); 

    int len = dis.readInt(); 
    byte[] data = new byte[len]; 

을이 함께 수표 형 audioFileStream.available()> 0을 변경해보십시오 :

while ((len = dis.read(data)) != -1) { .... } 
관련 문제