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.

Catalin Morosan
quelle

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).

Sarwar Erfan
quelle
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();
    }
}
Siddhpura Amit
quelle
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();
    }
}
Alecs
quelle
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 ();
    }
}
Hadid Graphics
quelle
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();
}
MODERN
quelle
-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();
}
Altivo
quelle
WWWWWWas ist eUNIS?
Dyno Cris
eUNIS ist eine benutzerdefinierte statische Klasse mit variablen Assets, die auf Anwendungsassets verweist.
Altivo