Ben
Ben

Reputation: 62384

Converting MP3 duration time

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?

Upvotes: 2

Views: 1020

Answers (4)

Alien426
Alien426

Reputation: 1267

$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).

Upvotes: 0

Phil
Phil

Reputation: 103

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

Upvotes: 1

Wasim Karani
Wasim Karani

Reputation: 8886

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

Upvotes: 2

Jacob Courtneay
Jacob Courtneay

Reputation: 118

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

Upvotes: 5

Related Questions