位置:首页 > PHP > PHP框架中如何拼接视频流地址与HLS切片路径

PHP框架中如何拼接视频流地址与HLS切片路径

时间:2026-08-15  |  作者:云端旅人  |  阅读:0

必须严格按服务器真实目录结构拼接HLS地址。先确认m3u8文件名及ts路径层级,再通过配置域名+动态ID生成m3u8 URL;ts切片URL需基于m3u8解析或Redis预存序号构造,并添加时间戳防CDN缓存。

PHP框架怎么拼接视频流地址?HLS切片路径

要在PHP框架中动态拼接HLS视频流地址,如m3u8主播放文件及对应ts切片路径,必须严格遵循HTTP协议路径结构、时间戳/序列号规则和服务器真实文件布局。

否则,前端播放器会404或中断加载。

确认HLS服务端目录结构

先登录服务器,进入 Web 根目录,如/var/www/html/video,把实际文件结构核对清楚。

正常情况下,应为 stream.m3u8 配合 ts/ 子目录。目录里再放像 chunk-00001.ts 这类按序号排列的分片文件。

如果实际结构是hls/20240520/abc/这种多层嵌套,那么路径拼接逻辑就必须一层不差地对应。

【只要路径对不上,所有 ts 请求都会直接返回 404】

可用ls -l验证是否存在index.m3u8playlist.m3u8

不同CDN或编码器生成的主文件名可能不同,不能硬编码为stream.m3u8

在Lara vel中生成m3u8完整URL

生成m3u8完整URL时,可按以下步骤处理:

  • 第一步:在控制器中获取视频唯一标识,如$videoId = 'vid_7a9b2c'
  • 第二步:调用配置中心读取HLS基础域名,如config('cdn.hls_domain'),值为https://hls.example.com
  • 第三步:拼接路径:$m3u8Url = $cdnDomain . '/streams/' . $videoId . '/index.m3u8';
  • 第四步:直接返回该字符串给前端,不要加任何额外前缀或重写逻辑。

【CDN回源路径必须与Nginx location规则严格一致,否则m3u8文件本身都拉不到】

动态构造ts切片URL(含时间戳参数)

方法一:基于m3u8内容解析后拼接

file_get_contents($m3u8Url)拉取m3u8原始内容,正则提取所有chunk-*.ts行。

对每行匹配到的chunk-00123.ts,用str_replace('chunk-', '', $tsName)得到数字123。

再按规则补零,并拼成https://hls.example.com/streams/vid_7a9b2c/ts/chunk-00123.tsts=1716234567

其中ts=参数为当前Unix时间戳,这是防止CDN缓存旧切片的关键手段。

方法二:服务端预生成切片路径数组

在推流开始时,PHP监听FFmpeg输出日志,或通过Redis队列接收切片生成事件。

然后实时存入hls_chunks:vid_7a9b2c有序集合,score为切片序号,value为不含扩展名的文件名,如chunk-00123

前端请求时,用ZRANGE hls_chunks:vid_7a9b2c 0 -1取出全部key,再逐个拼接完整URL。

这比实时解析m3u8更稳定,避免网络抖动导致内容读取失败。

ThinkPHP中处理相对路径转绝对路径

如果 m3u8 里写的是 ./ts/chunk-00001.ts 这种相对路径,处理时不能直接拿来用。

应先通过 parse_url($m3u8Url) 拆出 scheme、host 以及 path 的父级目录。

接着再用 dirname($parsed['path']) 取到 /streams/vid_7a9b2c

最后配合 ltrim($relativeTsPath, './') 把开头的点号去掉,再拼成 $baseUrl . '/' . $cleanPath,这样地址才完整。

注意:不能直接用realpath()public_path(),因为HLS资源通常不在PHP项目目录下,而是在独立静态文件服务器上。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多