【发布时间】:2011-06-10 05:46:51
【问题描述】:
我正在使用SoundPool 在我的应用程序中播放音频剪辑。一切都很好,但我需要知道剪辑播放何时结束。
目前,我通过使用MediaPlayer 实例获取每个剪辑的持续时间,在我的应用程序中跟踪它。这工作正常,但加载每个文件两次看起来很浪费,只是为了获得持续时间。知道文件的长度(可从AssetFileDescriptor 获得)我自己可以粗略地计算持续时间,但我仍然需要知道采样率和通道数。
我看到了解决该问题的两个潜在解决方案:
- 确定剪辑何时播放完毕(SoundClip 似乎无法实现)。
- 有一个类可以只加载音频文件的标题,并为我提供采样率/通道数(理想情况下,还可以通过采样计数来获得确切的持续时间)。
有什么建议吗?
谢谢, 最大
我目前正在使用的代码(工作正常,但为此目的相当繁重):
String[] fileNames = ...
MediaPlayer mp = new MediaPlayer();
for (String fileName : fileNames) {
AssetFileDescriptor d = context.getAssets().openFd(fileName);
mp.reset();
mp.setDataSource(d.getFileDescriptor(), d.getStartOffset(), d.getLength());
mp.prepare();
int duration = mp.getDuration();
// ...
}
顺便说一句,这个问题已经asked,但没有得到答案。
【问题讨论】:
-
你考虑过
onCompletitionListener吗? developer.android.com/reference/android/media/… -
@SatelliteSD 它在我拥有的任何设备上都无法正常工作(永远不会被调用)。即使它确实在某些操作系统版本/某些设备上被调用,它也是不可靠的,因此无用。
-
您确认
setOnCompletitionListner是在.start()之后调用的? -
完成监听器仅用于 MediaPlayer,不适用于 SoundPool。据我所知,对声音完成进行回调的唯一方法是使用 MediaPlayer,而不是 SoundPool。
标签: android audio media-player duration soundpool