Jump to content

Converter [HH:]MM:SS para segundos


I-NOZex
 Share

Recommended Posts

Bem, tenho aqui esta função que alem de outras operações efetua a conversão de uma variavel de tempo em MM:SS ou HH:MM:SS para segundos.

Isto funciona à parte, mas no sitio onde deverá ficar, nao está a funcionar a parte de conversao...

public function getKbps($size,$length){
	$size = floatval($size);
	if (bccomp('1', $size, 2) == false)
		return 0;
	//MB to KB
	$bytes = floatval($size) * 1024 * 1024;
	//KB to bits
	$bits = $bytes * 8;
	unset($bytes);
	//(HH:)MM:SS to seconds
	//$length = preg_replace("/^([\d]{1,2})\ [\d]{2})$/", "00:$1:$2", $length);
	$length = $this->parseLength($length);
	$length = date_parse($length);
	$seconds = $length['hour'] * 3600 + $length['minute'] * 60 + $length['second'];
	//sscanf($length, "%d:%d:%d", $hours, $minutes, $seconds);
	//$seconds = $hours * 3600 + $minutes * 60 + $seconds;
	if ($seconds < 60)
		return 0;
	die($seconds);
	unset($length);
	//Calculate kbits per second
	$kbps = $bits / $seconds;
	unset($bits,$seconds);
	//Calculate KBytes per second
	$kbps = ceil($kbps / 1000);
	die($kbps);
	//Get common valid Kbps
	$commonKbps = array(128,160,192,224,256,320);
	foreach ($commonKbps as $v)
		if ((($kbps - $v) < 16) || (($kbps - $v) <= -16))
			return $v;
	return $kbps;
}

as linhas onde o erro está, estao assinaladas... alguem consegue detetar qual é o erro?

se repararem tem 2 linhas comentadas, que era a forma que eu inicialmente estava a fazer, vi essa alternativa, mas continua sem funcionar :/

deixo aqui a baixo uma funçao helper que faz a devida conversao para HH:MM:SS

public function parseLength($length){
	$length = preg_replace("/^([\d]{1,2})\ [\d]{2})$/", "00:$1:$2", $length);
	sscanf($length, "%d:%d:%d");
	return  date('H:i:s',strtotime($length));
}

obrigado!

edit: estava a usar o valor de teste 11:11:11

edit2: andei a ver melhor e o erro não está na conversão do tempo...

a funçao em si é que não está a funcionar correctamente... basicamente calcula o possivel bitrate de um ficheiro mp3 com base na duraçao e tamanho, retornando o bitrate mais proximo de um dos comuns (128,256...)

alguem consegue ajudar? :| isto já funcionou, e agora que voltei a pegar nisto, nao está a dar :S

eu tou a testar com size = 111.11 (mb) length = 11:11:11

thks

Edited by I-NOZex

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net
Link to comment
Share on other sites

sim fui eu

eu ja vi que o erro não está ali, nao é nessa parte...

tou aqui a testar as 2 funçoes a parte

<?php
 function getKbps($size,$length){
	$size = floatval($size);
	if (bccomp('1', $size, 2) == false)
		return 0;
	//MB to KB
	$bytes = floatval($size) * 1024 * 1024;
	//KB to bits
	$bits = $bytes * 8;
	unset($bytes);
	//(HH:)MM:SS to seconds
	//$length = preg_replace("/^([\d]{1,2})\ [\d]{2})$/", "00:$1:$2", $length);
	$length = parseLength($length);
	//$length = date_parse($length);
	//$seconds = $length['hour'] * 3600 + $length['minute'] * 60 + $length['second'];
	sscanf($length, "%d:%d:%d", $hours, $minutes, $seconds);
	$seconds = $hours * 3600 + $minutes * 60 + $seconds;
	if ($seconds < 60)
		return 0;
	//die(var_dump($seconds));
	unset($length);
	//Calculate kbits per second
	$kbps = $bits / $seconds;
	unset($bits,$seconds);
	//die(var_dump($kbps));
	//Calculate KBytes per second
	$kbps = ceil($kbps / 1000);
	//var_dump($kbps);
	//Get common valid Kbps
	$commonKbps = array(128,160,192,224,256,320);
	foreach ($commonKbps as $v)
		if ((($kbps - $v) < 16) || (($kbps - $v) <= -16))
			return $v;
	return $kbps;
}
 function parseLength($length){
	$length = preg_replace("/^([\d]{1,2})\ [\d]{2})$/", "00:$1:$2", $length);
	sscanf($length, "%d:%d:%d");
	return  date('H:i:s',strtotime($length));
}
$size = '111.11';
$length = '11:11:11';
echo getKbps($size,$length);
?>

era suposto retornar 24, mas retorna 128...

ele não está a respeitar a condiçao do ultimo if... alias, está a entrar nele, onde simplesmente deveria ir para o ultimo return...

mas na classe onde tenho estas funçoes, ele nem retorna nada :S

edit: resolvido, burrice minha

pois claro que 24-128 dá um numero negativo, e sendo negativo obvio que é menor q 16 e -16...

resolvi assim:

if (($kbps > 127) && ((($kbps - $v) < 16) || (($kbps - $v) <= -16)))

alguma sugestão sobre uma forma mais correcta de resolver? 🙂

reedit: na class é que continua sem funcionar D:

isto ta tudo marado :||

Edited by I-NOZex

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net
Link to comment
Share on other sites

pelo que percebi será isto que pretendes ...

<?php
function getKbps($size, $length, $step = 32, $max = 320){
 $size = floatval($size);
 if (bccomp('1', $size, 2) == false)
   return 0;
 $bits = floatval($size) * 1024 * 1024 * 8;

 sscanf(parseLength($length), "%d:%d:%d", $hours, $minutes, $seconds);
 $seconds = $hours * 3600 + $minutes * 60 + $seconds;
 if ($seconds < 60)
   return 0;

 $kbps = (int)($bits / $seconds / 1000);

 if ($kbps < $step)
   return "< ".$step;
 else if ($kbps >= $max)
   return "> ".$max;
 else
   return ((int)($kbps / $step)) * ($step + 1);
}

function parseLength($length){
 $length = preg_replace("/^([\d]{1,2})\ [\d]{2})$/", "00:$1:$2", $length);
 sscanf($length, "%d:%d:%d");
 return  date('H:i:s',strtotime($length));
}

$size = '111.11';
$length = '11:11:11';
echo getKbps($size,$length)."Kbps\n";
?>

caso queiras que o valor resultante esteja "mais aproximado do valor real", talvez este código seja melhor:

 if ($kbps < $step)
   return "< ".$step;
 else if ($kbps >= $max)
   return "> ".$max;
 else
   foreach (range($step, $max, $step) as $val) {
     if ($kbps >= $val - ($step / 2) && $kbps <= $val + ($step / 2))
       return $val;
   }
}
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.