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.

Catalin Morosan
fuente

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)

Sarwar Erfan
fuente
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();
    }
}
Siddhpura Amit
fuente
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();
    }
}
Alecs
fuente
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 ();
    }
}
Gráficos Hadid
fuente
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();
}
MODERNO
fuente
-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();
}
Altivo
fuente
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