Каков наилучший способ получить продолжительность аудиофайла в Android? - PullRequest
11 голосов
/ 17 января 2011

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

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

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

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

Есть предложения?

Спасибо, Max

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

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 ]

12 голосов
/ 16 июля 2014

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

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

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

3 голосов
/ 17 июля 2014

Попробуйте 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();
0 голосов
/ 17 августа 2017

это работа для меня, чтобы получить длительность аудио файла активов в общем количестве секунд =====>

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;

}
...