ホームページ >バックエンド開発 >PHPチュートリアル >このプログラムの説明を手伝ってくれる兄弟は誰ですか?何をするか

このプログラムの説明を手伝ってくれる兄弟は誰ですか?何をするか

WBOY
WBOYオリジナル
2016-06-13 13:43:39821ブラウズ

このプログラムの説明を手伝ってくれる兄弟は誰ですか?
flvビデオの時間を取得する機能です。ネットで見つけたのですが、よくわからないところがあります。 。 。

PHP コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
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 にはファイル ヘッダーとファイル本体の 2 つの部分が含まれます。ファイル本体は一連のタグとタグ サイズのペアで構成されます。タグにはタグヘッダーとタグデータが含まれます。
タグヘッダの
5バイト目から7バイト目はタグのタイムスタンプを示すUI24型の値(単位はms)
8バイト目はタイムスタンプの拡張バイトで、ビット値が24の場合。十分ではない場合、このバイトはタイムスタンプを 32 ビット値に拡張するための最上位ビットとして使用されます

この一連のタイムスタンプが合計される限り、全体の再生時間が取得されます

UI24 タイプは 3 バイトを占め、上位ビットが最初です
したがって、プログラムは
$int_value += ord($byte_word{$i}) * pow(256, ($byte_wordlen - 1 - $i)); となります。
この書き方はひどいものです。pow
を使用することもできます。基本的な計算式
は ( ord($s{0}) ) として渡されます。 * 256 + ord($s{1} ) ) * 256 + ord($s{2})
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。