Converting MP3 duration time

994 Views Asked by At

I'm using my iTunes library to get data from about 1,100 mp3s and I'm running into a small issue in getting the duration of the library into minutes and seconds.

$duration = 1893642;
$minutes = bcmod(($duration / 60), 60);
$seconds = bcmod($duration, 60);
echo $minutes.":".$seconds; //returns 0:42

The problem is that this specific MP3 is actually 31:42. Any thoughts on why this isn't working?

4

There are 4 best solutions below

4
On BEST ANSWER
$minutes = bcmod(($duration / 60), 60);

is taking the minutes modulo 60. Unless your track is over an hour it will always say 0. You want it to be

$minutes = floor($duration / 60);
0
On

Try this function

function formatTime($secs) {
    $times = array(3600, 60, 1);
    $time = '';
    $tmp = '';
    for($i = 0; $i < 3; $i++) {
        $tmp = floor($secs / $times[$i]);
        if($tmp < 1) {
            $tmp = '00';
        }
        elseif($tmp < 10) {
            $tmp = '0' . $tmp;
        }
        $time .= $tmp;
        if($i < 2) {
            $time .= ':';
        }
        $secs = $secs % $times[$i];
    }
    return $time;
}
0
On
$duration_str = sprintf('%s:%02s:%02s',
 floor($duration_int / 3600), // hours
 floor($duration_int / 60) - floor($duration_int / 3600) * 60, // minutes
 $duration_int % 60); // seconds

The *printf functions provide formatting. In this case the leading zero.

The minutes line is the most complex part, since you have to calculate the hours (duration [s] / 3600 [s/h]), then round down to integer (floor()), then multiply with 60 to transform to minutes, then subtract that from the total number of minutes (duration [s] / 60 [s/m]).

If your durations are shorter than an hour, the code is much simpler:

$duration_str = sprintf('%s:%02s', floor($duration_int / 60), $duration_int % 60);

The result is still correct for a duration greater than 59 minutes, but just not as readable (31560 minutes in the example).

2
On

Not sure if the following function was available when this question was written, but as it's a question I've been asking myself so here goes.

I used the answer above:

$seconds = bcmod($row{'playtime_seconds'}, 60);
$minutes = floor($row{'playtime_seconds'} / 60);
$hours = floor($minutes / 60);

Which works for the majority of times, but there is no padding - so you can end up with 20:1 when it should be 20:01 - and it's not to good over an hour - one length comes in at length="1:70:9" - so an alternative is to use the "date" function.

<?=date("H:i:s", $duration); ?>

which returns 00:31:42 from that number of seconds