Spielen Sie eine Audiodatei aus dem Assets-Verzeichnis ab


126

Ich habe folgenden Code:

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

Das Problem ist, dass beim Ausführen dieses Codes alle Audiodateien im Assets-Verzeichnis in alphabetischer Reihenfolge abgespielt werden, anstatt nur die von mir angeforderte Audiodatei abzuspielen. Was mache ich falsch? Gibt es eine bessere Möglichkeit, Audiodateien aus dem Assets-Verzeichnis abzuspielen?

Folgefrage: Gibt es einen Unterschied zwischen der Speicherung von Audiodateien im Assets-Verzeichnis und der Speicherung im Verzeichnis res / raw? Abgesehen von der Tatsache, dass sie keine IDs erhalten, wenn sie sich im Assets-Verzeichnis befinden. Wenn ich die Audiodateien in den Ordner res / raw verschiebe, habe ich ein Problem mit der Wiederverwendung von MediaPlayers, da es keinen ID-Parameter für gibt setDataSource(). Ich kann keine gute Richtlinie für den Umgang mit solchen Problemen finden.

Antworten:


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

Ihre Version würde funktionieren, wenn Sie nur eine Datei im Assets-Verzeichnis hätten. Der Inhalt des Asset-Verzeichnisses ist eigentlich keine "echte Datei" auf der Festplatte. Alle von ihnen werden nacheinander zusammengestellt. Wenn Sie also nicht angeben, wo und wie viele Bytes gelesen werden sollen, liest der Player bis zum Ende (dh er spielt weiterhin alle Dateien im Assets-Verzeichnis ab).


1
Es funktionierte. Vielen Dank. Aber ich denke, meine Version sollte auch funktioniert haben.
Catalin Morosan

57
Ihre Version würde funktionieren, wenn Sie nur eine Datei im Assets-Verzeichnis hätten. Der Inhalt des Asset-Verzeichnisses ist eigentlich keine "echte Datei" auf der Festplatte. Alle von ihnen werden nacheinander zusammengestellt. Wenn Sie also nicht angeben, wo Sie beginnen sollen und wie viele Bytes gelesen werden sollen, liest der Player bis zum Ende (dh er spielt weiterhin alle Dateien im Assets-Verzeichnis ab)
Sarwar Erfan

1
Dies ist der Codepfad
Timothy Lee Russell

1
+1 für die Beantwortung einer völlig unabhängigen Frage zu Asset-Dateien!
JJM

@ SarwarErfan Geist durch die Implementierung von Assets-Verzeichnis> _ <
Warpzit

74

Diese Funktion wird richtig funktionieren :)

// 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
was ist m Sie initialisieren m = new MediaPlayer (); danach und vorher benutzt?
Umer

Hallo @Umar, ich habe die globale Variable MediaPlayer genommen m = null; dann habe ich in playBeep () Funktion zugewiesen
Siddhpura Amit

Denken Sie daran, MediaPlayer mmuss staticeine andere Referenz sein oder haben . Wenn Sie min einer Funktion ohne Referenz haben, GCwird es "sammeln"
Menelaos Kotsollaris

Manchmal wird Audio nicht bis zum Ende
abgespielt

Looping to True spielt das für immer?
Gumuruh

4

Hier meine statische Version:

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

Korrektur der obigen Funktion für Wiedergabe und 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

Geben Sie hier die Bildbeschreibung ein

Ton starten

startSound("mp3/ba.mp3");

Methode

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

das funktioniert bei mir:

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

In der Hauptaktivität beim Erstellen:

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

Verwendung im Code (beim Klicken auf die Schaltfläche):

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

WWWWWWas ist eUNIS?
Dyno Cris

eUNIS ist eine benutzerdefinierte statische Klasse mit variablen Assets, die auf Anwendungsassets verweist.
Altivo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.