Воспроизвести аудиофайл из каталога ресурсов - PullRequest
113 голосов
/ 20 июля 2010

У меня есть следующий код:

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

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

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

Ответы [ 5 ]

226 голосов
/ 02 августа 2010
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());

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

66 голосов
/ 20 ноября 2012

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

// 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();
    }
}
3 голосов
/ 27 ноября 2018

Вот моя статическая версия:

public static void playAssetSound(Context context, String soundFileName) {
    try {
        MediaPlayer mediaPlayer = new MediaPlayer();

        AssetFileDescriptor descriptor = context.getAssets().openFd(soundFileName);
        mediaPlayer.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
        descriptor.close();

        mediaPlayer.prepare();
        mediaPlayer.setVolume(1f, 1f);
        mediaPlayer.setLooping(false);
        mediaPlayer.start();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
0 голосов
/ 26 марта 2019

enter image description here

Стартовый звук

startSound("mp3/ba.mp3");

метод

private void startSound(String filename) {
    AssetFileDescriptor afd = null;
    try {
        afd = getResources().getAssets().openFd(filename);
    } catch (IOException e) {
        e.printStackTrace();
    }
    MediaPlayer player = new MediaPlayer();
    try {
        assert afd != null;
        player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        player.prepare();
    } catch (IOException e) {
        e.printStackTrace();
    }
    player.start();
}
0 голосов
/ 16 августа 2018

Исправление вышеуказанной функции для воспроизведения и паузы

  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 ();
    }
}
...