Hi there,
ich hab mir das vor längerer Zeit in Quick&Dirtymodus geschrieben, bitte keine Kommentare bzgl. wie man das Coding hätte anders oder besser machen können, anyway, es funktioniert einfach...
function getFlvRatio($f)
{
if (! file_exists($f))
{
return false;
}
$fh=fopen($f,'r');
$header=fread($fh,2048);
$w=strpos($header,'width');
if ($w !== false)
{
$wString=substr($header,$w+7,4);
$width=chr_num(dechex(ord(substr($wString,0,1))),2).chr_num(dechex(ord(substr($wString,1,1))),2);
$h=strpos($header,'height');
$hString=substr($header,$h+8,4);
$height=chr_num(dechex(ord(substr($hString,0,1))),2).chr_num(dechex(ord(substr($hString,1,1))),2);
$wExp=hexdec(substr(chr_num(dec2hex(ord(substr($wString,0,1))),2),0,1))+1;
$wFaktor=pow(2,$wExp - 8);
$wA= pow(2,$wExp);
$wB= hexdec(substr($width,1,2)) * $wFaktor;
$hExp=hexdec(substr(chr_num(dec2hex(ord(substr($hString,0,1))),2),0,1))+1;
$hFaktor=pow(2,$hExp - 8);
$hA= pow(2,$hExp);
$hB= hexdec(substr($height,1,2)) * $hFaktor;
$flvD[0]=$wA+$wB;
$flvD[1]=$hA+$hB;
$flvD[2]=(($hA+$hB) != 0)?($wA+$wB)/($hA+$hB):0;
}
else
{
$flvD[0]=-1;
$flvD[1]=-1;
$flvD[2]=-1;
}
return $flvD;
// dazu noch 3 kleine Funktionen, die ich aus Faulheit gern verwende:
function dec2hex($_dec)
{
$_hex=dechex($_dec);
if (strlen($_hex) < 2)
{
$_hex="0".$_hex;
}
return $_hex;
}
function chr_num($v,$hm){
$lv=len($v);
return repl("0",$hm-$lv).$v;
}
function repl($_char,$_howmany){
$_tmpstr="";
for ($_i = 1;$_i <=$_howmany;$_i++){
$_tmpstr=$_tmpstr.$_char;
}
return $_tmpstr;
}
Rückgabe ist ein Array, [0]=width, [1]=height, [2]= ratio
kann man sicher optimieren, war mir aber wurscht, ich verwend' das seit einigen Jahren, hat bis jetzt immer funktionert...