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.

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)


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

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

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

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

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.