Android: чтение из DataInputStream работает в эмуляторе, но не на устройстве - PullRequest
2 голосов
/ 14 марта 2011

Я работаю над простым примером AudioTrack, который читает файл PCM и затем воспроизводит его.Он прекрасно работает на эмуляторе Android, но на моем тестовом телефоне происходит сбой при чтении данных с помощью функции readShort ().Вот где код терпит неудачу:

    //! 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, кажется, смотрит на файл правильно, поскольку он изменяет переменные аудиоданные на массив правильной длины.

Есть мысли?

Редактировать: Добавление трассировки стека

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)

Ответы [ 3 ]

1 голос
/ 14 марта 2011

Просто понял это!Размер файла был слишком велик для чтения. Использование файла меньшего размера работало.Не удалось найти какую-либо документацию по этому вопросу, но, наконец, нашел несколько сообщений, где это произошло с другими людьмиСпасибо за помощь!

0 голосов
/ 04 мая 2012

байтовые массивы вместо шорт должны работать.Больше похоже на это:

    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) { .... }
0 голосов
/ 05 декабря 2011

Переименуйте это расширение файла в .jpg, и оно должно работать. Это не позволит Android-упаковщику пытаться сжать этот файл. Надеюсь, что это работает

...