流媒体直播播放协议:HLS、RTMP、HTTP-FLV

2023-10-31

流媒体直播播放协议:HLS、RTMP、HTTP-FLV

一、推拉流

在这里插入图片描述
在开始之前,先把流媒体服务中的双端关系说一下:在一个完整的流媒体服务框架中,角色就是“两端加一服”。推流端、拉流端加上媒体服务器。

同时按照应用场景的不同,协议又分:推流协议、拉流播放协议。

其中,RTMP 可以用在双端,但 HLS 只能用在拉流端。

  • 推流

    推流,指的是把采集阶段封包好的内容传输到服务器的过程。其实就是将现场的视频信号传到网络的过程。

    “推流”对网络要求比较高,如果网络不稳定,直播效果就会很差,观众观看直播时就会发生卡顿等现象,观看体验很是糟糕。

    要想用于推流还必须把音视频数据使用传输协议进行封装,变成流数据。使用 RTMP 传输的延时通常在 1–3 秒,对于手机直播这种实时性要求非常高的场景,RTMP 也成为手机直播中最常用的流传输协议。

    最后通过一定的 Qos 算法将音视频流数据推送到网络端,通过 CDN 进行分发。

    在直播场景中,网络不稳定是非常常见的,这时就需要 Qos 来保证网络不稳情况下的用户观看直播的体验,通常是通过主播端和播放端设置缓存,让码率均匀。

    另外,针对实时变化的网络状况,动态码率和帧率也是最常用的策略。

  • 拉流

    拉流是指服务器已有直播内容,根据协议类型(如RTMP、RTP、RTSP、HTTP等),与服务器建立连接并接收数据,进行拉取的过程。

    拉流端的核心处理在播放器端的解码和渲染,在互动直播中还需集成聊天室、点赞和礼物系统等功能。

    拉流端现在支持 RTMP、HLS、HDL(HTTP-FLV)三种协议,其中,在网络稳定的情况下,对于 HDL 协议的延时控制可达 1s,完全满足互动直播的业务需求。

    RTMP 是 Adobe 的专利协议,开源软件和开源库都支持的比较好,延时一般在 1-3 秒。

    HLS 是苹果提出的基于 HTTP 的流媒体传输协议,优点是跨平台性比较好,HTML5 可以直接打开播放,移动端兼容性良好,但是缺点是延迟比较高。

二、协议介绍

在这里插入图片描述

1. HLS

HLS 全称是 HTTP Live Streaming。这是 Apple 提出的直播流协议,是通过视频流切片成文件片段来直播的。目前,IOS 和 高版本 Android 都支持 HLS。

HLS 主要的两块内容是 .m3u8 文件和 .ts 播放文件。

其中 .m3u8 作为索引文件(确保包的顺序)

接受服务器会将接受到的视频流进行缓存,然后缓存到一定程度后,会将这些视频流进行编码格式化,同时会生成一份 .m3u8 文件和其它很多的 .ts 文件。

客户端首先会请求一个m3u8文件,里面会有不同码率的流,或者直接是ts文件列表,通过给出的ts文件地址去依次播放。在直播的时候,客户端会不断请求m3u8文件,检查ts列表是否有新的ts切片。这种方式的实时性较差,不过优势是H5、IOS、Android都原生支持。

实际上HLS作为拉流端,效率并不低,延时高的原因大概是因为HLS的实现方案:
在这里插入图片描述
在上图的生产环境中,以 RTMP 协议推流,HLS 拉流。端到端的时间消耗是:

RTMP 推流端的联通成本是 700ms ,注意此时的 700ms 包含了 connect 和 send video data ;

推流端联通之后的时间成本,主要是采集编码封包的成本,不需要再次connect;

HLS 的请求响应成本是 300ms;

flv to ts 的成本,用 ffmpeg 切一个 10 秒的码率 500 的视频,算上磁盘的写入时间最多 200ms;

所以说,HLS 的慢的原因只有一个,就是等数据!

  • 优势

    • H5 可以直接打开播放,移动端兼容性良
    • 使用 HTTPS 加密 ts 文件
    • 快/倒放
    • 广告插入
    • 不同分辨率视频切换
    • 穿透防火墙。基于 HTTP/80 传输,有效避免防火墙拦截。
    • 性能高。通过 HTTP 传输,支持网络分发,CDN 支持良好,且自带多码率自适应。
  • 劣势

    • 实时性差,延迟高。HLS 的延迟基本在 10s+ 以上。
    • 文件碎片。特性的双刃剑,ts 切片较小,会造成海量小文件,对存储和缓存都有一定的挑战。

2. RTMP

RTMP,全称 Real Time Messaging Protocol,即实时消息传送协议。

纯 RTMP 使用 TCP 连接,默认端口为 1935(有可能被封)。

是 Adobe Systems 公司为 Flash 播放器和服务器之间音频、视频和数据传输开发的开放协议。协议基于 TCP,是一个协议族,包括 RTMP 基本协议及 RTMPT/RTMPS/RTMPE 等多种变种。

RTMP 由于借由 TCP 长连接协议,所以,客户端向服务端推流这些操作而言,延时性很低。

它会将上传的流分成不同的分片,这些分片的大小,有时候变,有时候不会变。

默认情况下就是,64B 的音频数据 + 128B 的视频数据 + 其它数据(比如 头,协议标签等)。

但 RTMP 具体传输的时候,会将分片进一步划分为包,即,视频包,音频包,协议包等。因为,RTMP 在进行传输的时候,会建立不同的通道,来进行数据的传输,这样对于不同的资源,对不同的通道设置相关的带宽上限。

RTMP 是一种设计用来进行实时数据通信的网络协议,主要用来在 Flash/AIR 平台和支持 RTMP 协议的流媒体/交互服务器之间进行音视频和数据通信。这种方式的实时性比较强,基本能保证延迟在 1-2s 内,是现在国内直播主要采用的方式之一。不过使用这种协议,就必须安装 flash,而 H5、IOS、Android 并不能原生支持 flash,因此这种协议能流行多久,就不得而知了,毕竟移动端才是现在的主流。

FLV (Flash Video) 是 Adobe 公司推出的另一种视频格式,是一种在网络上传输的流媒体数据存储容器格式。其格式相对简单轻量,不需要很大的媒体头部信息。整个 FLV 由 The FLV Header,The FLV Body 以及其它 Tag 组成。因此加载速度极快。采用 FLV 格式封装的文件后缀为 .flv。

在这里插入图片描述

现在推流协议各大云厂商基本都是直接支持 RTMP 。

拉流用 RTMP 的话就不太现实了,现在对 flash 支持都不友好了。

3. HDL (HTTP-FLV)

HTTP-FLV 就是对 RTMP 协议的封装,都是针对于 FLV 视频格式做的直播分发流。相比于 RTMP,它是一个开放的协议,因此他具备了 RTMP 的实时性和 RTMP 不具备的开发性。而且随着 flv.js 的出现,使得浏览器在不依赖 flash 的情况下,播放 flv 视频,从而兼容了移动端,所以现在很多直播平台,尤其是手机直播平台,都会选择它。

因为 RTMP 发的包很容易处理,通常 RTMP 协议会作为视频上传端来处理,然后经由服务器转换为 FLV 文件,通过 HTTP-FLV 下发给用户。

参考:

  1. 直播协议RTMP、HLS、HTTP FLV
  2. 理解RTMP、HttpFlv和HLS的正确姿势
  3. 流媒体直播播放三大件PK:RTMP/HLS/HTTP-FLV
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

流媒体直播播放协议:HLS、RTMP、HTTP-FLV 的相关文章

  • 检测用户是否位于代理后面

    我试图弄清楚如何检测登录我网站的人是否在代理后面 我读到您可以通过可嵌入对象 Flash 和 Java 检测一个人的真实 IP 地址 但是 我实际上无法找到任何示例或来源 我正在使用 PHP 并且我已经阅读了寻找 SERVER HTTP X
  • gradle - 从 url 下载并解压文件

    从 url 下载和解压文件的正确 gradle 方法是什么 http 如果可能的话 我想防止每次运行任务时重新下载 在ant get可以通过以下方式实现skipexisting true 我当前的解决方案是 task foo ant get
  • 在 Angular 中一起使用 Promise 和服务

    我的问题是基于这个话题 https groups google com forum msg angular qagzXXhS VI p9ArYjfivW8J在 Angular 谷歌小组中 我想提供一个服务 存储通过 http 从后端检索的一
  • RxJS Angular2 在 Observable.forkjoin 中处理 404

    我目前正在链接一堆 http 请求 但是在订阅之前我无法处理 404 错误 My code 在模板中 service getData subscribe data gt this items data err gt console log
  • htaccess 重定向非 www http 和 https

    我想要 http example com重定向至 http www example com https example com重定向至 https www example com 以及任何东西http whatever example co
  • 处理原始 HTTP 请求内容

    我正在 ASP NET 中做一个电子商务解决方案 它使用PayPal 网站支付标准 https www paypal com IntegrationCenter ic standard home html服务 除此之外 我还使用他们提供的服
  • Http Auth 不适用于 PHP

    我使用 Laravel Lumen Shield 扩展进行 Http 身份验证 但是在我的本地计算机上一切都很完美 我只在我们的服务器上遇到了问题 问题是在我提交正确的登录数据后 登录屏幕再次出现 我尝试了不同的登录数据 不同的浏览器 登录
  • 摆脱浏览器控制台中的 401(未经授权)ajax 错误

    我正在使用 javascript 通过 api 调用jQuery ajax http api jquery com jQuery ajax 称呼 如果用户未经过身份验证 API 会响应 401 并且我只想针对此调用忽略此错误 我已经尝试了
  • 如何使用 Apache HttpClient 4 获取文件上传的进度条?

    我有以下用于使用 Apache 的 HTTP Client org apache http client 上传文件的代码 public static void main String args throws Exception String
  • 您可以在分块的 http 响应预告片中设置 Location 标头吗?

    HTTP 1 1 响应可以分块 spec https www rfc editor org rfc rfc2616 section 3 6 1 在最后一个块的末尾 服务器可以发送一个 预告片 其中包含附加标头 问题是 你能包括一个Locat
  • 使用矩阵参数创建 GET 请求

    我将使用的网络服务需要矩阵参数 http tester com v1 customers lastname Jackson firstname Tim bookingreference 7Y9UIY 而不是通常的 http tester c
  • HTTP-DELETE-请求是否允许响应主体?

    我假设响应代码 200 始终允许响应主体 但我找不到任何明确提及删除请求的响应主体 这里明确提到了RFC http www w3 org Protocols rfc2616 rfc2616 sec9 html sec9 7 简短的回答是 Y
  • 为什么 HttpClient 使套接字保持打开状态?

    在创建 使用和处置多个 HttpClient 时 我注意到有套接字处于 TIME WAIT 状态 例如 运行以下命令后 using System Net Http namespace HttpClientTest public class
  • 有人成功用 Robolectric 模拟 HttpRequests 吗?

    我刚刚开始使用 Robolectric 模拟大多数 Android 类似乎工作正常 但是当我的测试类尝试创建 DefaultHttpClient 时 它会收到可怕的 Stub 错误 被测试的类在这一行失败 HttpClient httpcl
  • 删除 servlet 中的 cookie 时出现问题

    我尝试使用以下代码删除 servlet 中的 cookie Cookie minIdCookie null for Cookie c req getCookies if c getName equals iPlanetDirectoryPr
  • 为什么使用HTTP协议时需要指定端口号?

    即使我们使用HTTP协议 为什么还需要用IP地址指定端口号 例如 http xyz 8080 这到底是什么意思 我们已经知道 在使用 HTTP 时 请求将在端口 80 上提供服务 那么为什么我们要显式指定端口呢 HTTP 的默认端口为 80
  • 在 Go 中跟踪 HTTP 请求时指定超时

    我知道通过执行以下操作来指定 HTTP 请求超时的常用方法 httpClient http Client Timeout time Duration 5 time Second 但是 我似乎不知道在跟踪 HTTP 请求时如何执行相同的操作
  • 按照约定应返回哪些 REST PUT/POST/DELETE 调用?

    根据 REST 意识形态 PUT POST DELETE 请求的响应正文中应该包含什么 返回码呢 是HTTP OK enough 如果有的话 这种约定的原因是什么 我发现了一篇描述 POST PUT 差异的好文章 发布与放置 http ww
  • iOS 上的多个 HTTP 请求与单个 TCP 连接

    我正在开发一个 iPhone 应用程序 它使用我控制的基于 Web 的 API 连接到持续打开的 TCP 端口并通过 TCP API 发出请求 或者为我想要获取的所有数据发出新的 HTTP 请求 会更快或更高效吗 我认为差异可以忽略不计 但
  • 如何使用批处理脚本调用的curl 获取http post 请求的响应代码?

    我正在努力为从我们的工具之一发送 http post 请求提供支持 该工具基本上通过 http 请求执行作业 实现此目的的方法是该工具使用多个参数调用 RunScript bat 该脚本解析这些参数并在验证后发出curl post 请求 P

随机推荐

  • 凸优化系列——约束优化问题

    1 KKT条件 局部最优解 全局最优解 严格最优解 注意几类非光滑函数的转化 约束优化最优解的特征 最优解的一阶必要条件 Karush Kuhn Tucker KKT条件
  • CentOS 7 源码制作openssh 9.4p1 rpm包 —— 筑梦之路

    参考之前的博客 centos 7 制作openssh8 7 8 8 8 9 9 0 9 1 9 2 9 3 p1 rpm包升级 筑梦之路 openssh rpm包 筑梦之路的博客 CSDN博客 需要说明的是9 4版本必须要openssl 1
  • Windows2003系统漏洞提权复现

    操作系统 Microsoft Windows Server 2003 Web服务器 IIS V6 0 第一步 将大马文件上传至服务器根目录 第二步 访问大马文件 进入大马的控制界面 第三步 查看漏洞补丁信息 第四步 上传漏洞工具 将提权工具
  • 在Vue2项目中使用Vant组件库

    Vant 2 Mobile UI Components built on Vuehttps vant contrib gitee io vant v2 zh CN home1 安装vant包 Vue2项目下必须这么写 不能直接写npm i
  • MySQL 排序

    排序数据 1 排序规则 使用ORDER BY 字句排序 在其后面加所需字段 ASC ascend 升序 DESC descend 降序 ORDER BY 字句在SELECT语句的结尾 注意 数据库中默认按照先后添加顺序存储数据 在查询时 也
  • python中的sort的用法

    一 sort的两种用法 1 a sort 对原列表进行原址排序 原址排序的意思是原列表被改变了 排序的规则 数字 字符串按照ASCII 中文按照unicode从小到大排序 a 2 3 6 7 1 a sort print a 1 2 3 6
  • chrony系统授时时,几条重要命令输出信息的含义

    原文 https docs fedoraproject org en US Fedora 18 html System Administrators Guide sect Checking if chrony is synchronized
  • 确定你的public继承塑模出is-a关系——条款32

    如果你令class D Derived 以public形式继承class B Base 你便是告诉C 编译器 以及你的代码读者 说 每一个类型为D的对象同时也是一个类型为B的对象 反之不成立 你的意识是B比D表现出更一般化的概念 而D比B表
  • 开关电源-电容

    电子元器件 电容 1 电容是电路中重要的元件 种类多 用途广 主要有插件类和贴片类两种 2 电容主要特性参数 标称容量 耐压 误差 温度 2 1电容容量常用单位有微法 uF 纳法 nF 皮法 pF 单位换算 luF 103nF 106pF
  • 【数模】编码的传输问题 Huffman算法编程实现(matlab)

    编码的传输问题 利用Huffman算法编程实现以下问题 已知字母A B C D E F出现的概率 字母 概率 A 35 B 10 C 20 D 10 E 20 F 5 哈夫曼编码基础知识复习 哈夫曼编码 Huffman Coding 又称霍
  • Tensorflow框架(张量、计算图、会话)

    张量 计算图 会话 人工智能实践 Tensorflow笔记 Tensorflow框架 张量 计算图 会话 基于Tensorflow的NN 神经网络 用张量表示数据 用计算图搭建神经网络 用会话执行计算图 优化线上的权重 参数 得到模型 张量
  • 抓包工具fiddler不抓取火狐浏览器的数据

    fiddler可以抓到google浏览器的包 但是抓不到Firefox浏览器的包 火狐浏览器版本79 0 64 位 fiddler 4 亲测好使 操作步骤 打开Fiddler gt 菜单栏 Tools gt Options gt Conne
  • sdf转smi

    from rdkit import Chem smi Chem MolToSmiles Chem SDMolSupplier sdf path 0
  • 全局组件和局部组件

    1 全局组件和局部组件的区别 全局组件 只需要在main js中导入一次 整个项目都可以直接使用 在main js中导入 局部组件 用一次 导一次 在用到的地方导入 2 局部组件导入步骤 3部曲 1 导入子组件 import Registe
  • 基于Flask框架的python微博数据分析

    Python 微博数据 博文 分析 项目简介 后端采用Flask框架搭建 通过移动端接口获取数据 数据清洗后采用jieba进行词法分析 通过WordCloud制作词云展示 数据的可视化在以后的版本中会细化 版本V0 0 1功能 能够获取用户
  • 1. redis核心数据结构实战与高性能原理剖析

    分布式缓存技术Redis 1 Redis的五种数据结构 1 1 String 1 2 hash 1 3 列表list 1 4 set 1 5 ZSet 2 Redis的单线程和高性能 3 其他高级命令 3 1 scan 渐进式遍历键 本文是
  • 从零开始学习微服务 -微服务基本概述、微服务案例

    1 SpringCloud概述 1 1 互联网应用架构 1 1 1 单体应用架构 在诞 之初 项目的 户量 数据量规模都 较 项目所有的功能模块都放在一个工程中编码 编译 打包并且部署在一个Tomcat容器中的架构模式就是单体应用架构 这样
  • SQL注入基础原理与案例(详细总结)

    SQL注入基础原理与案例 一 前言 二 漏洞概述及危害 1 漏洞概述 2 漏洞危害 3 漏洞防范 三 SQL注入 1 SQL注入方式 1 信息收集 2 数据注入 3 高权限注入 2 判断是否存在注入点 1 新办法 2 老办法 3 字段判断
  • vue使用高德地图--附带移动获取当前城市信息

    高德地图 1 使用准备 申请密钥 vue使用 2 移动地图获取城市案例 注意事项 3 总结 1 使用准备 申请密钥 登录注册高德开放平台进入控制台 创建应用 申请key 生成key和安全密钥 2021之后key需要配合安全密钥使用 注意 安
  • 流媒体直播播放协议:HLS、RTMP、HTTP-FLV

    流媒体直播播放协议 HLS RTMP HTTP FLV 一 推拉流 二 协议介绍 1 HLS 2 RTMP 3 HDL HTTP FLV 一 推拉流 在开始之前 先把流媒体服务中的双端关系说一下 在一个完整的流媒体服务框架中 角色就是 两端