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

news2024/11/24 22:49:32

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

    • 一、推拉流
    • 二、协议介绍
      • 1. HLS
      • 2. RTMP
      • 3. HDL (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

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

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

相关文章

httpclient

1.什么是httpclient HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。 2.http请求(结合spring的注解) 2-1GET请…

相对位置编码之RPR式:《Self-Attention with Relative Position Representations》论文笔记

😄 额,本想学学XLNet的,然后XLNet又是以transformer-XL为主要结构,然后transformer-XL做了两个改进:一个是结构上做了segment-level的循环机制,一个是在attention机制里引入了相对位置编码信息来避免不同se…

AutoCAD Electrical 2022—源箭头和目标箭头

在一张图纸上插入源 箭头; 选中一根导线; 如果源和目标在同一张图纸上,则可以点击确定,插入目标箭头; 如果不在同一张图纸上,则点击否,后面在插入目标箭头; 在另一张图纸上插入目标…

学习笔记:引用

概念 引用的作用是给一个变量起别名 格式: type & 别名 原名 引用必须初始化,在初始化后不能改变 int &b;ba;错误 int& b a; bc;不是将b从a的别名变为c的别名 而是将c的值赋给a int a 10; int& b a; b 20;//用别名改数据&…

Apifox:详细使用教程,带你轻松拿捏

目录 Apifox简介 Apifox的安装与使用 Apifox新建项目的流程 编写接口文档 Apifox简介 我们在日常编程开发过程中经常实行的是前后端分离架构的模式,一个项目的落地会通过产品、开发、测试三方会审,对项目需求评审过后,前后端开发会制定一…

基于SpringBoot医院信息管理系统源码

hisystem 1. 用idea打开项目,并且配置maven下载依赖 2. 导入数据库 hisystem.sql 3. 修改application.yml数据库相关配置 4. 用户注册,验证邮件的邮箱考虑到安全问题,暂不提供授权码,如有需求可使用自己邮箱,开启POP3…

Vue3 - 路由 Vue-router 4.X(配置与使用教程)

目录前言安装配置准备工作配置路由基本使用路由传参 1路由传参 2路由传参 3SEO前言 在咱们 Vue2 时代,官方推荐咱们使用 vue-router 3.X 的库,如果是用脚手架创建的话,就直接默认集成到里面了。 Vue3 使用的是 vue-router 4.X 官方库&#xf…

[附源码]计算机毕业设计JAVA小超市进销存管理系统

[附源码]计算机毕业设计JAVA小超市进销存管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM my…

m扩频通信系统在瑞利信道中的误码率性能matlab仿真

目录 1.算法描述 2.matlab算法仿真效果 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 本课题,我们主要涉及到两个理论要点,第一个是瑞利衰落条件,第二个是扩频通信。下面分别对这两个理论进行介绍: 第一个是瑞利衰落条件&#x…

我们又重写了一个关键服务

#01 QueryCoord 组件介绍 QueryCoord 是 Milvus 中查询集群的中心调度节点,在用户将一个 Collection Load 到内存中时,QueryCoord 负责将该 Collection 的 Segment 调度到 QueryNode 集群中,以支持后续的查询。 QueryCoord 最核心的操作有4…

将egg项目部署至服务器

文章目录1.下载linux版本的node-v162.将node安装包从自己电脑上上传到自己的服务器3.在服务器中解压压缩包4.配置环境变量5.使文件生效6.将egg项目传到服务器指定目录下7.下载依赖8.npm start 运行不会占用终端 并且一直在运行 可以使用npm stop停用9.最后使用云服务器ip:端口号…

Linux22 --- 网络为什么要分层、使用tcp协议实现两个进程间通信的功能、IP地址转换函数

一、网络为什么要分层 1 1、分层的优点 1)各层之间是独立的。某一层并不需要知道它的下一层是如何实现的,而仅仅需要知道该层通过层间的接口(即界面)所提供的服务。由于每一层只实现一种相对独立的功能,因而可将一个…

Linux-Hadoop集群配置

文章目录一、配置Hadoop集群1、在master虚拟机上配置hadoop(1)编辑Hadoop环境配置文件 - hadoop-env.sh(2)编辑Hadoop核心配置文件 - core-site.xml(3)编辑HDFS配置文件 - hdfs-site.xml(4&…

1542_AURIX_TC275_CPU子系统_内核

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 我因为看了这个章节的开篇有些疑惑去看了内核手册,现在学习的进程终于又重新回归,回到了TC275这个MCU的学习上。 这里的几条笔记记录是隔了很久写的,前面…

【Java面试】HashMap死循环问题

问题 最近几道面试题被问了是否了解并发情况下JDK7中HashMap发生死循环,导致CPU占用100%的问题。 由于HashMap并非是线程安全的,所以在高并发的情况下必然会出现问题,这是一个普遍的问题。 如果是在单线程下使用HashMap,自然是没…

[MAUI] 开篇-初识MAUI

前言 在2020年5月, 微软宣布了MAUI跨平台框架, MAUI 是Xamarin.Forms演变而来, 这也就意味着, 如果你原来具备Xamarin.Forms开发经验, 你可以流畅的过渡到MAUI开发当中。 原本于2021年底发布的MAUI正式版被推迟到了2022年5月底发布。现在, 你目前可以通过安装VS2022 预览版进行…

Elasticsearch倒排索引

什么是正排索引? 如下图,有一张商品表(tb_goods): 对于mysql数据库来说,肯定会给“id”创建主键索引,然后根据“id”来查询对应的商品信息,而这种情况就被称为“正排索引” 现在有…

eMagin:当月产百万片时,4K MicroOLED成本将不是问题

在今年2022 SID显示周期间,Micro OLED微显示模组厂商eMagin曾展示一款专为超短焦VR头显开发的4K Micro OLED微显示屏,有趣的是,该显示屏连接的主板上印有STEAMBOAT字样,让人不禁怀疑它与Valve之间是否存在某种联系。甚至有猜测认为…

【Linux】8.0 多线程

文章目录1.0 Linux线程概念1.1 Linux线程基本概念1.2 Linux线程优劣介绍2.0 Linux线程控制2.1 pthread_create(创建线程)2.2 pthread_join(线程等待)2.3 pthread_exit(线程终止)2.4 pthread_detach(线程分离)3.0 线程id和LWP的关系4.0 Linux线程互斥4.1 线程互斥相关概念4.2 线…

JUC系列(五) 读写锁与阻塞队列

📣 📣 📣 📢📢📢 ☀️☀️你好啊!小伙伴,我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。 📒 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️,擅…