首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > PHP >

哪位兄弟能帮忙注解一下这段程序?该怎么处理

2012-03-24 
哪位兄弟能帮忙注解一下这段程序?功能是取得flv视频的时间,是网上找的,但是很多地方不明白。。。PHP codefunc

哪位兄弟能帮忙注解一下这段程序?
功能是取得flv视频的时间,是网上找的,但是很多地方不明白。。。

PHP code
function BigEndian2Int($byte_word, $signed = false) {         $int_value = 0;        $byte_wordlen = strlen($byte_word);                for ($i = 0; $i < $byte_wordlen; $i++) {            $int_value += ord($byte_word{$i}) * pow(256, ($byte_wordlen - 1 - $i));        }                if ($signed) {            $sign_mask_bit = 0x80 << (8 * ($byte_wordlen - 1));            if ($int_value & $sign_mask_bit) {                $int_value = 0 - ($int_value & ($sign_mask_bit - 1));            }        }         return $int_value;} //获得视频的数字时间    function getTime($name){        if(!file_exists($name)){        return;    }    $flv_data_length=filesize($name);    $fp = @fopen($name, 'rb');    $flv_header = fread($fp, 5);    fseek($fp, 5, SEEK_SET);    $frame_size_data_length =BigEndian2Int(fread($fp, 4));    $flv_header_frame_length = 9;    if ($frame_size_data_length > $flv_header_frame_length) {       fseek($fp, $frame_size_data_length - $flv_header_frame_length, SEEK_CUR);    }    $duration = 0;    while ((ftell($fp) + 1) < $flv_data_length) {         $this_tag_header     = fread($fp, 16);         $data_length         = BigEndian2Int(substr($this_tag_header, 5, 3));         $timestamp           = BigEndian2Int(substr($this_tag_header, 8, 3));         $next_offset         = ftell($fp) - 1 + $data_length;         if ($timestamp > $duration) {          $duration = $timestamp;         }          fseek($fp, $next_offset, SEEK_SET);    }     fclose($fp);    return $duration;    }    //转化为0:03:56的时间格式    function fn($time){        $num = $time;        $sec = intval($num/1000);        $h = intval($sec/3600);        $m = intval(($sec%3600)/60);        $s = intval(($sec%60));        $tm = $h.':'.$m.':'.$s;        return $tm;         } $t = getTime("/tmp/907701336.flv");//显示数字时间如236722 echo fn($t);//显示时间格式0:03:56


对 BigEndian2Int这个函数看不懂,以及getTimes里面的一些数字 有什么意思?

[解决办法]
根据 FLV 文件格式的规定
FLV包括文件头(File Header)和文件体(File Body)两部分,其中文件体由一系列的Tag及Tag Size对组成。Tag包括Tag Header和Tag Data两部分。
Tag Header 的 
第5-7字节为UI24类型的值,表示该Tag的时间戳(单位为ms)
第8个字节为时间戳的扩展字节,当24位数值不够时,该字节作为最高位将时间戳扩展为32位值

只要将这一系列的时间戳加起来就得到了整个播放时间

UI24类型 占 3 个字节,高位在前
所以程序中有 
$int_value += ord($byte_word{$i}) * pow(256, ($byte_wordlen - 1 - $i));
这个写法很烂,还用到了 pow
你也可以修改他,基础算式
令传入串 $s,有 ( ord($s{0}) * 256 + ord($s{1}) ) * 256 + ord($s{2})

热点排行