计算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的主要内容,如果未能解决你的问题,请参考以下文章