MediaMetadataRetriever
- это легкий и эффективный способ сделать это. MediaPlayer
слишком тяжелый и может вызвать проблемы с производительностью в высокопроизводительной среде, такой как прокрутка, разбиение по страницам, листинг и т. Д.
Кроме того, Error (100,0)
может произойти на MediaPlayer
, так как это тяжелый и иногда перезапуск необходимо делать снова и снова.
Uri uri = Uri.parse(pathStr);
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(AppContext.getAppContext(),uri);
String durationStr = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
int millSecond = Integer.parseInt(durationStr);
Или попробуйте это, чтобы получить длительность в миллисекундах:
MediaPlayer mp = MediaPlayer.create(yourActivity, Uri.parse(pathofyourrecording));
int duration = mp.getDuration();
Или измерьте время, прошедшее с recorder.start()
до recorder.stop()
в наносекундах:
long startTime = System.nanoTime();
// ... do recording ...
long estimatedTime = System.nanoTime() - startTime;
После того, как вы напишите файл, откройте его в MediaPlayer и вызовите getDuration для него.
Попробуйте использовать
long totalDuration = mediaPlayer.getDuration(); // to get total duration in milliseconds
long currentDuration = mediaPlayer.getCurrentPosition(); // to Gets the current playback position in milliseconds
Деление на 1000, чтобы преобразовать в секунды.
Надеюсь, это помогло вам.
Если звук взят из URL, просто дождитесь готового:
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
length = mp.getDuration();
}
});
Вы смотрели на Ringdroid ?. Это довольно легкий вес и интеграция проста. Он также хорошо работает с медиа-файлами VBR.
Если у вас возникли проблемы с продолжительностью, вы можете сделать что-то вроде ниже, используя Ringdroid.
public class AudioUtils
{
public static long getDuration(CheapSoundFile cheapSoundFile)
{
if( cheapSoundFile == null)
return -1;
int sampleRate = cheapSoundFile.getSampleRate();
int samplesPerFrame = cheapSoundFile.getSamplesPerFrame();
int frames = cheapSoundFile.getNumFrames();
cheapSoundFile = null;
return 1000 * ( frames * samplesPerFrame) / sampleRate;
}
public static long getDuration(String mediaPath)
{
if( mediaPath != null && mediaPath.length() > 0)
try
{
return getDuration(CheapSoundFile.create(mediaPath, null));
}catch (FileNotFoundException e){}
catch (IOException e){}
return -1;
}
}
Надеюсь, что помогает
Это просто. используйте RandomAccessFile
Ниже приведен фрагмент кода для этого
public static int getAudioInfo(File file) {
try {
byte header[] = new byte[12];
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r");
randomAccessFile.readFully(header, 0, 8);
randomAccessFile.close();
return (int) file.length() /1000;
} catch (Exception e) {
return 0;
}
}
Вы, конечно, можете быть более полным в зависимости от ваших потребностей
Самый быстрый способ сделать это через MediaMetadataRetriever
. Однако есть ловушка
, если вы используете URI и контекст для установки источника данных, вы можете столкнуться с ошибкой https://code.google.com/p/ android / questions / detail? id = 35794
Решение - использовать абсолютный путь к файлу для получения метаданных медиа-файла.
Ниже приведен фрагмент кода, чтобы сделать это
private static String getDuration(File file) {
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource(file.getAbsolutePath());
String durationStr = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
return Utils.formateMilliSeccond(Long.parseLong(durationStr));
}
Теперь вы можете преобразовать миллисекунды в удобочитаемый формат, используя любой из следующих форматов
/**
* Function to convert milliseconds time to
* Timer Format
* Hours:Minutes:Seconds
*/
public static String formateMilliSeccond(long milliseconds) {
String finalTimerString = "";
String secondsString = "";
// Convert total duration into time
int hours = (int) (milliseconds / (1000 * 60 * 60));
int minutes = (int) (milliseconds % (1000 * 60 * 60)) / (1000 * 60);
int seconds = (int) ((milliseconds % (1000 * 60 * 60)) % (1000 * 60) / 1000);
// Add hours if there
if (hours > 0) {
finalTimerString = hours + ":";
}
// Prepending 0 to seconds if it is one digit
if (seconds < 10) {
secondsString = "0" + seconds;
} else {
secondsString = "" + seconds;
}
finalTimerString = finalTimerString + minutes + ":" + secondsString;
// return String.format("%02d Min, %02d Sec",
// TimeUnit.MILLISECONDS.toMinutes(milliseconds),
// TimeUnit.MILLISECONDS.toSeconds(milliseconds) -
// TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)));
// return timer string
return finalTimerString;
}