web-dev-qa-db-fra.com

Lire un fichier audio à partir du répertoire des actifs

J'ai le code suivant: 

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

Le problème est que, lorsque j'exécute ce code, il commence à lire tous les fichiers audio du répertoire assets, dans l'ordre alphabétique, au lieu de simplement lire le fichier audio que j'ai demandé. Qu'est-ce que je fais mal? Existe-t-il un meilleur moyen de lire des fichiers audio à partir du répertoire des actifs?

Question de suivi: Existe-t-il une différence entre conserver les fichiers audio dans le répertoire des actifs et les conserver dans le répertoire res/raw? Outre le fait qu'ils ne reçoivent pas d'identifiant s'ils se trouvent dans le répertoire des actifs. Si je déplace les fichiers audio dans le dossier res/raw, la réutilisation de MediaPlayers pose un problème car il n’existe pas de paramètre id pour setDataSource(). Je ne peux pas trouver un bon guide pour traiter ce genre de problème.

111
Catalin Morosan
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());

Votre version fonctionnerait si vous n'aviez qu'un seul fichier dans l'actif annuaire. Le contenu du répertoire des ressources ne sont pas réellement des "fichiers réels" sur le disque. Tous sont mis ensemble les uns après les autres. Donc, si vous le faites pas spécifier où commencer et combien d’octets à lire, le lecteur le fera lire jusqu'à la fin (c'est-à-dire continuer à lire tous les fichiers du répertoire assets )

224
Sarwar Erfan

Cette fonction fonctionnera correctement :)

// 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();
    }
}
66
Siddhpura Amit

Voici ma version statique:

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

Correction de la fonction ci-dessus pour jouer et mettre en pause

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