播放资源目录中的音频文件

时间:2010-07-20 10:27:00

标签: android audio android-mediaplayer assets android-assets

我有以下代码:

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

问题在于,当我运行此代码时,它会按字母顺序开始播放资源目录中的所有音频文件,而不是仅播放我请求的音频文件。我究竟做错了什么?有没有更好的方法从资源目录播放音频文件?

后续问题: 将音频文件保存在assets目录中并将它们保存在res / raw目录中是否有区别?除了他们没有获得ID,如果他们在资产目录中的事实。如果我将音频文件移动到res / raw文件夹,那么我在重用MediaPlayer时遇到问题,因为setDataSource()没有id参数。我找不到处理这类问题的好指南。

6 个答案:

答案 0 :(得分:226)

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

如果资产中只有一个文件,那么您的版本就可以使用   目录。资产目录内容实际上不是“真实文件”   在磁盘上。所有这些都是一个接一个地组合在一起。所以,如果你这样做   玩家不会指定从哪里开始以及要读取多少字节   读到最后(也就是说,将继续播放资产中的所有文件   目录)

答案 1 :(得分:66)

此功能将正常工作:)

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

答案 2 :(得分:3)

这是我的静态版本:

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

答案 3 :(得分:0)

修复上述播放和暂停功能

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

答案 4 :(得分:-1)

enter image description here

开始声音

startSound("mp3/ba.mp3");

方法

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

答案 5 :(得分:-1)

这对我有用:

private static Android.Media.MediaPlayer mpBeep;

public static void InitSounds()
{
  mpBeep = new Android.Media.MediaPlayer();

  InitSound_Beep();
}

private static void InitSound_Beep()
{
  Android.Content.Res.AssetFileDescriptor AFD;

  AFD = eUNIS.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();
}