深入探讨 HLS 和 DASH 流媒体协议
1. HLS(HTTP Live Streaming)
核心技术细节
HLS(HTTP Live Streaming)是由苹果公司提出的一种基于 HTTP 协议的流媒体协议。它将视频分割成多个小片段,通过 .m3u8
文件作为索引进行管理。
文件结构
-
.m3u8
文件(索引文件):列出所有可用的视频片段及其路径,可以包含多质量级别。 -
视频片段文件:通常是 TS(MPEG-2 TS) 或 fMP4(Fragmented MP4) 格式。
示例
.m3u8
文件内容:#EXTM3U #EXT-X-VERSION:3 #EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360 360p.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=1400000,RESOLUTION=1280x720 720p.m3u8
多质量切换
- 播放器根据网络带宽和缓冲情况,动态选择适合的分辨率。
- 使用
.m3u8
文件中的#EXT-X-STREAM-INF
标签定义多种比特率。
实时直播
-
直播流通过持续生成新的片段文件,播放器周期性地刷新
.m3u8
索引文件。示例:
#EXT-X-TARGETDURATION:10 #EXT-X-MEDIA-SEQUENCE:1
延迟优化
- 传统延迟:通过减少片段时长(如 6 秒降为 2 秒),降低延迟。
- 低延迟 HLS(LL-HLS):引入 HTTP/2 和部分片段加载(Part Segments)实现亚秒级延迟。
实现 HLS 流
1. 使用 FFmpeg 生成 HLS 流
FFmpeg 是处理 HLS 的利器,可以轻松生成 HLS 片段和清单文件。
ffmpeg -i input.mp4 \
-codec: copy \
-start_number 0 \
-hls_time 4 \
-hls_list_size 0 \
-f hls output.m3u8
-hls_time
:每个片段的时长,单位为秒。-hls_list_size
:清单文件中包含的片段数,0
表示包含所有片段。
2. 动态生成直播 HLS 流
ffmpeg -re -i input.mp4 \
-codec: copy \
-f hls \
-hls_time 2 \
-hls_flags delete_segments+append_list \
live.m3u8
-re
:实时模式,按视频原始速度处理。-hls_flags delete_segments
:删除过期片段,适用于直播。
2. DASH(Dynamic Adaptive Streaming over HTTP)
核心技术细节
DASH 是由 MPEG 组织推出的一种自适应流媒体协议,目标是提供一个开放标准,解决 HLS 的封闭性问题,支持更多设备和平台。
文件结构
-
.mpd
文件(清单文件):定义了多质量级别的流、时间轴信息以及片段路径。 -
片段文件:通常是 MP4 或 WebM 格式。
示例
.mpd
文件内容:<MPD type="dynamic" minBufferTime="PT1.5S" profiles="urn:mpeg:dash:profile:isoff-live:2011"> <Period> <AdaptationSet mimeType="video/mp4" segmentAlignment="true"> <Representation id="1" bandwidth="800000" width="640" height="360"> <SegmentTemplate media="chunk-$Number$.m4s" initialization="init.mp4" duration="2" /> </Representation> </AdaptationSet> </Period> </MPD>
自适应播放
- 清单文件定义多个
Representation
(不同的分辨率和码率)。 - 播放器根据网络带宽动态选择合适的
Representation
,加载对应的片段。
实时直播
- DASH 支持通过动态更新
.mpd
文件来处理实时直播流。 - 可以设置时间轴更新规则,支持低延迟直播。
实现 DASH 流
1. 使用 FFmpeg 生成 DASH 流
ffmpeg -i input.mp4 \
-map 0:v -map 0:a \
-c:v libx264 -c:a aac \
-f dash \
-seg_duration 4 \
output.mpd
-seg_duration
:每个片段的时长。- 输出文件
output.mpd
和一系列视频片段。
2. 使用 MP4Box 生成 DASH 流
MP4Box 是另一种流行的工具,支持复杂的 DASH 流生成。
MP4Box -dash 4000 -frag 4000 -rap -out output.mpd input.mp4
-dash
:片段长度,单位为毫秒。-rap
:确保片段从关键帧开始。
3. 播放器实现
HLS 播放器
-
iOS/macOS:使用
AVPlayer
,原生支持.m3u8
文件。 -
Web:使用 HLS.js 库在非 Safari 浏览器上支持 HLS。
示例代码:
if (Hls.isSupported()) { var video = document.getElementById('video'); var hls = new Hls(); hls.loadSource('path/to/playlist.m3u8'); hls.attachMedia(video); }
DASH 播放器
-
使用 Dash.js 播放 DASH 流。
示例代码:
var player = dashjs.MediaPlayer().create(); player.initialize(document.querySelector("#videoPlayer"), "path/to/stream.mpd", true);
4. 延迟优化
HLS 延迟优化
- 使用低延迟 HLS(LL-HLS)。
- 减少
#EXT-X-TARGETDURATION
,控制每个片段的持续时间。
DASH 延迟优化
- 设置
.mpd
中的availabilityStartTime
和时间段对齐。 - 使用低延迟 DASH(LL-DASH)配置,减少缓冲区时间。
5. HLS 和 DASH 对比
特性 | HLS | DASH |
---|---|---|
提出者 | 苹果公司 | MPEG 组织 |
清单文件格式 | .m3u8 | .mpd |
片段封装格式 | TS、fMP4 | MP4、WebM |
编码格式支持 | H.264、H.265 | H.264、H.265、VP9、AV1 |
设备支持 | iOS/macOS 原生支持;Android 需库支持 | 跨平台,需播放器支持 |
实时直播延迟 | 一般较高(几秒到几十秒) | 可优化到低延迟(甚至亚秒级) |
开放性 | 封闭(苹果主导) | 开放(国际标准) |
总结
- HLS 和 DASH 都是现代流媒体的核心技术,提供了自适应流传输,保证了良好的用户体验。
- HLS 适合苹果生态和广泛的设备支持,尤其是直播和点播场景。
- DASH 作为开放标准,适用于多平台、多编码格式,尤其是需要高效流媒体的场景。
- 选择合适的协议和工具(如 FFmpeg、MP4Box)可以大大简化流媒体内容的生成和传输。