Воспроизведение аудиофайла из каталога активов
У меня есть следующий код:
AssetFileDescriptor afd = getAssets().openFd("AudioFile.mp3");
player = new MediaPlayer();
player.setDataSource(afd.getFileDescriptor());
player.prepare();
player.start();
Проблема заключается в том, что при запуске этого кода он начинает воспроизводить все аудиофайлы в каталоге ресурсов в алфавитном порядке, а не просто воспроизводить аудиофайл, который я запросил. Что я делаю не так? Есть ли лучший способ воспроизведения аудиофайлов из каталога ресурсов?
Последующий вопрос:
Есть ли разница между сохранением аудиофайлов в каталоге активов и хранением их в каталоге res/raw? Кроме того, что они не получают идентификаторы, если они находятся в каталоге активов. Если я перемещаю аудиофайлы в папку res/raw, у меня возникает проблема с повторным использованием MediaPlayer
, потому что для параметра setDataSource()
нет идентификатора. Я не могу найти хороший ориентир для решения этой проблемы.
Ответы
Ответ 1
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
Ваша версия будет работать, если у вас есть только один файл в активах каталог. Содержимое каталога активов не является фактически "реальными файлами", на диске. Все они собраны один за другим. Итак, если вы это сделаете не указать, с чего начать и сколько байтов читать, игрок будет читать до конца (то есть будет продолжать играть все файлы в активах каталог)
Ответ 2
Эта функция будет работать правильно:)
// MediaPlayer m; /*assume, somewhere in the global scope...*/
public void playBeep() {
try {
if (m.isPlaying()) {
m.stop();
m.release();
m = new MediaPlayer();
}
AssetFileDescriptor descriptor = getAssets().openFd("beepbeep.mp3");
m.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
descriptor.close();
m.prepare();
m.setVolume(1f, 1f);
m.setLooping(true);
m.start();
} catch (Exception e) {
e.printStackTrace();
}
}