Reproduzir arquivo de áudio do diretório de ativos

126

Eu tenho o seguinte código:

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

O problema é que, quando executo esse código, ele começa a reproduzir todos os arquivos de áudio no diretório de ativos, em ordem alfabética, em vez de apenas reproduzir o arquivo de áudio solicitado. O que estou fazendo de errado? Existe uma maneira melhor de reproduzir arquivos de áudio do diretório de ativos?

Pergunta de acompanhamento: Existe uma diferença entre manter arquivos de áudio no diretório de ativos e mantê-los no diretório res / raw? Além do fato de não receberem IDs, se estiverem no diretório de ativos. Se eu mover os arquivos de áudio para a pasta res / raw, tenho um problema ao reutilizar MediaPlayers porque não há um parâmetro de identificação para setDataSource(). Não consigo encontrar uma boa orientação para lidar com esse tipo de problema.

Catalin Morosan
fonte

Respostas:

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

Sua versão funcionaria se você tivesse apenas um arquivo no diretório de ativos. O conteúdo do diretório de ativos não é realmente 'arquivos reais' no disco. Todos eles são reunidos um após o outro. Portanto, se você não especificar por onde começar e quantos bytes ler, o player lerá até o final (ou seja, continuará reproduzindo todos os arquivos no diretório de ativos)

Sarwar Erfan
fonte
1
Funcionou. Obrigado. Mas acho que minha versão também deve ter funcionado.
Catalin Morosan
57
Sua versão funcionaria se você tivesse apenas um arquivo no diretório de ativos. O conteúdo do diretório de ativos não é realmente 'arquivos reais' no disco. Todos eles são reunidos um após o outro. Então, se você não especificar onde começar e quantos bytes para ler, o leitor vai ler até o final (ou seja, vai continuar a jogar todos os arquivos no diretório de ativos)
Sarwar Erfan
1
Este é o caminho de código que estou usando, mas ele não funciona: stackoverflow.com/questions/9124378/...
Timothy Lee Russell
1
+1 por responder a uma pergunta completamente independente que eu tinha sobre arquivos de ativos!
jjm
Mente @SarwarErfan soprado pela implementação de diretório ativos> _ <
Warpzit
74

Esta função irá funcionar corretamente :)

// 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
fonte
3
o que é m? você está inicializando m = new MediaPlayer (); depois e usou antes?
quer
Oi @Umar, eu recebi a variável Global MediaPlayer m = null; então eu atribuí na função playBeep () #
Siddhpura Amit
Lembre-se de que MediaPlayer mdeve haver staticou ter outra referência . Se você tem muma função sem nenhuma referência, GCa "coleciona"
Menelaos Kotsollaris 20/03/15
às vezes de áudio não jogar até o fim
user7856586
looping to true Isso é jogar para sempre?
gumuruh
4

Aqui está minha versão 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
fonte
1

Correção da função acima para reproduzir e 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
fonte
1

insira a descrição da imagem aqui

iniciar som

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
fonte
-4

isso funciona para mim:

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

Na atividade principal, em create:

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

como usar no código (no clique do botão):

private void bButton_Click( object sender, EventArgs e )
{
  eSound_Def.PlaySound_Beep();
}
Altivo
fonte
WWWWWO que é o eUNIS?
Dyno Cris 21/04
O eUNIS é uma classe estática personalizada com ativos variáveis, que é uma referência aos ativos do aplicativo.
Altivo