在Android中获取音频文件持续时间的最佳方法是什么?

Gil*_*ead 11 audio android duration media-player soundpool

我正在使用SoundPool 在我的应用程序中播放音频剪辑.一切都很好,但我需要知道剪辑播放何时结束.

目前,我通过使用MediaPlayer实例获取每个剪辑的持续时间来在我的应用中跟踪它.这工作正常,但加载每个文件两次看起来很浪费,只是为了得到持续时间.我可以自己知道文件的长度(可从AssetFileDescriptor获得)粗略计算持续时间,但我仍然需要知道采样率和通道数.

我看到了这个问题的两种可能解决方案:

  1. 弄清楚剪辑何时播放完毕(SoundClip似乎无法实现).
  2. 有一个类可以只加载音频文件的标题,并给我采样率/通道数(理想情况下,样本计数,以获得确切的持续时间).

有什么建议?

谢谢,马克斯

我目前正在使用的代码(工作正常,但为此目的而言相当沉重):

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();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

在旁注中,这个问题已被提出但没有得到答案.

Meh*_*her 12

你试过这个:

String mediaPath = Uri.parse("android.resource://<your-package-name>/raw/filename").getPath();
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(mediaPath);
String duration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
mmr.release();
Run Code Online (Sandbox Code Playgroud)

但我不确定这比现有代码更轻.

  • 不要忘记发布`MediaMetadataRetriever` (3认同)
  • 我试过这个,但我总是从 `mmr.setDataSource()` 抛出一个 IllegalArgumentException - 有什么方法可以找出这条路径应该是什么样子的吗?因为我怀疑我使用的路径可能不正确。我正在使用捆绑 .m4a 和/或 .wav 音频文件。 (2认同)