get duration of audio file get duration of audio file android android

get duration of audio file


MediaMetadataRetriever is a lightweight and efficient way to do this. MediaPlayer is too heavy and could arise performance issue in high performance environment like scrolling, paging, listing, etc.

Furthermore, Error (100,0) could happen on MediaPlayer since it's a heavy and sometimes restart needs to be done again and again.

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


The quickest way to do is via MediaMetadataRetriever. However, there is a catch

if you use URI and context to set data source you might encounter bug https://code.google.com/p/android/issues/detail?id=35794

Solution is use absolute path of file to retrieve metadata of media file.

Below is the code snippet to do so

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

Now you can convert millisecond to human readable format using either of below formats

     /**         * 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;        }


Either try this to get duration in milliseconds:

MediaPlayer mp = MediaPlayer.create(yourActivity, Uri.parse(pathofyourrecording));int duration = mp.getDuration();

Or measure the time elapsed from recorder.start() till recorder.stop() in nanoseconds:

long startTime = System.nanoTime();    // ... do recording ...    long estimatedTime = System.nanoTime() - startTime;