2011-03-14 141 views
2

我正在研究一個簡單的AudioTrack示例,該示例讀取PCM文件然後播放它。它在android模擬器上效果很好,但在我的測試手機上,使用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 2011-03-14 17:11:20

+0

打印異常信息/描述併發布。它應該給我們一些有用的東西! – 2011-03-14 19:09:14

回答

1

就想通了這一點!文件大小太大,無法讀入。使用較小的文件。找不到任何關於此的文檔,但最終發現一些帖子發生在其他人身上。謝謝您的幫助!

+0

縮小文件大小對我來說不起作用。 – Guy 2011-08-28 17:57:21

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) { .... } 
相關問題