Reproduce archivos de audio desde el directorio de activos


126

Tengo el siguiente código:

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

El problema es que, cuando ejecuto este código, comienza a reproducir todos los archivos de audio en el directorio de activos, en orden alfabético en lugar de solo reproducir el archivo de audio que solicité. ¿Qué estoy haciendo mal? ¿Hay una mejor manera de reproducir archivos de audio desde el directorio de activos?

Pregunta de seguimiento: ¿Hay alguna diferencia entre mantener los archivos de audio en el directorio de activos y mantenerlos en el directorio res / raw? Además del hecho de que no obtienen identificadores si están en el directorio de activos. Si muevo los archivos de audio a la carpeta res / raw, entonces tengo un problema con la reutilización de MediaPlayers porque no hay ningún parámetro de id setDataSource(). No puedo encontrar una buena guía para manejar este tipo de problema.

Respuestas:


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

Su versión funcionaría si solo tuviera un archivo en el directorio de activos. El contenido del directorio de activos no son realmente 'archivos reales' en el disco. Todos ellos se unen uno tras otro. Entonces, si no especifica dónde comenzar y cuántos bytes leer, el reproductor leerá hasta el final (es decir, seguirá reproduciendo todos los archivos en el directorio de activos)


1
Funcionó. Gracias. Pero creo que mi versión también DEBERÍA haber funcionado.
Catalin Morosan

57
Su versión funcionaría si solo tuviera un archivo en el directorio de activos. Los contenidos del directorio de activos no son realmente 'archivos reales' en el disco. Todos ellos se unen uno tras otro. Entonces, si no especifica dónde comenzar y cuántos bytes leer, el reproductor leerá hasta el final (es decir, seguirá reproduciendo todos los archivos en el directorio de activos)
Sarwar Erfan

1
Esta es la ruta de código que estoy usando pero no funciona: stackoverflow.com/questions/9124378/…
Timothy Lee Russell

1
¡+1 por responder una pregunta completamente no relacionada que tenía sobre los archivos de activos!
jjm

@SarwarErfan mente impresionado por la implementación del directorio de activos> _ <
Warpzit

74

Esta función funcionará correctamente :)

// 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
que es m está inicializando m = new MediaPlayer (); después y lo usó antes?
Umer

Hola @Umar, he tomado la variable global MediaPlayer m = null; entonces he asignado en la función playBeep ()
Siddhpura Amit

Tenga en cuenta que MediaPlayer mdebe ser statico tener otra referencia . Si tiene muna función sin ninguna referencia, la GC"recopilará"
Menelaos Kotsollaris

a veces el audio no se reproduce hasta el final
user7856586

dando vueltas a la verdad, ¿eso es jugar para siempre?
Gumuruh

4

Aquí mi versión estática:

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

Corrección de la función anterior para reproducir y pausar

  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

ingrese la descripción de la imagen aquí

sonido de inicio

startSound("mp3/ba.mp3");

método

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

esto funciona para mi:

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

En la actividad principal, en crear:

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

Cómo usar en el código (al hacer clic en el botón):

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

WWWWW¿Qué es eUNIS?
Dyno Cris

eUNIS es una clase estática personalizada con activos variables, que hace referencia a los activos de la aplicación.
Altivo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.