Невозможно воспроизвести аудио из ресурсов «возможно, оно сжато»

1

Привет, я пишу приложение для Android, которое будет воспроизводить набор аудиофайлов, которые я поставляю с помощью приложения, а также позволяю пользователям создавать и воспроизводить собственный звук. Проблема в том, что я не знаю, где хранить файлы. Если я храню их во внешнем (sdcard) месте, я не уверен, как я отправлю эти файлы на внешнее хранилище пользователя при установке моего приложения. Я думал, что мог бы кто-то в активах и обычаях звучать извне.

когда я пытаюсь это сделать, однако я получаю следующую ошибку: java.io.FileNotFoundException: этот файл не может быть открыт как дескриптор файла; он, вероятно, сжат

вот мой код:

try {
                Constants.mPlayer = new MediaPlayer();
                AssetFileDescriptor afd = this.getApplicationContext().getAssets().openFd("songid.mus");
                Constants.mPlayer.setDataSource(afd.getFileDescriptor());
                Constants.mPlayer.prepare();
                Constants.mPlayer.start();
            } catch (Exception e) {
                Log.e("", "prepare() failed", e);
            }

Любые идеи или предложения?

Спасибо! Радха

Теги:
audio

2 ответа

1

В качестве быстрого исправления вы можете избежать сжатия, изменив имя вашего файла на songid.mp3.

Автор этого сообщения также предлагает передать расширение с опцией -0 в aapt в командной строке:

Во-первых, вы можете предоставить свой файл активов расширение в списке выше. В то время как это не обязательно имеет смысл, это может быть легко обходным путем, если вы не хотите иметь дело с командная строка. Другой вариант - передать определенное расширение на -0 флаг, например -0 db, для отключения сжатие для активов с расширение. Вы можете передать флаг -0 несколько раз, и каждый раз с отдельное расширение, если вам нужно больше чем один тип для несжатого.

Если вы чувствуете себя авантюристом, вы можете попытаться заменить aapt на script, который вызывает aapt с -0 mus, как в этот пост.

  • 0
    Спасибо Мэтью! Я изменил название с songid.mus на songid.3gp. Это исправило мое первое исключение. Очень признателен. После этого я получил еще одно исключение, которое хочу описать для тех, кто совершает ту же ошибку, что и я. :-) Я получил "java.io.IOException: Подготовка не удалась .: status = 0x1" Мне потребовалось некоторое время, чтобы понять, что мне нужно добавить начало и продолжительность:
0

Спасибо Мэтью! Я изменил имя с songid.mus на songid.3gp. Это исправило мое первое исключение. Очень признателен.

После этого я получил еще одно исключение, которое я хочу описать для тех, кто совершает ту же ошибку, что и я.:-) Я получил java.io.IOException: Prepare failed.: status=0x1

Мне потребовалось некоторое время, чтобы понять, что мне нужно добавить начало и продолжительность:

Constants.mPlayer = new MediaPlayer();
AssetFileDescriptor afd = this.getApplicationContext().getAssets().openFd("songid.3gpp");
long start = afd.getStartOffset();
long end = afd.getLength();
Constants.mPlayer.setDataSource(afd.getFileDescriptor(), start,end);
Constants.mPlayer.prepare();
Constants.mPlayer.start();  

Это работает! Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню