如何在无外部软件的情况下用PHP获取HTML5视频观看时长并存入变量
嘿,这个问题我熟!要在PHP里不依赖任何外部软件获取视频时长,核心在于解析视频文件的元数据——毕竟PHP本身没有原生的视频处理函数,所以我们得靠纯PHP编写的库来搞定,这里首推getID3,它完全不需要安装FFmpeg这类外部工具,直接用PHP代码就能解析几乎所有常见的视频格式,完美符合你的需求。
下面是具体的实现步骤:
1. 准备getID3库
你可以找到纯PHP版本的getID3库,把它的核心文件(一般是getid3.php和相关子目录)放到你的项目目录里,不需要额外配置服务器。
2. 编写PHP代码获取视频总时长
注意:这里要使用服务器上的本地文件路径,而不是你HTML里带#t=00:00:00的URL——因为#t是浏览器端的锚点参数,服务器根本拿不到这个部分,我们得直接读取视频文件本身的元数据:
// 引入getID3的核心文件,路径根据你的实际情况调整 require_once('getid3/getid3.php'); // 初始化getID3对象 $getID3 = new getID3(); // 分析视频文件(替换成你服务器上a.mp4的真实路径) $videoFile = '/path/to/your/a.mp4'; $fileMetadata = $getID3->analyze($videoFile); // 提取并存储时长到PHP变量 if (isset($fileMetadata['playtime_seconds'])) { // 原始时长是秒数,比如123.45秒 $videoTotalDuration = $fileMetadata['playtime_seconds']; // 如果你需要转换成时分秒格式的字符串,也可以这样处理 $hours = floor($videoTotalDuration / 3600); $minutes = floor(($videoTotalDuration % 3600) / 60); $seconds = floor($videoTotalDuration % 60); $formattedDuration = sprintf('%02d:%02d:%02d', $hours, $minutes, $seconds); echo "视频总时长:{$formattedDuration}"; } else { echo "无法获取视频时长,请检查文件是否存在、路径是否正确,或者格式是否被支持。"; }
3. 如果你需要获取URL中#t指定的片段时长
你的HTML里的视频URL带了#t=00:00:00,这是指定视频从0秒开始播放。如果你的需求是获取这个播放片段的时长(比如从指定时间到视频结尾的时长),可以手动解析这个锚点参数,再和总时长计算差值:
$videoUrl = 'a.mp4#t=00:00:00'; // 分割URL和锚点部分 list($filePath, $anchorParam) = explode('#', $videoUrl, 2); $startTime = 0; $endTime = $videoTotalDuration; // 默认到视频结尾 // 解析锚点里的时间参数 if ($anchorParam && str_starts_with($anchorParam, 't=')) { $timeString = substr($anchorParam, 2); // 处理两种情况:t=00:00:10(仅开始时间) 或者 t=00:00:10,00:00:30(开始+结束时间) $timeSegments = explode(',', $timeString); // 解析开始时间 if (!empty($timeSegments[0])) { $startParts = explode(':', $timeSegments[0]); if (count($startParts) === 3) { $startTime = ($startParts[0] * 3600) + ($startParts[1] * 60) + (float)$startParts[2]; } elseif (count($startParts) === 2) { $startTime = ($startParts[0] * 60) + (float)$startParts[1]; } else { $startTime = (float)$startParts[0]; } } // 解析结束时间(如果有的话) if (isset($timeSegments[1]) && !empty($timeSegments[1])) { $endParts = explode(':', $timeSegments[1]); if (count($endParts) === 3) { $endTime = ($endParts[0] * 3600) + ($endParts[1] * 60) + (float)$endParts[2]; } elseif (count($endParts) === 2) { $endTime = ($endParts[0] * 60) + (float)$endParts[1]; } else { $endTime = (float)$endParts[0]; } } // 计算片段时长,确保不会出现负数 $segmentDuration = max(0, $endTime - $startTime); echo "播放片段时长:{$segmentDuration} 秒"; }
一些注意事项
- 确保PHP进程有读取视频文件的权限(可以给文件设置合适的
chmod权限) - getID3支持MP4、AVI、MKV等绝大多数常见视频格式,兼容性很强
- 如果你的服务器上无法使用第三方库,那几乎没有纯原生PHP的方案能解析视频时长——因为视频元数据的解析逻辑很复杂,原生PHP没有封装这类功能。
内容的提问来源于stack exchange,提问作者Kiran Chandrasekhar
相关产品推荐
相关产品推荐

