音视频直播(一)

news2024/11/20 9:37:40

协议基础篇

  • 直播协议基础
    • 推流与拉流
      • 推流
      • 拉流
    • 直播传输协议
      • RTMP传输协议 && HTTP-FLV协议
        • 为什么RTMP做推流,反而很少做拉流?
        • HTTP-FLV协议
      • RTSP协议
      • HLS协议
      • SRT协议
    • WebRTC协议应用于直播

直播协议基础

从网络上搜寻到的有关推流与拉流的示意图
在这里插入图片描述
从推拉流和协议入手来讲解直播

推流与拉流

推流与拉流示意图:
在这里插入图片描述

其实可以简要的理解为推流就是直播端,而拉流就是客户端哦。

推流

推流:将直播的内容推送至服务器的过程。即指的是把采集阶段封包好的内容传输到服务器的过程。其实就是将现场的视频信号传到网络的过程。“推流”对网络要求比较高,如果网络不稳定,直播效果就会很差,观众观看直播时就会发生卡顿等现象,观看体验很是糟糕。要想用于推流还必须把音视频数据使用传输协议进行封装,变成流数据。常用的流传输协议有RTSP、RTMP、HLS等,使用RTMP传输的延时通常在1–3秒,对于手机直播这种实时性要求非常高的场景,RTMP也成为手机直播中最常用的流传输协议。最后通过一定的Qos算法将音视频流数据推送到网络断,通过CDN进行分发。

拉流

拉流:指服务器已有直播内容,用指定地址进行拉取的过程。即是指服务器里面有流媒体视频文件,这些视频文件根据不同的网络协议类型(如RTMP、RTSP、HTTP等)被读取的过程,称之为拉流,说的简单点,你观看优酷视频就可以看成是拉流,视频文件存储在优酷的服务器上面,你通过HTTP(或者RTMP/RTSP)协议,也就是网页的形式去获取视频观看,这就是拉流的过程,在这个过程中有三个要素:

  1. 服务器【提供视频文件存储的地方】
  2. 传输协议【就是你要通过什么方式传输视频】
  3. 读取终端【就是通过什么播放出来】

直播传输协议

流媒体中的传输协议有很多种,主要从开源流媒体协议与格式来说。(自定义不开源的直播协议,可以参考阿里云、腾讯云等云厂商的服务,如ARTC协议)

RTMP协议由Adobe公司开发,基于TCP协议,是Flash播放器和服务器之间音频、视频和数据传输的开放协议,目前主流的视频云服务都以RTMP为主要推流协议。
ARTC是阿里云提供的低延迟直播RTS(Real-time Streaming)解决方案使用的协议头。
SRT是一种基于UDT协议(一种基于UDP协议的变种)的开源低延迟视频传输协议,解决了TCP协议传输延迟高的问题。Haivision和Wowza合作成立SRT联盟,管理和支持SRT协议开源应用的组织。主要用于海外直播主流,是未来直播技术的主流协议。

在这里插入图片描述

RTMP传输协议 && HTTP-FLV协议

RTMP和HTTP-FLV都是建立在FLV封装之上的,主要区别是RTMP一般用作直播源推流,HTTP-FLV一般用作直播观看

  • RTMP: 一般用于直播源推流,直播系统内直播流数据传递
  • HTTP-FLV: 一般用于客户端直播流观看
  • RTMP、HTTP-FLV协议都是在FLV封装格式基础上的

RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。一种设计用来进行实时数据通信的网络协议。
该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。

为什么RTMP做推流,反而很少做拉流?

但是由于浏览器摒弃了Flash播放器,而且据说高并发下可能会出现一些不稳定的问题,所以RTMP一般只用作直播源推流、推流到直播CDN等场景。
在这里插入图片描述

每一个推流码地址唯一指向单个的直播活动。它由rtmp://开头,包含了上传服务器地址,上传目录名(应用app)和上传节点(房间),三部分组成。所有的rtmp地址都是这种结构组成,基本同一个平台不同直播的地址前两部分是不变的。
在这里插入图片描述
RTMP协议需要特定的流媒体服务软件,如SRS、加入了RTMP插件的Nginx等。
此类流媒体服务软件实际上就是音视频数据的中转站,数据一般只在内存中循环覆盖,不会写入磁盘。
如果要做直播回放,需要服务器自己开发音视频存储功能。
RTMP协议的延迟是比较低的,大概在1-3秒左右。
RTMP通信是建立在TCP长连接通道上的,在封装音视频数据时会强制切片,限制每个数据包的大小。
强制切片也一定程度保证了实时性。有一定的弱网抵抗能力,因为每个数据包都不会太大,所以当某个数据包校验失败时,重新发送的成本不会太大,但也由于合并数据包会加大CPU压力,所以是有一定的性能消耗的。
在这里插入图片描述
RTMP协议还有一些变种协议,如RTMPT、RTMPS等,这里不作展开讨论。

HTTP-FLV协议

地址是http://开头的,是基于HTTP协议的HTTP-FLV可以简单地理解为RTMP的HTTP协议版本。功能和工作原理上是相似的,上面提到的RTMP切片数据功能HTTP-FLV也是有的。
但是,HTTP-FLV协议一般只能用作拉流观看
HTTP-FLV协议的延迟也是比较低的,大概在1-3秒左右,但实际体验下来 HTTP-FLV延迟会略高于RTMP,但是HTTP-FLV相对RTMP适配更多的播放场景。

  • HTTP-FLV协议可以看作是RTMP的HTTP版本
  • RTMP工作原理相似
  • 延迟1-3秒(比RTMP协议延迟略高)
  • HTTP-FLV一般只用作客户端拉流观看

HTTP-FLV直播流一般需要需加入插件才能播放,如网页需要引入flv.js后,浏览器才能播放。HTTP-FLV直播流,这里需要特别感谢B站开源的flv.js,它促进了HTTP-FLV在浏览器的普及。

HTTP-FLV协议需要特定的流媒体服务软件,如加入了HTTP-FLV插件的Nginx等。
值得一提的是,Nginx的HTTP-FLV插件是包含RTMP功能的,所以一般HTTP-FLV的流媒体服务,推流是以RTMP协议,拉流是用HTTP-FLV协议。
在这里插入图片描述
现在比较流行的方案是,直播源推流是RTMP协议,直播拉流观看是HTTP-FLV协议

在这里插入图片描述

RTSP协议

RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学、网景和RealNetworks公司提交的IETF RFC标准。该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。
RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。HTTP与RTSP相比,HTTP请求由客户机发出,服务器作出响应;使用RTSP时,客户机和服务器都可以发出请求,即RTSP可以是双向的。RTSP是用来控制声音或影像的多媒体串流协议,并允许同时多个串流需求控制,传输时所用的网络通讯协定并不在其定义的范围内,服务器端可以自行选择使用TCP或UDP来传送串流内容,它的语法和运作跟HTTP 1.1类似,但并不特别强调时间同步,所以比较能容忍网络延迟。而前面提到的允许同时多个串流需求控制(Multicast),除了可以降低服务器端的网络用量,更进而支持多方视讯会议(Video Conference)。因为与HTTP1.1的运作方式相似,所以代理服务器〈Proxy〉的快取功能〈Cache〉也同样适用于RTSP,并因RTSP具有重新导向功能,可视实际负载情况来转换提供服务的服务器,以避免过大的负载集中于同一服务器而造成延迟。

HLS协议

HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议。是 苹果公司 QuickTime X和iPhone软件系统的一部分。

  • HLS协议一般只用作拉流观看,但是从严格意义上讲,HLS协议并不是流式协议。
  • HLS协议的文件由两部分组成,一是多个只有几秒长度的.ts碎片视频文件,另一个是记录这些视频文件地址的.m3u8索引文件,且这些静态文件都是直接写入磁盘的。

它工作原理很简单,就是通过HTTP协议下载静态文件。不同的是,把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的extended M3U (m3u8)playlist文件,用于寻找可用的媒体流。

具体的说,HLS观看地址是以http://开头、.m3u8结尾的,实际上这个地址就是索引文件的地址,客户端获取到索引文件后,就可以下载对应的碎片视频文件并开始播放了。

HLS只请求基本的HTTP报文,与实时传输协议(RTP)不同,HLS可以穿过任何允许HTTP数据通过的防火墙或者代理服务器。它也很容易使用内容分发网络来传输媒体流。

HTTP 协议一般指 HTTP(超文本传输协议)。超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是因特网上应用最为广泛的一种网络传输协议,所有的 WWW 文件都必须遵守这个标准。

  • 由于HLS协议实际上是通过HTTP协议请求文件的,且HLS相关文件是直接写入磁盘的,所以并不需要特殊的流媒体服务软件,使用Nginx等HTTP服务就可以了。
  • HLS协议可以用于点播和直播观看,其适配多种播放场景,一般加入插件就可以播放了,如网页加入HLS的js插件就可以播放了,苹果设备是原生支持HLS协议的。

在这里插入图片描述
点播的场景下,也就是普通网络视频观看的场景下。
.m3u8索引文件会记录所有的碎片视频文件地址,HLS在点播的场景下,优势是更加明显的。
由于HLS的相关文件是无状态的静态文件,且每个文件的大小是有限的,所以负载均衡、CDN加速的效果更佳明显。
HLS协议的点播视频,会比.mp4、.flv的视频更快地播放出来,且在加载中跳转视频也会更加顺滑。
在这里插入图片描述
直播的场景下,转码软件可以直接生成HLS相关文件到磁盘,客户端通过HTTP服务下载文件即可。
另外,也可以在Nginx加入RTMP插件,转码软件以RTMP协议推流到Nginx,再由Nginx生成HLS相关文件。
其中,后一种方案更加推荐,因为它对于前期研发和后期对接直播CDN的过度更加顺滑。
在这里插入图片描述
另外,直播场景下的HLS相关文件与点播是有些不同的

  • 视频流数据每几秒会打包成一个以.ts为后缀的碎片视频文件,每生成一个新的视频文件都会同步更新.m3u8索引文件。
  • 且碎片视频文件的个数是有上限的,当达到上限后,默认会将最旧的视频文件删除且更新.m3u8索引文件。
  • 所以在直播的场景下,客户端也需要不断定时重新获取.m3u8索引文件。
    在这里插入图片描述
    HLS协议在直播的场景下是没什么优势的。
    虽然HLS协议的直播流也可以适配很多播放场景,但是由于需要生成静态文件,直播延迟很大,大概在5-30秒左右,使用直播CDN的话,由于边缘节点同步等问题,直播延迟甚至可能会达到1分钟左右。
    当然HLS协议也有一定的优势,在直播时移,也就是直播转点播,或者录播,也就是点播转直播的场景, 理论上只需要修改索引文件就可以了。
  • HLS协议延迟5-30s,也可能会有1分钟延迟
  • HLS的直播优势是ts视频碎片文件可以一直保留不删除
  • 不需要花额外的性能保存录像
  • 直播转点播、录播都是更加简单的,只需要修改m3u8索引文件即可(不需要重新花费性能编解码)

另外,HLS协议的.m3u8索引文件支持二级索引,就是高清、标清、流畅等多个观看地址可以整合到一个索引文件。播放器可以根据当前带宽自动切换不同的观看地址,大部分网页播放器的“自动”也是因为这个。
在这里插入图片描述
这里补充一个HLS协议的小知识点。
由于HLS协议的视频文件、索引文件都是直接写入磁盘的 ,所以如果长时间且多个直播流同时处理,会造成磁盘写入压力过大,机械磁盘可能会磁道会损坏,固态硬盘的寿命会加速衰减。
这种情况下,最好挂载一段内存空间作为HLS相关文件的写入位置,则不会造成磁盘写入压力过大的问题。

挂载一段内存空间作为写入位置
Linux命令: mount -t tmpfs -o size=10g tmpfs /data
把文件写入/data,即可写入内存,而非磁盘
重启数据会消失,但可以做一些定时保存的措施

补充说明一下,HLS协议是苹果推出的标准,与HLS协议类似的还有MPEG-DASH协议 HLS、MPEG-DASH的工作原理都是差不多的,只是局部标准不一样,这里不作展开。

  • HLS是苹果公司发布的标准,MPEG-DASH是国际标准
  • 两者大致相同,只是细节存在差异

SRT协议

SRT协议我也不太了解,自己也没有开发SRT服务相关经历,只知是新一代最优秀的直播协议。
目前阿里云也有SRT的服务产品可直接购买,以下是SRT协议链接,大家可底下自行研究。

WebRTC协议应用于直播

WebRTC协议其实并不是为了直播场景而设计的,WebRTC是一种点对点的视频/语音通话协议。
由于WebRTC是基于UDP的,建立通信后,会不断以流式发送数据,所以延迟会比RTMP还要低。
在一些交互性较高的直播场景,如直播带货等场景,会使用WebRTC作为推流和观看协议 WebRTC的延迟理论上可以达到1秒内
在这里插入图片描述

  • WebRTC协议支持推流和拉流,地址一般是以webrtc:// 开头的,且推流和拉流地址一般也是一样的。
  • WebRTC虽然是点对点的协议,但是应用在直播场景的话,是需要搭建WebRTC服务器作为流媒体服务的,流媒体服务软件可以使用SRS。

在这里插入图片描述
SRS是一个比较流行的开源流媒体服务软件,目前4.0已经囊括了RTMP、HLS、WebRTC、HTTP-FLV等主流协议。

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

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

相关文章

树莓派5烧系统和ssh远程实现

1、硬件说明 树莓派5 64G micro SD卡读卡器 2、烧录系统过程记录 之前写过一篇pi4B烧录Ubuntu22.04的博客,这篇就简单记录备份下 2.1 去ubuntu官网在树莓派上安装Ubuntu | Ubuntu下载Ubuntu 桌面 24.04 LTS 我之前已经下好了就有个(1) 2.2 用读卡器把SD卡插到…

【C++ ——— 哈希】位图 | 布隆过滤器

文章目录 1、位图1.1位图概念 2.位图实现位图的应用1.一百亿个整数,设计算法找到只出现一次的整数?2.给两个文件,分别有一百亿个整数,我们只有1G内存该如何找到两个文件的交集?3.位图应用变形:一个文件有100亿个int&a…

Java八股文:程序员的“面试经”还是技术壁垒?

Java八股文:程序员的“面试经”还是技术壁垒? “八股文”,在中国古代科举考试中,指的是一种程式化的文章写作格式,内容空洞,缺乏创新。而如今,这个词语被赋予了新的含义,用来形容技术…

systemctl 添加自定义系统服务

以 “启动、停止、重启” boa web server为例: 1. 编写系统服务脚本 编写一个符合系统服务规范的脚本。这个脚本通常描述了服务的启动、停止、重启等行为。你可以使用shell、C、C、Java等语言来编写这个脚本。 # boa_server_run.sh:#!/bin/bashset -e …

软考随记(二)

I/O系统的5种不同的工作方式: 程序控制方式: 无条件查询:I/O端口总是准备好接受主机的输出数据,或是总是准备好向主机输入数据,而CPU在需要时随时直接利用I/O指令访问相应的I/O端口,实现与外设的数据交换 …

解决uni-app progress控件不显示问题

官方代码&#xff1a; <view class"progress-box"><progress :percent"80" show-info activeColor"red" stroke-width"10" /> </view> 进度条并不在页面中显示&#xff0c;那么我们需要给进度条加上宽高style"…

Appium安装及配置(Windows环境)

在做app相关自动化测试&#xff0c;需要使用appium来做中转操作&#xff0c;下面来介绍一下appium的环境安装配置 appium官方文档&#xff1a;欢迎 - Appium Documentation 一、下载appium 下载地址&#xff1a;https://github.com/appium/appium-desktop/releases?page3 通…

对未知程序所创建的 PDF 文档的折叠书签层级全展开导致丢签的一种解决方法

对需要经常查阅、或连续长时间阅读的带有折叠书签的 PDF 文档展开书签层级&#xff0c;提高阅览导航快捷是非常有必要的。 下面是两种常用书签层级全展开的方法 1、 FreePic2Pdf 1 - 2 - 3 - 4 - 5 - 6&#xff0c;先提取后回挂 2、PdgCntEditor 载入后&#xff0c;直接保存…

如何选择国产数据库?

ORACLE的强大是全方位的,作为甲方DBA,喝喝咖啡,看看报纸,开开会,临听一下ORACLE ACE吹水! 作为国企的DBA, CTO.基本上国企都算是传统行业,都是跑ERP系统,进销存系统.客户关系系统.基本上都是B2B业务. 直接面对普通老百姓的互联网业务非常少. 核心业务都是使用ORACLE,少量互联网…

官网:管它日薄西山or蒸蒸日上,气质这块,必须拿捏死死的。

在日薄西山的时候&#xff0c;网站建设面临着许多困难和挑战。市场竞争激烈&#xff0c;用户需求多样化&#xff0c;技术更新迅速&#xff0c;这些都要求我们在网站建设中拥有高尚的气质。 而在蒸蒸日上的时刻&#xff0c;网站建设同样需要我们拿捏好气质。只有坚持下去&#…

VScode远程连接linux服务器开发,误删了文件怎么找回。

VScode远程连接linux服务器开发&#xff0c;误删了代码文件 因为远程服务器大家都在用&#xff0c;没有足够权限去折腾。找遍了没找到方法&#xff0c;就告诉我远程的文件本地没有缓存啊&#xff01;我就差点开始重写代码了。 后来被我发现了TIMELINE功能&#xff0c;这个功能…

瓦罗兰特国际服 马来西亚服低价区有哪些 瓦罗兰特低价区排行

瓦罗兰特国际服 马来西亚服低价区有哪些 瓦罗兰特低价区排行 瓦罗兰特作为当今游戏圈内热度最高的一款游戏&#xff0c;在全世界范围内都有着许多的游戏玩家。游戏基础玩法延续了FPS经典的5v5玩法&#xff0c;同时开发商在不同的游戏角色上添加了不同的技能&#xff0c;使得游…

Qt xml学习之calculator-qml

1.功能说明&#xff1a;制作简易计算器 2.使用技术&#xff1a;qml,scxml 3.项目效果&#xff1a; 4.qml部分&#xff1a; import Calculator 1.0 //需要引用对应类的队友版本 import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 1.4 import QtScxml…

Springboot JVM监控 通过Promethus

Springboot内置了对Prometheus得支持&#xff0c;可以监测得点有&#xff1a; JVM各指标参数&#xff08;GC&#xff0c;堆&#xff0c;非堆等&#xff09;接口调用次数&#xff0c;延时系统内存&#xff0c;IO&#xff0c;CPU使用率 部署Prometheus和Grafana 准备一台2核4G…

HackTheBox-Machines--Sense

Popcorn 测试过程 1 信息收集 服务器开启80、443端口 80端口 访问 80 跳转到 443 – https://10.129.196.51/ &#xff0c;该页面是 pfSense 登录界面&#xff0c;默认密码是&#xff1a; admin/pfSense&#xff0c;使用默认账号密码登录失败 目录扫描 ./gobuster dir -u htt…

JavaWeb笔记整理+图解——Filter过滤器

欢迎大家来到这一篇章——Filter过滤器 监听器和过滤器都是JavaWeb服务器三大组件(Servlet、监听器、过滤器)之一,他们对于Web开发起到了不可缺少的作用。 ps:想要补充Java知识的同学们可以移步我已经完结的JavaSE笔记,里面整理了大量详细的知识点和图解,可以帮你快速掌…

期权高频交易能做吗?期权可以频繁交易吗?

今天带你了解期权高频交易能做吗&#xff1f;期权可以频繁交易吗&#xff1f;在期权交易市场&#xff0c;大部分人都知道不能频繁交易&#xff0c;就连不少投资新手都知道频繁交易是大忌&#xff0c;是错误的&#xff0c;是应该避免的。所以是不行的。 期权高频交易能做吗&…

学习信号和槽(1)

信号和槽函数 一、了解信号和槽的概念二、信号和槽的使用2.1、第一种方法2.2、第二种方法2.3、第三种方法2.4、第四种方法2.5、第五种方法 一、了解信号和槽的概念 信号&#xff08;Signal&#xff09;&#xff1a;就是在特定条件下被发射的事件&#xff0c;比如QPushButton 最…

OpenPCDet

一.简介 源码链接&#xff1a; https://github.com/open-mmlab/OpenPCDethttps://github.com/open-mmlab/OpenPCDet OpenPCDet 是一套基于PyTorch实现的点云3D目标检测代码库。&#xff08;也是个框架&#xff09; 设计思想&#xff1a;点云数据集&#xff08;KITTI、NuSce…

[深度学习]yolov10+bytetrack+pyqt5实现目标追踪

【简介】 利用YOLOv10、ByteTrack和PyQt5实现目标追踪是一个强大的组合&#xff0c;可以为用户提供一个交互式的实时目标追踪界面。以下是一个简化版的实现思路描述&#xff1a; 首先&#xff0c;YOLOv10是一个先进的目标检测算法&#xff0c;能够准确识别视频或图像中的目标…