it-swarm.com.de

Spielen Sie eine Audiodatei aus dem Assets-Verzeichnis ab

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 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 dem Speichern von Audiodateien im Assets-Verzeichnis und dem Speichern im Res/Raw-Verzeichnis? Abgesehen davon, 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 für setDataSource() kein Parameter id vorhanden ist. Ich kann keine gute Richtlinie für den Umgang mit dieser Art von Problem finden.

111
Catalin Morosan
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());

Ihre Version würde funktionieren, wenn Sie nur eine Datei in den Assets hätten Verzeichnis. Der Inhalt des Asset-Verzeichnisses besteht nicht aus "echten Dateien" auf der Festplatte. Alle werden nacheinander zusammengefügt. Wenn ja. Wenn Sie nicht angeben, wo Sie beginnen sollen und wie viele Bytes gelesen werden sollen, wird der Player bis zum Ende lesen (dh alle Dateien werden im Assets -Verzeichnis wiedergegeben)

224
Sarwar Erfan

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

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

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