2011-03-14 6 views
2

Je travaille sur un simple exemple AudioTrack qui lit dans un fichier PCM puis le rejoue. Il fonctionne très bien sur l'émulateur Android, mais sur mon téléphone de test, il échoue lors de la lecture des données avec la fonction readShort(). Voici où le code échoue:Android: Lecture depuis DataInputStream fonctionne en émulateur mais pas sur le périphérique

//! 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(); 
    } 

Le readShort() la fonction est de lancer une IOException la première fois qu'il est appelé. Aucun autre détail n'est fourni dans l'exception. Le DataInputStream semble regarder le fichier correctement car il change la variable audiodata pour le tableau de longueur correcte.

Des pensées?

Edit: Ajout stacktrace

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

stacktrace Fournir. – pawelzieba

+0

Imprimez le message/la description de l'exception et postez-le. Cela devrait nous donner quelque chose d'utile! –

Répondre

1

Tout compris cela! La taille du fichier était trop grande pour être lue. L'utilisation d'un fichier plus petit a fonctionné. N'a pas pu trouver de documentation à ce sujet, mais finalement trouvé quelques messages où cela est arrivé à d'autres personnes. Merci pour l'aide!

+0

La réduction de la taille du fichier n'a pas fonctionné pour moi. – Guy

0

Renommez cette extension de fichier en .jpg et cela devrait fonctionner. Cela empêchera le packager Android d'essayer de compresser ce fichier. Espérons que cela fonctionne

0

les tableaux d'octets au lieu de shorts devraient fonctionner. Plus comme ceci:

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

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

et essayez de changer votre type de contrôle audioFileStream.available()> 0 avec ceci:

while ((len = dis.read(data)) != -1) { .... } 
Questions connexes