2011-03-14 121 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) { .... } 
相关问题