You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于C++实现HLS视频流服务与浏览器交互

HLS直播服务器与浏览器交互全流程解析

针对你的疑问逐一解答

1. 视频分割后的后续步骤

服务器完成视频分片切割后,核心是维护动态更新的媒体M3U8文件,具体流程:

  • 实时将捕获/编码的视频流按固定时长(1-10秒,推荐5秒)切割为TS格式分片(HLS标准容器,兼容性最优),分片命名需遵循规律(如live_001.ts、live_002.ts递增序号,或带时间戳)。
  • 生成并持续更新媒体M3U8:写入基础头部(#EXTM3U、#EXT-X-VERSION、#EXT-X-TARGETDURATION指定最大分片时长),每新增一个分片,就将其URL、时长追加到M3U8中;同时移除最早的若干分片条目(避免M3U8过长),并同步更新#EXT-X-MEDIA-SEQUENCE(当前有效分片的起始序号)。
  • 确保M3U8文件的HTTP响应头设置Cache-Control: no-cache,禁止浏览器缓存,保证每次请求都能拿到最新版本。

2. 浏览器的请求方式

完全通过GET请求获取所有资源:

  • 网页中的播放组件(原生<video>标签或HLS.js等库)首先发起GET请求获取媒体M3U8文件。
  • 解析M3U8后,浏览器会逐个发起GET请求下载列表中的TS分片,下载完成后解码播放。

3. 直播场景下获取后续分片的逻辑

核心是M3U8动态更新+浏览器轮询机制:

  • 服务器端的媒体M3U8始终处于动态更新状态,每生成新分片就追加条目,移除旧条目。
  • 浏览器播放完当前分片后,会根据M3U8中#EXT-X-TARGETDURATION的值定期重新请求M3U8(比如设为5秒,就每隔5秒拉取一次)。
  • 浏览器对比新拉取的M3U8与本地缓存的旧版本,发现新分片条目后立即发起GET请求下载,依次播放,实现直播流的持续更新。
  • 注意:直播状态下的M3U8不能加#EXT-X-ENDLIST标记(该标记表示流结束),仅当直播停止时才添加。

HLS直播基本交互步骤

  1. 服务器初始化

    • 启动视频捕获与编码模块,输出H.264/H.265编码的TS流。
    • 创建初始媒体M3U8文件,写入基础配置:
      #EXTM3U
      #EXT-X-VERSION:3
      #EXT-X-TARGETDURATION:5
      #EXT-X-MEDIA-SEQUENCE:0
      
  2. 浏览器初始请求

    • 用户打开播放页面,播放组件向服务器发起GET请求,获取媒体M3U8文件。
  3. 服务器生成分片并更新M3U8

    • 每生成一个TS分片,将其存储到HTTP可访问路径(如/hls/live_001.ts)。
    • 向M3U8追加分片信息:
      #EXTINF:5.0,
      /hls/live_001.ts
      
    • 根据移除的旧分片数量,更新#EXT-X-MEDIA-SEQUENCE的值。
  4. 浏览器下载播放分片

    • 解析M3U8后,逐个GET请求下载TS分片,解码后连续播放。
  5. 直播持续循环

    • 浏览器按#EXT-X-TARGETDURATION周期重新请求M3U8,发现新分片后立即下载播放。
    • 服务器持续生成分片并更新M3U8,直到直播结束,添加#EXT-X-ENDLIST标记,浏览器停止轮询。

内容的提问来源于stack exchange,提问作者Tobic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:05:13