get duration of audio file

后端 未结 10 1121
生来不讨喜
生来不讨喜 2020-12-07 19:15

I have made a voice recorder app, and I want to show the duration of the recordings in a listview. I save the recordings like this:

MediaRecorder recorder =          


        
相关标签:
10条回答
  • 2020-12-07 19:27

    If the audio is from url, just wait for on prepared:

    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                 length = mp.getDuration();
            }
    });
    
    0 讨论(0)
  • 2020-12-07 19:28

    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;
    
    0 讨论(0)
  • 2020-12-07 19:33

    It's simply. use RandomAccessFile Below is the code snippet to do so

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

    You can, of course, be more complete depending on your needs

    0 讨论(0)
  • 2020-12-07 19:37

    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;
            }
    
    0 讨论(0)
  • 2020-12-07 19:40

    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);
    
    0 讨论(0)
  • 2020-12-07 19:42

    Kotlin Extension Solution

    You can add this to reliably and safely get your audio file's duration. If it doesn't exist or there is an error, you'll get back 0.

    myAudioFile.getMediaDuration(context)
    
    /**
     * If file is a Video or Audio file, return the duration of the content in ms
     */
    fun File.getMediaDuration(context: Context): Long {
        if (!exists()) return 0
        val retriever = MediaMetadataRetriever()
        return try {
            retriever.setDataSource(context, uri)
            val duration = retriever.extractMetadata(METADATA_KEY_DURATION)
            retriever.release()
            duration.toLongOrNull() ?: 0
        } catch (exception: Exception) {
            0
        }
    }
    

    If you are regularly working with String or Uri for files, I'd suggest also adding these useful helpers

    fun Uri.asFile(): File = File(toString())
    
    fun String?.asUri(): Uri? {
        try {
            return Uri.parse(this)
        } catch (e: Exception) {
            Sentry.captureException(e)
        }
        return null
    }
    
    fun String.asFile() = File(this)
    
    0 讨论(0)
提交回复
热议问题