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

时间:2011-01-17 03:46:30

标签: android audio media-player duration soundpool

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

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

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

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

    谢谢, 最大

    我目前正在使用的代码(工作正常,但目的很重):

    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但没有得到答案。

3 个答案:

答案 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;

}