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

Posted

技术标签:

【中文标题】计算flv视频文件长度?使用纯 php【英文标题】:calculate flv video file length ? using pure php 【发布时间】:2011-03-17 23:20:00 【问题描述】:

什么是使用 php 计算 flv 文件长度的最佳方法,没有像 ffmpege 这样的外部依赖项,因为客户端站点在共享主机上运行, itry http://code.google.com/p/flv4php/,但它提取元数据并且并非所有视频都包含元数据?

【问题讨论】:

你的意思是视频长度(分钟/秒)吗? 规范在这里:adobe.com/devnet/flv/pdf/video_file_format_spec_v10.pdf 不可撤销地涉过它,但不是微不足道的任务。 这不是一项简单的任务,我会继续努力,但我的期限很紧迫:S,我正在寻找已经使用过的解决方案? 【参考方案1】:

获取电影时长的计算大致是这样的:

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

【讨论】:

大多数文件在其元数据中不包含比特率,以及提取比特日期的其他方式?【参考方案2】:

有一种不太复杂的方法可以做到这一点。

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 可以分解,但为了清楚起见,我将它们都保留了。

编辑:经过一些测试修复了代码

【讨论】:

以上是关于计算flv视频文件长度?使用纯 php的主要内容,如果未能解决你的问题,请参考以下文章

使用PHP将视频文件转换为mp4、flv、webgl、webm、ogv等

vue中播放flv格式视频(b站flv.js的使用)

如何在 HTML 视频标签中播放 FLV 视频?

使用flv.js实现html5播放flv格式视频文件

前端页面播放 rtmp 流与 flv 格式视频文件

winform中如何播放flv视频?