有一种不太复杂的方法可以做到这一点。
FLV 文件具有特定的数据结构,允许以相反的顺序对其进行解析,前提是文件格式正确。
只需 fopen 文件并在文件末尾前查找 4 个字节。
您将获得一个大端的 32 位值,该值表示这些字节之前的标记大小(FLV 文件由标记组成)。您可以将unpack 函数与“N”格式规范一起使用。
然后,您可以回溯到刚刚找到的字节数,引导您找到文件中最后一个标记的开头。
标签包含以下字段:
- 一个字节表示标签的类型
- 一个大端 24 位整数,表示此标签的正文长度(应该是您之前找到的值,减去 11...如果不是,那么有问题)
- 一个大端 24 位整数,表示文件中标签的时间戳,以毫秒为单位,加上一个 8 位整数,将时间戳扩展到 32 位。
所以你所要做的就是跳过前 32 位,然后 unpack('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 可以分解,但为了清楚起见,我将它们都保留了。
编辑:经过一些测试修复了代码