从资产目录播放音频文件

问题描述:

我有以下代码:从资产目录播放音频文件

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

的问题是,当我运行这段代码,它开始播放的所有音频文件资源目录中,按字母顺序排列,而不是只播放我要求的音频文件。我究竟做错了什么?有没有更好的方法来播放资产目录中的音频文件?

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

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

你的版本会工作。资产目录内容实际上不是磁盘上的“真实文件” 。他们都是一个接一个地放在一起。所以,如果你做 未指定从哪里开始,如何读取的字节数,玩家将 阅读到最后(也就是,将继续播放的所有文件的资产 目录)

+1

它的工作。谢谢。但我认为我的版本也应该有效。 – 2010-08-05 16:17:02

+54

如果资产目录中只有一个文件,则您的版本可以正常工作。 资产目录内容实际上不是磁盘上的“真实文件”。他们都是一个接一个地放在一起。所以,如果你没有指定从哪里开始读取多少字节,播放器将读取到最后(即将继续播放资产目录中的所有文件) – 2010-08-09 04:46:47

+0

非常好的答案! – Redax 2011-03-29 15:37:09

此功能将正常工作:)

// 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

什么是m?你正在初始化m = new MediaPlayer();之前和之前使用过它? – Umar 2015-01-29 07:33:52

+0

嗨@Umar,我有全局变量MediaPlayer m = null;那么我已经在playBeep()函数中分配了 – 2015-01-29 09:22:42

+0

请记住'MediaPlayer m'必须是'static'或具有另一个**引用**。如果你在一个没有任何引用的函数中有'm','GC'将会“收集”它 – 2015-03-20 20:40:56