Каков наилучший способ получить продолжительность аудиофайла в Android?

Я использую SoundPool для воспроизведения аудио клипов в мое приложение. Все в порядке, но мне нужно знать, когда воспроизведение клипа закончится.

на данный момент я отслеживаю его в своем приложении, получая продолжительность каждого клипа с помощью медиаплеер экземпляра. Это отлично работает, но выглядит расточительно загружать каждый файл дважды, просто чтобы получить продолжительность. Я мог бы примерно рассчитать продолжительность, зная длину файла (доступного из AssetFileDescriptor) но мне все равно нужно знать частоту дискретизации и количество каналов.

Я вижу два возможных решения этой проблемы:

  1. выяснение того, когда клип закончил воспроизведение (не представляется возможным с SoundClip).
  2. наличие класса, который мог бы загрузить только заголовок аудиофайла и дать мне частоту дискретизации / количество каналов (и, в идеале, количество образцов, чтобы получить точное продолжительность.)

какие предложения?

спасибо, Макс!--4-->

код, который я использую на данный момент (отлично работает, но довольно тяжелый для этой цели):

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();
    // ...
}

отметим, что этот вопрос уже попросил, но не получил ответов.

3 ответов


вы пробовали это:

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

но я не совсем уверен, что это легче, чем существующий код.


попробовать 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;

}