跳到主要内容

Video 协议选型:MP4、HLS、DASH、HTTP-FLV、WebRTC 怎么讲清楚?

0. 面试速答(30 秒版 TL;DR)

  • 先别把“视频协议”只理解成一个缩写,工程里至少要分清 3 层:封装格式、传输方式、播放接入能力
  • 最常见的 Web 点播方案不是“万能协议”,而是按场景选:简单点播优先 MP4,通用自适应点播优先 HLS,标准化多端分发可看 DASH,低延迟直播常见 HTTP-FLV / LL-HLS,强互动场景才会走 WebRTC
  • 前端选型核心不是“能不能播”,而是:浏览器原生支持、首帧速度、seek 体验、多码率、自适应、延迟、兼容性、排障成本
  • 一句话记忆:MP4 偏简单文件播放,HLS / DASH 偏切片分发,HTTP-FLV 偏低延迟直播,WebRTC 偏实时互动。

1. 先建立心智模型:协议不是一层,是一整条播放链路

很多人回答视频协议时,直接说“我们用 HLS”或者“我们用 MP4”。这不够准确。

对前端来说,至少要拆成下面几层:

  1. 编码层(Codec):例如 H.264、H.265、AV1、AAC、Opus。
  2. 封装层(Container):例如 MP4、TS、fMP4、WebM。
  3. 分发层(Delivery):整文件、分片、长连接、实时传输。
  4. 播放器接入层:原生 video、MSE、hls.jsdash.js、FLV 播放器、WebRTC SDK。

如果这几层不分开,讨论协议选型就会越来越乱。比如:

  • MP4 更像一个常见封装和文件分发方案。
  • HLS 是一套播放清单 + 分片分发方案,底层片段可能是 TSfMP4
  • WebRTC 不是“拿来替代 MP4 的点播协议”,它面向的是低延迟实时传输。

2. 先按业务拆:点播、直播、互动直播,不是一套解法

2.1 普通点播

目标通常是:

  • 接入简单
  • 成本可控
  • 首帧不要太差
  • 拖动和续播稳定

这类场景优先考虑:

  • MP4 + CDN + 原生 video
  • HLSDASH 做多码率自适应点播

2.2 通用直播

目标通常是:

  • 连续播放
  • 延迟控制在可接受范围
  • 大规模分发成本合理

这类场景常见:

  • HLS
  • LL-HLS
  • HTTP-FLV

2.3 强互动场景

目标通常是:

  • 超低延迟
  • 双向音视频
  • 弱网下快速调节

这时才更常用:

  • WebRTC

面试里最容易扣分的一句是:“直播也可以直接 MP4 播。”这说明没有按业务目标拆问题。

3. 常见 Video 协议怎么理解

3.1 MP4

MP4 最适合拿来讲“简单点播”。

特点:

  • 浏览器原生支持好
  • 接一个 URL 就能播
  • 工程接入成本最低

局限:

  • 多码率自适应能力弱
  • 长视频拖动体验依赖服务端 Range
  • CDN 缓存和切片治理没有 HLS / DASH 灵活

适用:

  • 后台系统
  • 简单课程回放
  • 体量不大、链路不复杂的点播页

3.2 HLS

HLS 可以理解为“清单文件 + 小分片”方案。

特点:

  • 很适合 CDN 分发
  • 支持多清晰度和 ABR(Adaptive Bitrate)
  • Safari 生态天然友好

局限:

  • 非 Safari Web 端通常要配合 hls.js
  • 比简单 MP4 接入更复杂
  • 分片长度、首片大小、关键帧布局都会影响首帧和拖动体验

适用:

  • 课程平台
  • 视频网站
  • 通用点播
  • 对清晰度切换和弱网体验有要求的场景

3.3 DASH

DASH 和 HLS 在思路上相近,也强调分片和多码率。

特点:

  • 标准化程度高
  • 在多终端和标准播放器体系里常见
  • ABR 能力成熟

局限:

  • Web 前端的通用性和生态认知度通常不如 HLS
  • 团队缺少经验时,排障成本可能更高

适用:

  • 有标准化多端播放需求
  • 已有成熟 DASH 平台链路

3.4 HTTP-FLV

HTTP-FLV 更偏“低延迟直播播放”。

特点:

  • 延迟通常低于传统 HLS
  • 服务端持续推流,前端持续消费

局限:

  • 浏览器通常需要 MSE 或播放器库兜底
  • 长时间播放、内存治理、断流重连都更考验播放器实现

适用:

  • 对延迟有要求的直播场景
  • 互动性比普通直播更强,但又没到 WebRTC 那种实时级别

3.5 WebRTC

WebRTC 要放在“实时互动”框架里理解,不要和普通点播混答。

特点:

  • 延迟最低
  • 原生支持双向传输
  • 很适合连麦、会议、互动课堂

局限:

  • 服务端架构复杂
  • NAT 穿透、带宽估计、弱网策略都更难
  • 成本、监控、排障门槛更高

适用:

  • 音视频会议
  • 在线连麦
  • 强互动直播

4. 前端选型时真正关心的维度

维度MP4HLSDASHHTTP-FLVWebRTC
接入复杂度中高
浏览器原生能力Safari 高一般一般较高
多码率自适应一般动态但复杂
首帧速度简单场景快依赖首片与清单依赖实现通常较快很快
seek 体验依赖 Range较好较好通常不是重点通常不是重点
直播延迟不适合中高中高很低
工程治理成本中高中高

一个很实用的回答方式是:

  • 如果只是普通点播,先从 MP4 开始。
  • 如果需要 ABR、多清晰度、长视频拖动体验,优先 HLS
  • 如果是低延迟直播,考虑 HTTP-FLVLL-HLS
  • 如果是互动连麦,优先 WebRTC

5. 一个标准答法:为什么有时不用 MP4,要改成 HLS?

可以这样回答:

MP4 对简单点播足够友好,但当视频变成长视频、多清晰度、弱网自适应、复杂 CDN 分发场景时,整文件模型就不够灵活。HLS 把媒体拆成清单和分片,前端可以按网络状况切换码率,CDN 也更容易缓存热点片段,所以更适合大规模点播平台。

这里真正体现的是工程权衡:

  • 不是 MP4 不能播,而是治理能力不足。
  • 不是 HLS 天然更高级,而是它更适合复杂视频业务。

6. 常见追问

6.1 为什么同一个 HLS,在 Safari 能播,在 Chrome 不能原生播?

因为 Safari 对 HLS 的原生支持更完整,而很多 Chromium 浏览器并不直接原生解 HLS 清单,需要前端通过 hls.js 把分片拉下来,再通过 MSE 喂给 video

6.2 为什么长视频用 MP4 拖动经常不顺?

核心原因通常不是“前端写得差”,而是链路设计问题:

  • 服务端是否支持 Range
  • moov 位置是否合理
  • 关键帧间隔是否过大
  • CDN 是否正确缓存分段请求

6.3 为什么低延迟直播不直接全站 WebRTC?

因为 WebRTC 虽然低延迟,但它的服务端成本、网络复杂度、监控治理难度都更高。很多业务并不需要“几百毫秒级实时”,这时 HTTP-FLVLL-HLS 更务实。

7. 容易讲错的地方

  • 不要把 编码格式播放协议 混为一谈。
  • 不要把 点播方案互动实时方案 混为一谈。
  • 不要说“浏览器都支持 HLS”,这在 Web 端并不成立。
  • 不要说“有播放器 SDK 就说明协议问题解决了”,SDK 只是播放器接入层,不等于链路治理完成。

8. 速记版

  • MP4:简单点播优先。
  • HLS:通用点播和通用直播最常见。
  • DASH:标准化强,Web 生态认知度略弱于 HLS。
  • HTTP-FLV:低延迟直播常见折中方案。
  • WebRTC:实时互动首选,但成本最高。
  • 答题顺序最好固定成:业务目标 -> 延迟要求 -> 自适应能力 -> 浏览器兼容 -> 工程成本