Воспроизведение аудиофайла из каталога активов
у меня есть следующий код:
AssetFileDescriptor afd = getAssets().openFd("AudioFile.mp3");
player = new MediaPlayer();
player.setDataSource(afd.getFileDescriptor());
player.prepare();
player.start();
проблема в том, что, когда я запускаю этот код, он начинает воспроизводить все аудиофайлы в каталоге активов в алфавитном порядке вместо того, чтобы просто воспроизводить аудиофайл, который я просил. Что я делаю не так? Есть ли лучший способ воспроизведения аудиофайлов из каталога активов?
следующий вопрос:
Есть ли разница между хранением аудиофайлов в каталоге активов и хранением их в каталоге res/raw? Помимо того, что они не получают идентификаторы, если они находятся в папке активов. Если я перемещаю аудиофайлы в папку res / raw, у меня возникает проблема с повторным использованием MediaPlayer
s, потому что нет параметра id для setDataSource()
. Я не могу найти хорошее руководство для решения такого рода проблем.
3 ответа:
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
ваша версия будет работать, если у вас только один файл в активы справочник. Содержимое каталога активов на самом деле не реальные файлы на диске. Все они складываются один за другим. Так что, если вы делаете не указывая, с чего начать и сколько байтов читать, плеер будет читать до конца (то есть будет продолжать воспроизводить все файлы в активах каталог)
эта функция будет работать должным образом :)
// 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(); } }
исправление вышеуказанной функции для воспроизведения и паузы
public void playBeep ( String word ) { try { if ( ( m == null ) ) { m = new MediaPlayer (); } else if( m != null&&lastPlayed.equalsIgnoreCase (word)){ m.stop(); m.release (); m=null; lastPlayed=""; return; }else if(m != null){ m.release (); m = new MediaPlayer (); } lastPlayed=word; AssetFileDescriptor descriptor = context.getAssets ().openFd ( "rings/" + word + ".mp3" ); long start = descriptor.getStartOffset (); long end = descriptor.getLength (); // get title // songTitle=songsList.get(songIndex).get("songTitle"); // set the data source try { m.setDataSource ( descriptor.getFileDescriptor (), start, end ); } catch ( Exception e ) { Log.e ( "MUSIC SERVICE", "Error setting data source", e ); } m.prepare (); m.setVolume ( 1f, 1f ); // m.setLooping(true); m.start (); } catch ( Exception e ) { e.printStackTrace (); } }