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

news2024/12/26 20:11:57

深入探讨 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 对比

特性HLSDASH
提出者苹果公司MPEG 组织
清单文件格式.m3u8.mpd
片段封装格式TS、fMP4MP4、WebM
编码格式支持H.264、H.265H.264、H.265、VP9、AV1
设备支持iOS/macOS 原生支持;Android 需库支持跨平台,需播放器支持
实时直播延迟一般较高(几秒到几十秒)可优化到低延迟(甚至亚秒级)
开放性封闭(苹果主导)开放(国际标准)

总结

  • HLSDASH 都是现代流媒体的核心技术,提供了自适应流传输,保证了良好的用户体验。
  • HLS 适合苹果生态和广泛的设备支持,尤其是直播和点播场景。
  • DASH 作为开放标准,适用于多平台、多编码格式,尤其是需要高效流媒体的场景。
  • 选择合适的协议和工具(如 FFmpeg、MP4Box)可以大大简化流媒体内容的生成和传输。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2253331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI开发:生成式对抗网络入门 模型训练和图像生成 -Python 机器学习

阶段1&#xff1a;GAN是个啥&#xff1f; 生成式对抗网络&#xff08;Generative Adversarial Networks, GAN&#xff09;&#xff0c;名字听着就有点“对抗”的意思&#xff0c;没错&#xff01;它其实是两个神经网络互相斗智斗勇的游戏&#xff1a; 生成器&#xff08;Gene…

040集——CAD中放烟花(CAD—C#二次开发入门)

效果如下&#xff1a; 单一颜色的烟花&#xff1a; 渐变色的火花&#xff1a; namespace AcTools {public class HH{public static TransientManager tm TransientManager.CurrentTransientManager;public static Random rand new Random();public static Vector3D G new V…

JavaScript实现tab栏切换

JavaScript实现tab栏切换 代码功能概述 这段代码实现了一个简单的选项卡&#xff08;Tab&#xff09;切换功能。它通过操作 HTML 元素的类名&#xff08;class&#xff09;来控制哪些选项卡&#xff08;Tab&#xff09;和对应的内容板块显示&#xff0c;哪些隐藏。基本思路是先…

【天地图】HTML页面实现车辆轨迹、起始点标记和轨迹打点的完整功能

目录 一、功能演示 二、完整代码 三、参考文档 一、功能演示 运行以后完整的效果如下&#xff1a; 点击开始&#xff0c;小车会沿着轨迹进行移动&#xff0c;点击轨迹点会显示经纬度和时间&#xff1a; 二、完整代码 废话不多说&#xff0c;直接给完整代码&#xff0c;替换…

HCIA笔记6--路由基础与静态路由:浮动路由、缺省路由、迭代查找

文章目录 0. 概念1.路由器工作原理2. 跨网访问流程3. 静态路由配置4. 静态路由的应用场景4.1 路由备份4.2 浮动路由4.3 缺省路由 5. 迭代路由6 问题6.1 为什么路由表中有的下一跳的地址有接口&#xff1f;6.2 个人电脑的网关本质是什么&#xff1f; 0. 概念 自治系统&#xff…

20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件libncurses.so.5的问题

20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件libncurses.so.5的问题 2024/11/29 21:11 缘起&#xff1a;中科创达的高通CM6125开发板的Android10的编译环境需要。 vendor/qcom/proprietary/commonsys/securemsm/seccamera/service/jni/jni_if.…

Matlab搜索路径添加不上

发现无论是右键文件夹添加到路径&#xff0c;还是在“设置路径”中专门添加&#xff0c;我的路径始终添加不上&#xff0c;导致代码运行始终报错&#xff0c;后来将路径中的“”加号去掉后&#xff0c;就添加成功了&#xff0c;经过测试&#xff0c;路径中含有中文也可以添加成…

自由学习记录(28)

C# 中的流&#xff08;Stream&#xff09; 流&#xff08;Stream&#xff09;是用于读取和写入数据的抽象基类。 流表示从数据源读取或向数据源写入数据的矢量过程。 C# 中的流类是从 System.IO.Stream 基类派生的&#xff0c;提供了多种具体实现&#xff0c;每种实现都针对…

Redis3——线程模型与数据结构

Redis3——线程模型与数据结构 本文讲述了redis的单线程模型和IO多线程工作原理&#xff0c;以及几个主要数据结构的实现。 1. Redis的单线程模型 redis6.0之前&#xff0c;一个redis进程只有一个io线程&#xff0c;通过reactor模式可以连接大量客户端&#xff1b;redis6.0为了…

使用playwright自动化测试时,npx playwright test --ui打开图形化界面时报错

使用playwright自动化测试时&#xff0c;npx playwright test --ui打开图形化界面时报错 1、错误描述&#xff1a;2、解决办法3、注意符号的转义 1、错误描述&#xff1a; 在运行playwright的自动化测试项目时&#xff0c;使用npm run test无头模式运行正常&#xff0c;但使用…

深度学习模型:门控循环单元(GRU)详解

本文深入探讨了门控循环单元&#xff08;GRU&#xff09;&#xff0c;它是一种简化版的长短期记忆网络&#xff08;LSTM&#xff09;&#xff0c;在处理序列数据方面表现出色。文章详细介绍了 GRU 的基本原理、与 LSTM 的对比、在不同领域的应用以及相关的代码实现&#xff0c;…

用html+jq实现元素的拖动效果——js基础积累

用htmljq实现元素的拖动效果 效果图如下&#xff1a; 将【item10】拖动到【item1】前面 直接上代码&#xff1a; html部分 <ul id"sortableList"><li id"item1" class"w1" draggable"true">Item 1</li><li …

单片机学习笔记 12. 定时/计数器_定时

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…

【乐企文件生成工程】搭建docker环境,使用docker部署工程

1、自行下载docker 2、自行下载docker-compose 3、编写Dockerfile文件 # 使用官方的 OpenJDK 8 镜像 FROM openjdk:8-jdk-alpine# 设置工作目录 WORKDIR ./app# 复制 JAR 文件到容器 COPY ../lq-invoice/target/lq-invoice.jar app.jar # 暴露应用程序监听的端口 EXPOSE 1001…

React基础知识三 router路由全指南

现在最新版本是Router6和Router5有比较大的变化&#xff0c;Router5和Router4变化不大&#xff0c;本文以Router6的写法为主&#xff0c;也会对比和Router5的不同。比较全面。 安装路由 npm i react-router-dom基本使用 有两种Router&#xff0c;BrowserRouter和HashRouter&…

【C#】书籍信息的添加、修改、查询、删除

文章目录 一、简介二、程序功能2.1 Book类属性&#xff1a;方法&#xff1a; 2.2 Program 类 三、方法&#xff1a;四、用户界面流程&#xff1a;五、程序代码六、运行效果 一、简介 简单的C#控制台应用程序&#xff0c;用于管理书籍信息。这个程序将允许用户添加、编辑、查看…

打造去中心化交易平台:公链交易所开发全解析

公链交易所&#xff08;Public Blockchain Exchange&#xff09;是指基于公有链&#xff08;如以太坊、波场、币安智能链等&#xff09;建立的去中心化交易平台。与传统的中心化交易所&#xff08;CEX&#xff09;不同&#xff0c;公链交易所基于区块链技术实现资产交换的去中心…

CLIP模型也能处理点云信息

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

关于NXP开源的MCU_boot的项目心得

MCU的启动流程细查 注意MCU上电第一个函数运行的就是Reset_Handler函数&#xff0c;下图是表示了这个函数做了啥事情&#xff0c;注意加强一下对RAM空间的段的印象&#xff0c;从上到下是栈&#xff0c;堆&#xff0c;.bss段&#xff0c;.data段。 bootloader的难点 固件完…

MySQL5.6升级MySQL5.7

升级方式介绍 08 数据库服务版本升级方法 5.6 – 5.7 – 8.0 数据库版本升级方法&#xff1a; Inplace-本地升级 步骤一&#xff1a;在同一台服务器中&#xff0c;需要部署高版本数据库服务实例步骤二&#xff1a;低版本数据库中的数据进行备份迁移&#xff0c;迁移到高版本…