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

我正在使用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(); // ... } 

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

你试过这个:

 String mediaPath = Uri.parse("android.resource:///raw/filename").getPath(); MediaMetadataRetriever mmr = new MediaMetadataRetriever(); mmr.setDataSource(mediaPath); String duration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); mmr.release(); 

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

试试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(); 

这对我来说可以在几秒钟内获得资产音频文件的持续时间=====>

 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; }