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

sho*_*hox 6 php flv

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

Sir*_*ius 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];
Run Code Online (Sandbox Code Playgroud)

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

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


jmz*_*jmz 0

获取电影时长的计算大致如下:

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