【音视频】HLS和DASH 流媒体协议的详细介绍和实现方式

深入探讨 HLS 和 DASH 流媒体协议

1. HLS(HTTP Live Streaming)

核心技术细节

HLS(HTTP Live Streaming)是由苹果公司提出的一种基于 HTTP 协议的流媒体协议。它将视频分割成多个小片段,通过 .m3u8 文件作为索引进行管理。

文件结构
  • .m3u8 文件(索引文件):列出所有可用的视频片段及其路径,可以包含多质量级别。

  • 视频片段文件 :通常是 TS(MPEG-2 TS)fMP4(Fragmented MP4) 格式。

    示例 .m3u8 文件内容:

    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 索引文件。

    示例:

    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 片段和清单文件。

bash 复制代码
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 流
bash 复制代码
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 文件内容:

    xml 复制代码
    <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 流
bash 复制代码
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 流生成。

bash 复制代码
MP4Box -dash 4000 -frag 4000 -rap -out output.mpd input.mp4
  • -dash:片段长度,单位为毫秒。
  • -rap:确保片段从关键帧开始。

3. 播放器实现

HLS 播放器

  • iOS/macOS :使用 AVPlayer,原生支持 .m3u8 文件。

  • Web:使用 HLS.js 库在非 Safari 浏览器上支持 HLS。

    示例代码:

    javascript 复制代码
    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 流。

    示例代码:

    javascript 复制代码
    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 需库支持 跨平台,需播放器支持
实时直播延迟 一般较高(几秒到几十秒) 可优化到低延迟(甚至亚秒级)
开放性 封闭(苹果主导) 开放(国际标准)

总结

  • HLSDASH 都是现代流媒体的核心技术,提供了自适应流传输,保证了良好的用户体验。
  • HLS 适合苹果生态和广泛的设备支持,尤其是直播和点播场景。
  • DASH 作为开放标准,适用于多平台、多编码格式,尤其是需要高效流媒体的场景。
  • 选择合适的协议和工具(如 FFmpeg、MP4Box)可以大大简化流媒体内容的生成和传输。
相关推荐
邪恶的贝利亚1 小时前
深入解析音频:格式、同步及封装容器
音视频
chen_song_3 小时前
WebRTC的ICE之TURN协议的交互流程中继转发Relay媒体数据的turnserver的测试
算法·音视频·webrtc·交互·媒体
恒拓高科WorkPlus7 小时前
局域网视频软件BeeWorks Meet,企业内部安全会议不断线
网络·安全·音视频
mosquito_lover116 小时前
Python实现音频数字水印方法
python·音视频
想躺在地上晒成地瓜干17 小时前
树莓派超全系列文档--(18)树莓派配置音频
linux·音视频·树莓派·raspberrypi·树莓派教程
山河君17 小时前
音频进阶学习二十四——IIR滤波器设计方法
学习·算法·音视频·信号处理
vonchenchen118 小时前
nara wpe去混响学习笔记
机器学习·音视频·音频·信息与通信·信号处理
Yeauty18 小时前
从0到1:Rust 如何用 FFmpeg 和 OpenGL 打造硬核视频特效
rust·ffmpeg·音视频
居然是阿宋19 小时前
深入理解 YUV 颜色空间:从原理到 Android 视频渲染
android·音视频