我正在使用SoundPool在我的应用中播放音频片段。一切都很好,但我需要知道剪辑播放何时结束。
目前我通过使用MediaPlayer实例获取每个剪辑的持续时间来在我的应用中跟踪它。这工作正常,但加载每个文件两次看起来很浪费,只是为了得到持续时间。我可以自己大致计算持续时间,知道文件的长度(可从AssetFileDescriptor获得),但我仍然需要知道采样率和通道数。
我看到了解决该问题的两种可能方案:
有什么建议吗?
谢谢, 最大
我目前正在使用的代码(工作正常,但目的很重):
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但没有得到答案。
答案 0 :(得分: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();
但我不确定这比现有代码更轻。
答案 1 :(得分:3)
尝试FFmpegMediaMetadataRetriever:
String[] fileNames = ...
FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();
for (String fileName : fileNames) {
AssetFileDescriptor d = context.getAssets().openFd(fileName);
mmr.setDataSource(d.getFileDescriptor(), d.getStartOffset(), d.getLength());
String duration = mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_DURATION);
}
mmr.release();
答案 2 :(得分:0)
这对我来说可以在几秒钟内获得资产音频文件的持续时间=====&gt;
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
AssetFileDescriptor d = context.getAssets().openFd(fileName);
mmr.setDataSource(d.getFileDescriptor(), d.getStartOffset(), d.getLength());
String duration =
mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
mmr.release();
更新
以秒为单位获取资源音频文件持续时间的方法
public String gettotaltimeassets() {
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
AssetFileDescriptor d = null;
try {
d = getApplicationContext().getAssets().openFd("ASSETS FILE NAME");
} catch (IOException e) {
e.printStackTrace();
}
mmr.setDataSource(d.getFileDescriptor(), d.getStartOffset(), d.getLength());
String duration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
long dur = Long.parseLong(duration);
String seconds = String.valueOf((dur % 60000) / 1000);
Log.d("seconds===========>", seconds);
mmr.release();
return seconds;
}
以秒为单位获取内部存储音频文件持续时间的方法
public String gettotaltimestorage(String filePath) {
// load data file
Log.d("time=================>","time=================>");
MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
metaRetriever.setDataSource(YourACTIVITY.this, Uri.parse(filePath));
Log.d("time=================>","time=================>");
String out = "";
// get mp3 info
// convert duration to minute:seconds
String duration =
metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
Log.d("time=================>", duration);
long dur = Long.parseLong(duration);
String seconds = String.valueOf((dur % 60000) / 1000);
Log.d("seconds===========>", seconds);
// close object
metaRetriever.release();
return seconds;
}