播放资源目录中的音频文件我有以下代码: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 关注
- 613 浏览
添加回答
举报
0/150
提交
取消