Lire le fichier audio à partir du répertoire des ressources

126

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 dans le répertoire des actifs, 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 ressources?

Question complémentaire: Y a-t-il une différence entre conserver les fichiers audio dans le répertoire assets et les conserver dans le répertoire res / raw? Outre le fait qu'ils n'obtiennent pas d'identifiants s'ils sont dans le répertoire des actifs. Si je déplace les fichiers audio vers le dossier res / raw, j'ai un problème avec la réutilisation de MediaPlayers car il n'y a pas de paramètre id pour setDataSource(). Je ne trouve pas de bons conseils pour gérer ce genre de problème.

Catalin Morosan
la source

Réponses:

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

Votre version fonctionnerait si vous n'aviez qu'un seul fichier dans le répertoire des ressources. Le contenu du répertoire de ressources ne sont pas en fait de «vrais fichiers» sur le disque. Tous sont assemblés les uns après les autres. Donc, si vous ne spécifiez pas par où commencer et combien d'octets lire, le lecteur lira jusqu'à la fin (c'est-à-dire qu'il continuera à lire tous les fichiers dans le répertoire assets)

Sarwar Erfan
la source
1
Ça a marché. Merci. Mais je pense que ma version DEVRAIT aussi fonctionner.
Catalin Morosan
57
Votre version fonctionnerait si vous n'aviez qu'un seul fichier dans le répertoire des ressources. Le contenu du répertoire de ressources ne sont pas en fait de «vrais fichiers» sur le disque. Tous sont assemblés les uns après les autres. Donc, si vous ne spécifiez pas par où commencer et combien d'octets lire, le lecteur lira jusqu'à la fin (c'est-à-dire qu'il continuera à lire tous les fichiers du répertoire assets)
Sarwar Erfan
1
C'est le chemin de code que j'utilise mais cela ne fonctionne pas: stackoverflow.com/questions/9124378/…
Timothy Lee Russell
1
+1 pour avoir répondu à une question totalement indépendante que j'avais sur les fichiers d'actifs!
jjm
@SarwarErfan l'esprit époustouflé par l'implémentation du répertoire des actifs> _ <
Warpzit
74

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();
    }
}
Siddhpura Amit
la source
3
qu'est-ce que m? vous initialisez m = new MediaPlayer (); après et utilisé avant?
Umer
Salut @Umar, j'ai pris la variable globale MediaPlayer m = null; puis j'ai assigné la fonction playBeep ()
Siddhpura Amit
Gardez à l'esprit MediaPlayer mdoit être staticou avoir une autre référence . Si vous avez mdans une fonction sans aucune référence, GCva "collecter"
Menelaos Kotsollaris
parfois l'audio n'est pas
lu
boucle à vrai est-ce que ça joue pour toujours?
gumuruh
4

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();
    }
}
Alecs
la source
1

Correction de la fonction ci-dessus pour la lecture et la 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 ();
    }
}
Graphiques Hadid
la source
1

entrez la description de l'image ici

démarrer le son

startSound("mp3/ba.mp3");

méthode

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();
}
MODERNE
la source
-4

cela fonctionne pour moi:

public static class eSound_Def
{
  private static Android.Media.MediaPlayer mpBeep;

  public static void InitSounds( Android.Content.Res.AssetManager Assets )
  {
    mpBeep = new Android.Media.MediaPlayer();

    InitSound_Beep( Assets );
  }

  private static void InitSound_Beep( Android.Content.Res.AssetManager Assets )
  {
    Android.Content.Res.AssetFileDescriptor AFD;

    AFD = Assets.OpenFd( "Sounds/beep-06.mp3" );
    mpBeep.SetDataSource( AFD.FileDescriptor, AFD.StartOffset, AFD.Length );
    AFD.Close();

    mpBeep.Prepare();
    mpBeep.SetVolume( 1f, 1f );
    mpBeep.Looping = false;
  }

  public static void PlaySound_Beep()
  {
    if (mpBeep.IsPlaying == true) 
    {
      mpBeep.Stop();
      mpBeep.Reset();
      InitSound_Beep(); 
    }
    mpBeep.Start();
  }
}

Dans l'activité principale, lors de la création:

protected override void OnCreate( Bundle savedInstanceState )
{
  base.OnCreate( savedInstanceState );
  SetContentView( Resource.Layout.lmain_activity );
  ...
  eSound_Def.InitSounds( Assets );
  ...
}

comment utiliser dans le code (en cliquant sur le bouton):

private void bButton_Click( object sender, EventArgs e )
{
  eSound_Def.PlaySound_Beep();
}
Altivo
la source
WWWWWQu'est-ce qu'eUNIS?
Dyno Cris le
eUNIS est une classe statique personnalisée avec des actifs variables, c'est-à-dire une référence aux actifs d'application.
Altivo le