播放资源目录中的音频文件我有以下代码:AssetFileDescriptor afd = getAssets().openFd("AudioFile.mp3");player = new MediaPlayer();player.setDataSource(afd.getFileDescriptor());player.prepare();player.start();问题是,当我运行这段代码时,它会按字母顺序开始播放资源目录中的所有音频文件,而不是只播放我请求的音频文件。我究竟做错了什么?有没有更好的方法从资源目录播放音频文件?后续问题:将音频文件保存在资源目录中并将它们保存在res / raw目录中是否有区别?除了他们没有获得ID,如果他们在资产目录中的事实。如果我将音频文件移动到res / raw文件夹,那么我有一个重用MediaPlayers 的问题,因为没有id参数setDataSource()。我找不到处理这类问题的好指南。
3 回答
饮歌长啸
TA贡献1951条经验 获得超3个赞
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
如果您在资源目录中只有一个文件,那么您的版本将起作用。资产目录内容实际上不是磁盘上的“真实文件”。所有这些都是一个接一个地组合在一起。因此,如果您没有指定从哪里开始以及要读取多少字节,则播放器将读到最后(即,将继续播放assets目录中的所有文件)
ITMISS
TA贡献1871条经验 获得超8个赞
这个功能会正常工作:)
// 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();
}}
互换的青春
TA贡献1797条经验 获得超6个赞
这是我的静态版本:
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 关注
- 708 浏览
添加回答
举报
0/150
提交
取消
