2011-06-02 212 views
5

雖然我試圖獲得一個flv視頻文件的長度,我得到0秒,因爲它只發生在一些視頻,否則我的功能工作正常。得到flv視頻長度

下面是我的代碼。

<?php 
function mbmGetFLVDuration($file){ 
    // read file 
    if (file_exists($file)){ 
    $handle = fopen($file, "r"); 
    $contents = fread($handle, filesize($file)); 
    fclose($handle); 
    // 
    if (strlen($contents) > 3){ 
     if (substr($contents,0,3) == "FLV"){ 
     $taglen = hexdec(bin2hex(substr($contents,strlen($contents)-3))); 
     if (strlen($contents) > $taglen){ 
      $duration = hexdec(bin2hex(substr($contents,strlen($contents)-$taglen,3))) ; 
      return $duration; 
     } 
     } 
    } 
    } 
} 
// not working video file 
$result = ceil(mbmGetFLVDuration('not_working_copy.flv')/1000); 
// working video file 
//$result = ceil(mbmGetFLVDuration('working_copy.flv')/1000); 
echo date('H:i:s',mktime(0,0,$result)) 
?> 

我附上兩個工作和不工作的FLV視頻鏈接如下:

工作視頻: http://blog.developeronhire.com/wp-content/uploads/downloads/2011/06/working_copy.flv

不工作視頻: http://blog.developeronhire.com/wp-content/uploads/downloads/2011/06/not_working_copy.flv

任何想法將不勝感激。

謝謝

+0

可能的重複http://stackoverflow.com/questions/3282273/calculate-flv-video-file-length-using-pure-php – 2011-06-02 13:19:16

+0

@Mr。黑色:對不起,它沒有重複。請先閱讀我的問題並發表評論。 – Sujeet 2011-06-02 17:32:57

+1

工作在一個文件上而其他不工作,是爲獲取flv文件的視頻長度的重複問題? – 2011-06-03 04:07:01

回答

7

這種類型的問題時當視頻的元信息部分或全部被修復時。爲了解決這個問題,請使用FFMPEG commnad line工具來修復上傳時損壞的文件。下面是使用FFMPEG提取視頻持續時間的代碼片段。

<?php 
    ob_start(); 
    passthru("ffmpeg -i working_copy.flv 2>&1"); 
    $duration = ob_get_contents(); 
    $full = ob_get_contents(); 
    ob_end_clean(); 
    $search = "/duration.*?([0-9]{1,})/"; 
    print_r($duration); 
    $duration = preg_match($search, $duration, $matches, PREG_OFFSET_CAPTURE, 3); 
    print_r('<pre>'); 
print_r($matches[1][0]); 
print_r($full); 
?> 

下載FFMPEG去http://www.ffmpeg.org

0

您可以提取FLV視頻的元數據,你會發現所有像長度,大小等信息 見鏈接http://code.google.com/p/flv4php/ 好運sujeet

+0

但是,對於所有類型的視頻文件? – 2014-06-26 11:53:14

1

首先,我怕你的功能可能會停止在所有的工作,給予了足夠大的FLV視頻文件,並創下PHP的memory_limit的

$contents = fread($handle, filesize($file)); 

因爲你實際上將整個文件加載到內存中。

然後,非工作文件也似乎損壞了我。 flvmeta給出了下面的輸出:

$ flvmeta --check not_working_copy.flv 
0x00488473: error E30013: unknown tag type 250 
0x00488477: error E40023: timestamps are decreasing from 130543 to 0 
2 error(s), 0 warning(s) 

如果您需要有效地得到一個文件的持續時間可能已損壞,或含非標準標籤,我建議你使用MediaInfo,它在做了偉大的工作,處理即使是最奇特的視頻文件,而不會像ffmpeg那樣改變它們。

它可以從PHP等任何命令行程序被調用,並經由命令行參數輸出控制:

$ MediaInfo --Inform="Video;%Duration%" not_working_copy.flv 
130000 

,其顯示以毫秒爲單位的視頻持續時間。

+0

很感謝時間。雅你的解決方案正常工作。再次感謝你 – Sujeet 2011-06-15 04:00:05