2011-06-02 97 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