得到flv视频长度

时间:2011-06-02 13:09:19

标签: php video flv

虽然我试图获取一个flv视频文件的长度,我得到0秒,因为它只发生在一些视频,否则我的功能正常。

下面是我的代码。

<?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

任何想法都将受到赞赏。

谢谢

3 个答案:

答案 0 :(得分:7)

当视频的元信息被部分或完全取消时,会出现此类问题。要解决此问题,请使用FFMPEG commnad行工具在上载时修复此类损坏的文件。以下是使用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

答案 1 :(得分: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

以毫秒为单位显示视频持续时间。

答案 2 :(得分:0)

你可以提取flv视频的元数据,你会发现所有的信息,如长度,大小等。 请参见链接http://code.google.com/p/flv4php/ 祝你好运