计算flv视频文件长度?使用纯PHP

时间:2010-07-19 15:04:16

标签: php flv

使用带有外部依赖关系(如ffmpege)的php来计算flv文件长度的最佳方法是什么,因为客户端站点在共享主机上运行,  itry http://code.google.com/p/flv4php/,但它提取元数据而不是所有视频都包含元数据?

2 个答案:

答案 0 :(得分:7)

这样做的方法并不太复杂。

FLV文件具有特定的数据结构,允许以相反的顺序对它们进行解析,假设文件格式正确。

只需打开文件并在文件结束前搜索4个字节。

您将获得一个大端32位值,表示在这些字节之前标记的大小(FLV文件由标记组成)。您可以将unpack函数与'N'格式规范一起使用。

然后,您可以找回刚刚找到的字节数,从而引导您到文件中最后一个标记的开头。

标记包含以下字段:

  • 一个字节表示标签的类型
  • 一个大端24位整数,表示此标签的主体长度(应该是您之前找到的值,减去11 ......如果没有,则表示出现问题)
  • 一个大端24位整数,表示文件中标记的时间戳,以毫秒为单位,加上一个8位整数,将时间戳扩展为32位。

所以你要做的就是跳过前32位,并解压缩('N',...)你读到的时间戳值。

由于FLV标签的持续时间通常非常短,因此应该为文件提供相当准确的持续时间。

以下是一些示例代码:

$flv = fopen("flvfile.flv", "rb");
fseek($flv, -4, SEEK_END);
$arr = unpack('N', fread($flv, 4));
$last_tag_offset = $arr[1];
fseek($flv, -($last_tag_offset + 4), SEEK_END);
fseek($flv, 4, SEEK_CUR);
$t0 = fread($flv, 3);
$t1 = fread($flv, 1);
$arr = unpack('N', $t1 . $t0);
$milliseconds_duration = $arr[1];

最后两个fseek可以被分解,但为了清楚起见,我把它们都留下了。

编辑:修复了一些测试后的代码

答案 1 :(得分:0)

获得电影持续时间的计算大致如下:

size of file in bytes / (bitrate in kilobits per second / 8)