从资产目录播放音频文件
我有以下代码:从资产目录播放音频文件
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());
你的版本会工作。资产目录内容实际上不是磁盘上的“真实文件” 。他们都是一个接一个地放在一起。所以,如果你做 未指定从哪里开始,如何读取的字节数,玩家将 阅读到最后(也就是,将继续播放的所有文件的资产 目录)
此功能将正常工作:)
// 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();
}
}
什么是m?你正在初始化m = new MediaPlayer();之前和之前使用过它? – Umar 2015-01-29 07:33:52
嗨@Umar,我有全局变量MediaPlayer m = null;那么我已经在playBeep()函数中分配了 – 2015-01-29 09:22:42
请记住'MediaPlayer m'必须是'static'或具有另一个**引用**。如果你在一个没有任何引用的函数中有'm','GC'将会“收集”它 – 2015-03-20 20:40:56
它的工作。谢谢。但我认为我的版本也应该有效。 – 2010-08-05 16:17:02
如果资产目录中只有一个文件,则您的版本可以正常工作。 资产目录内容实际上不是磁盘上的“真实文件”。他们都是一个接一个地放在一起。所以,如果你没有指定从哪里开始读取多少字节,播放器将读取到最后(即将继续播放资产目录中的所有文件) – 2010-08-09 04:46:47
非常好的答案! – Redax 2011-03-29 15:37:09