Каков наилучший способ получить продолжительность аудиофайла в Android?
Я использую SoundPool для воспроизведения аудио клипов в мое приложение. Все в порядке, но мне нужно знать, когда воспроизведение клипа закончится.
на данный момент я отслеживаю его в своем приложении, получая продолжительность каждого клипа с помощью медиаплеер экземпляра. Это отлично работает, но выглядит расточительно загружать каждый файл дважды, просто чтобы получить продолжительность. Я мог бы примерно рассчитать продолжительность, зная длину файла (доступного из AssetFileDescriptor) но мне все равно нужно знать частоту дискретизации и количество каналов.
Я вижу два возможных решения этой проблемы:
- выяснение того, когда клип закончил воспроизведение (не представляется возможным с SoundClip).
- наличие класса, который мог бы загрузить только заголовок аудиофайла и дать мне частоту дискретизации / количество каналов (и, в идеале, количество образцов, чтобы получить точное продолжительность.)
какие предложения?
спасибо, Макс!--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;
}