How to get the size and duration of an mp3 file?

Viewed 24503

I need to calculate the total length of an mp3 file.

Currently I am using a PHP class which I found @ http://www.zedwood.com/article/php-calculate-duration-of-mp3.

This is working perfectly if the mp3 file in same server.

but if I have a URL from other site it throwing error. Please help me.

Is there any JavaScript J-Query function to get the length of the mp3 file

<?php include("mp3.class.php");
$f = 'http://cdn.enjoypur.vc/upload_file/5570/5738/5739/7924/Blue%20Eyes%20-%20Yo%20Yo%20Honey%20Singh%20(PagalWorld.com)%20-192Kbps%20.mp3';
$m = new mp3file($f);
$a = $m->get_metadata();

if ($a['Encoding']=='Unknown')
    echo "?";
else if ($a['Encoding']=='VBR')
    print_r($a);
else if ($a['Encoding']=='CBR')
    print_r($a);
unset($a);
?>
6 Answers

Here's how you can get mp3 duration using Web Audio API:

const mp3file = 'https://raw.githubusercontent.com/prof3ssorSt3v3/media-sample-files/master/doorbell.mp3'
const audioContext = new (window.AudioContext || window.webkitAudioContext)()
const request = new XMLHttpRequest()
request.open('GET', mp3file, true)
request.responseType = 'arraybuffer'
request.onload = function() {
    audioContext.decodeAudioData(request.response,
        function(buffer) {
            let duration = buffer.duration
            console.log(duration)
            document.write(duration)
        }
    )
}
request.send()

Perhaps the simplest solution is to use the audio html element to get the time duration and to obtain the size directly from the file returned by the FileReader object. A code example of this approach is shown below.

One down side of this and all the other solutions presented so far is the 10-20 second delay it takes for the audio tag's durationchanged event to fire when loading large, eg > 200MB files. Clearly there is a faster way to get this info because the duration is shown immediately when the file is entered into the browser as a file:///.... URL.

function checkMp3SizeAndDuration()
{    
    var files = document.getElementById('upload-file').files;
    var file = files[0];
    if (file.size > MAX_FILE_SIZE) {
        return;
    }

    var reader = new FileReader();
    var audio = document.createElement('audio');
    reader.onload = function (e) {
        audio.src = e.target.result
        audio.addEventListener('durationchange', function() {
            console.log("durationchange: " + audio.duration);
        },false);

        audio.addEventListener('onerror', function() {
            alert("Cannot get duration of this file.");
        }, false);
    };
    reader.readAsDataURL(file);
});

Having not been able to find something that was fast and didn't require a bunch of extra boilerplate code, I tweaked an existing server side javascript utility to run directly in the browser. Demo code is available at: https://github.com/eric-gilbertson/fast-mp3-duration

Related