получить продолжительность аудио файла

23
задан Simon 13 March 2013 в 19:48
поделиться

8 ответов

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);
65
ответ дан Vasily Kabunov 13 March 2013 в 19:48
поделиться

Или попробуйте это, чтобы получить длительность в миллисекундах:

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;
22
ответ дан Erol 13 March 2013 в 19:48
поделиться

После того, как вы напишите файл, откройте его в MediaPlayer и вызовите getDuration для него.

0
ответ дан Gabe Sechan 13 March 2013 в 19:48
поделиться

Попробуйте использовать

long totalDuration = mediaPlayer.getDuration(); // to get total duration in milliseconds

long currentDuration = mediaPlayer.getCurrentPosition(); // to Gets the current playback position in milliseconds

Деление на 1000, чтобы преобразовать в секунды.

Надеюсь, это помогло вам.

13
ответ дан AwadKab 13 March 2013 в 19:48
поделиться

Если звук взят из URL, просто дождитесь готового:

mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
             length = mp.getDuration();
        }
});
0
ответ дан Pablo Cegarra 13 March 2013 в 19:48
поделиться

Вы смотрели на 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;
    }
}

Надеюсь, что помогает

0
ответ дан Pawan Kumar 13 March 2013 в 19:48
поделиться

Это просто. используйте 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;
    }
}

Вы, конечно, можете быть более полным в зависимости от ваших потребностей

-1
ответ дан Iman Marashi 13 March 2013 в 19:48
поделиться

Самый быстрый способ сделать это через 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;
        }
11
ответ дан Hitesh Sahu 13 March 2013 в 19:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: