2010-07-20 7 views
99

У меня есть следующий код:Воспроизведение аудио файлов из директории активов

AssetFileDescriptor afd = getAssets().openFd("AudioFile.mp3"); 
player = new MediaPlayer(); 
player.setDataSource(afd.getFileDescriptor()); 
player.prepare(); 
player.start(); 

Проблема заключается в том, что, когда я запускаю этот код, он начинает играть все звуковые файлы в каталоге ресурсов, в алфавитном порядке, а не просто воспроизводя аудиофайл, который я запросил. Что я делаю не так? Есть ли лучший способ воспроизведения аудиофайлов из каталога ресурсов?

Последующий вопрос: Есть ли разница между сохранением аудиофайлов в каталоге активов и хранением их в каталоге res/raw? Кроме того, что они не получают идентификаторы, если они находятся в каталоге активов. Если я перемещаю аудиофайлы в папку res/raw, у меня возникает проблема с повторным использованием MediaPlayer s, потому что для параметра setDataSource() нет идентификатора. Я не могу найти хорошее руководство для решения этой проблемы.

ответ

205
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 

Ваша версия будет работать, если у вас только один файл в активах каталога. Содержимое каталога активов не является фактически «реальными файлами» на диске. Все они собраны один за другим. Так что, если вы не указать, с чего начать и сколько байт для чтения, игрок будет дочитать до конца (то есть, будет продолжать играть все файлы в активах каталог)

+1

Это сработало. Благодарю. Но я думаю, что моя версия ДОЛЖНА также работать. –

+54

Ваша версия будет работать, если в каталоге ресурсов есть только один файл. Содержимое каталога ресурсов на самом деле не является «реальным файлом» на диске. Все они собраны один за другим. Итак, если вы не укажете, с чего начать и сколько байтов читать, игрок будет читать до конца (то есть будет продолжать играть все файлы в каталоге ресурсов) –

+0

Очень хороший ответ! – Redax

57

Эта функция будет нормально работать :)

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

Что такое m? вы инициализируете m = новый MediaPlayer(); после и использовал его раньше? – Umar

+0

Привет @Umar, я беру глобальную переменную MediaPlayer m = null; то я назначил функцию playBeep() –

+0

Имейте в виду, что 'MediaPlayer m' должен быть' static' или иметь еще одну ** ссылку **. Если у вас есть 'm' в функции без какой-либо ссылки,' GC' будет «собирать» ее –

 Смежные вопросы

  • Нет связанных вопросов^_^