Воспроизведение аудиофайла из каталога активов


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

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

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

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

3   105  

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