Riproduci file audio dalla directory delle risorse


126

Ho il codice seguente:

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

Il problema è che, quando eseguo questo codice, inizia a riprodurre tutti i file audio nella directory degli asset, in ordine alfabetico invece di riprodurre solo il file audio che ho richiesto. Che cosa sto facendo di sbagliato? C'è un modo migliore per riprodurre file audio dalla directory degli asset?

Domanda successiva: c'è differenza tra mantenere i file audio nella directory degli asset e mantenerli nella directory res / raw? Oltre al fatto che non ottengono gli ID se si trovano nella directory degli asset. Se sposto i file audio nella cartella res / raw, ho un problema con il riutilizzo di MediaPlayers perché non esiste un parametro id per setDataSource(). Non riesco a trovare una buona linea guida per gestire questo tipo di problema.

Risposte:


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

La tua versione funzionerebbe se avessi un solo file nella directory degli asset. I contenuti della directory degli asset non sono effettivamente "file reali" su disco. Tutti vengono messi insieme uno dopo l'altro. Quindi, se non specifichi da dove iniziare e quanti byte leggere, il lettore leggerà fino alla fine (cioè continuerà a riprodurre tutti i file nella directory degli asset)


1
Ha funzionato. Grazie. Ma penso che anche la mia versione DOVREBBE aver funzionato.
Catalin Morosan

57
La tua versione funzionerebbe se avessi un solo file nella directory degli asset. I contenuti della directory degli asset non sono effettivamente "file reali" su disco. Tutti vengono messi insieme uno dopo l'altro. Quindi, se non specifichi da dove iniziare e quanti byte leggere, il lettore leggerà fino alla fine (cioè continuerà a riprodurre tutti i file nella directory degli asset)
Sarwar Erfan

1
Questo è il percorso del codice che sto usando ma non funziona: stackoverflow.com/questions/9124378/…
Timothy Lee Russell,

1
+1 per aver risposto a una domanda completamente non correlata che avevo sui file di risorse!
jjm

@SarwarErfan sconvolto dall'implementazione della directory degli asset> _ <
Warpzit

74

Questa funzione funzionerà correttamente :)

// 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
cos'è m? stai inizializzando m = new MediaPlayer (); dopo e usato prima?
Umer

Ciao @ Umar, ho preso la variabile globale MediaPlayer m = null; poi ho assegnato nella funzione playBeep ()
Siddhpura Amit

Tieni presente che MediaPlayer mdeve essere statico avere un altro riferimento . Se si dispone min una funzione senza alcun riferimento, GCverrà "
ritirato

a volte l'audio non viene riprodotto fino alla fine
user7856586

looping to true è che suona per sempre?
gumuruh

4

Ecco la mia versione statica:

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

Correzione della funzione di cui sopra per la riproduzione e la pausa

  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

inserisci qui la descrizione dell'immagine

avvia il suono

startSound("mp3/ba.mp3");

metodo

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

questo funziona per me:

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

Nell'attività principale, durante la creazione:

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

come utilizzare nel codice (al clic del pulsante):

private void bButton_Click( object sender, EventArgs e )
{
  eSound_Def.PlaySound_Beep();
}

WWWWWCos'è eUNIS?
Dyno Cris

eUNIS è una classe statica personalizzata con asset variabili, che fa riferimento agli asset dell'applicazione.
Altivo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.