当前位置: 首页 > news >正文

RTMP的工作原理及优缺点

一.什么是RTMP?


RTMP(Real-Time Messaging Protocol,实时消息传输协议)是一种用于低延迟、实时音视频和数据传输的双向互联网通信协议,由Macromedia(后被Adobe收购)开发。RTMP的工作原理是:通过建立和维护RTMP客户端和RTMP服务端之间的通信路径来实现快速、可靠的数据传输。

RTMP最初用于Adobe Flash Player的媒体传输,但是众所周知,Flash在2020年12月已被弃用。这意味着RTMP也会随之消亡并尘封吗?当然不!

在现代视频传输场景中,RTMP依然占据一席之地,尤其在与转码器协同工作方面,这得益与RTMP所具有的低延迟和实时传输属性。

大部分具备行业标准的编码器(如http://encoding.com、Bitmovin、Harmonic和AWS Elemental等)都能够生产RTMP数据源。同样,Twitch、YouTube、Facebook Live等流媒体服务和Dacast、Ant Media、Wowza等直播平台都能接收RTMP推流。

本篇文章将深入了解:

  • RTMP的历史

  • RTMP的工作原理

  • 如何建立RTMP连接

  • RTMP的替代方案

  • RTMP的优点和缺点

事不宜迟,让我们先来了解RTMP协议的历史。

RTMP的历史

RTMP由Adobe推出,用于超级流行的Adobe Flash播放器中,数百万网站曾使用这款播放器向用户展示视频。在鼎盛时期,大约超过90~95%有视频内容的网站上都使用Adobe Flash播放器来播放视频。

Adobe对RTMP的定义如下:RTMP (实时信息传输协议)用于在Adobe Flash平台技术(包括Adobe Flash播放器和 Adobe AIR)间实现音频、视频和数据的高性能传输。现在,作为一种开放规范,RTMP可用于创建实现与Adobe Flash播放器兼容的AMF、SWF、FLV和F4V等开放格式的音频、视频和数据传输的产品和技术。——Adobe

然而,随着Flash的弃用,RTMP不再用于向Adobe Flash播放器传输视频,同时还要面临与基于HTTP的视频传输协议MPEG-DASH和HLS的竞争。但是,RTMP仍然在向编码器传输视频的过程中发挥着重要作用,我们在下文将会讲到。

RTMP的工作原理

正如我们在上文中所了解到的,RTMP是一种基于TCP的、用于数据、音频和视频传输的双向通信协议。

RTMP的工作原理是:通过建立和维护RTMP客户端和RTMP服务端之间的通信路径来实现快速、可靠的数据传输。

与基于HTTP的传输协议HLS和DASH的操作相似,RTMP也是将多媒体流分割成切片:通常情况下,音频为64字节,视频为128字节。切片的大小可以由客户端和服务端之间协商获得。

传统观点认为切片尺寸不应太大,也不应太小。较大的切片在写入操作中引起延迟,而太小的切片则会增加CPU的负载。

通过将视频流分割成切片,RTMP可以将来自不同视频流的切片交织在一起,并在单个连接上传输,这种方法被称为“多路复用”,与视频直播中的统计多路复用类似。不过在实际中,包含几个切片的数据包被交织在一起后,使得RTMP传输更加高效,并允许RTMP创建多个虚拟、可寻址的视频传输通道。在解码端,这些交织的数据包可以被解复用,从而获取到最初的音频和视频数据。

C++音视频开发学习视频:免費】FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发【文章福利】:音视频学习资料、视频和学习路线图资料、以及面试题(资料包括C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等),免費分享,如有需要的可以加君羊领取哦!~学习交流君羊994289133点击加入领取资料

RTMP连接设置:握手、连接、推拉流

现在,让我们一起来了解RTMP连接是如何建立的,从而帮助我们更好地理解RTMP协议的工作原理。RTMP建立连接可分为三步:握手、连接和推拉流

让我们分别看下这三个步骤。

第一步:握手

RTMP中的握手过程相对简单,在建立TCP连接后进行。在此握手过程中,每一方(客户端和服务端)发送三个数据包,分别为 C0、C1、C2 (客户端)和 S0、S1 、S2(服务端)。

下面是对RTMP握手过程的解释:

  1. 客户端向服务器发送C0数据包,数据包中包含客户端请求的RTMP版本。

  1. 然后客户端在没有等到服务器表示已接收到C0的情况下,发送包含了1536字节随机数据的C1。

  1. 此时,服务器必须等到它收到C0才能响应S0和S1(可选)。在这个阶段,服务器知道客户端所请求的RTMP版本。服务器响应S0和S1——它们本质上是C0和C1的副本。

  1. 然后客户端和服务器交换C2和S2,之后握手完成,连接建立。

第二步:连接

连接步骤发生在RTMP客户端和RTMP服务端之间的握手之后。在连接过程中,客户端和服务器使用AMF编码交换编码过的信息。

AMF代表Action Message Format,用于在Adobe Flash客户端和Flash媒体服务器之间发送信息。或者,程序员可以使用AFM序列化ActionScript和XML的对象图。AMF在RTMP流传输中用于客户端和服务器之间的通信,表明信息类型和内容。

下面的示例显示了由客户端向RTMP服务器发出的信息。其中使用了连接URL、音频编解码器、视频编解码器和所使用的AMF版本号。在此示例中,AMF的版本为3.0。

(Invoke) "connect"

(Transaction ID) 1.0

(Object1) { app: "sample", flashVer: "MAC 10,2,153,2", swfUrl: null,

tcUrl: "rtmpt://127.0.0.1/sample ", fpad: false,

capabilities: 9947.75 , audioCodecs: 3191, videoCodecs: 252,

videoFunction: 1 , pageUrl: null, objectEncoding: 3.0 }

RTMP服务器的响应信息:

(Invoke) "_result"

(transaction ID) 1.0

(Object1) { fmsVer: "FMS/3,5,5,2004", capabilities: 31.0, mode: 1.0 }

(Object2) { level: "status", code: "NetConnection.Connect.Success",

description: "Connection succeeded",

data: (array) { version: "3,5,5,2004" },

clientId: 1728724019, objectEncoding: 3.0 }

在这一步中,客户端和服务器还会交换Set Peer Bandwidth和Window Acknowledgement Size协议信息。当成功执行,这些信息会表示连接的建立,然后服务器就可以传输视频数据了。

第三步:推拉流

在RTMP握手和连接步骤后,RTMP客户端和RTMP服务器之间的连接已经建立,现在就可以传送数据了。为了实现数据的传输,RTMP规范定义了下面几个命令:

  • createStream

  • play

  • play2

  • deleteStream

  • closeStream

  • receiveAudio

  • receiveVideo

  • publish

  • seek

  • pause

在这些命令的帮助下,才有可能使用RTMP协议传输视频。现在你对RTMP连接的工作原理已经有了基本的理解,接下来让我们了解一些常用的RTMP变体。

RTMP的变体:RTMPS、RTMPT、RTMFP、RTMPE、RTMP Proper

在这一部分,我们将简单介绍用于特定目的的RTMP变体,让我们从RTMPS开始。

RTMPS: RTMPS只是基于TLS/SSL 连接的RTMP。与RTMPE相比,设置和使用RTMPS要复杂一些,但是能够确保一定程度的安全性。如果你计划使用RTMP将视频传输到Facebook Live,你需要使用RTMPS

RTMPE: RTMPE使用了包含Diffie–Hellman key exchange和HMACSHA256的行业标准加密。它生成了一对RC4密钥,其中:

  • 第一个密钥用于加密从服务器向客户端发出的媒体数据。

  • 第二个密钥用于加密向服务器发送的数据。

RTMP Proper: 是指使用1935端口、基于TCP的RTMP的别名。RTMPT: RTMPT建立在HTTP协议之上,是通过HTTP封装后的RTMP协议。它允许RTMP信息穿过防火墙,封装的信息可以是RTMP Proper、RTMPS 或 RTMPE 数据包。RTMFP: RTMPF基于UDP协议(而非TCP),而且没有使用RTMP Chunk Stream。RTMFP 设计用于直接在P2P之间进行低延迟、实时的音频和视频通信,而无需通过RTMP服务器。

二.RTMP中音频和视频的编解码器支持


在继续学习前,让我们一起来看下RTMP中的编解码器支持。头部文件说明了对于下列编解码器的支持:

  • 音频:AAC、MP3

  • 视频:H.264/AVC、FLV容器中的VP6

哪里支持RTMP?

一些商业和开源编码器以及流媒体引擎支持RTMP,无论是拉流,或生成RTMP 数据源(推流)。你可以使用:

  • OBS Studio, 免费的广播和直播软件,可以生成RTMP数据源

  • FFmpeg

  • http://Dacast.com

  • http://Bitmovin.com

  • Ant Media Server

  • Wowza

等其他更多的RTMP推拉流的解决方案。

RTMP推流替代方案

由于Adobe结束了对于Flash的支持,RTMP现在所面临的是不太确定的未来。对于推流而言,你还可以考虑其他替代方案。

HLS是可以替代RTMP的流行方案。HLS是流媒体行业中的公认标准,从编码器、打包器、加密(DRM)、CDN到设备上的播放,它获得了来自视频生态的广泛支持。

另一个选择是MPEG-DASH,它也是基于HTTP的视频传输协议。和HLS一样,DASH也获得了广泛支持,也可以看作RTMP的替代方案。

基于HTTP的协议会存在一个问题,那就是它们会增加系统时延。通常情况下,在HLS和DASH中,必须先生成一定数量的视频切片,才能创建DASH清单或者HLS播放列表。没有播放列表或者清单,播放器便无法理解生成的视频流。等待播放列表或者清单的过程增加了时延,通常情况下会对系统造成45秒~1分钟的延迟。

不过,人们正在开发低延迟的DASH和HLS协议,它们能够减少基于HTTP的流媒体时延,并能够缓解基于HTTP的流媒体协议所带来的问题。

原文 https://zhuanlan.zhihu.com/p/533802752

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

相关文章:

RTMP的工作原理及优缺点

一.什么是RTMP?RTMP(Real-Time Messaging Protocol,实时消息传输协议)是一种用于低延迟、实时音视频和数据传输的双向互联网通信协议,由Macromedia(后被Adobe收购)开发。RTMP的工作原理是&#…...

【数据结构与算法】——第八章:排序

文章目录1、基本概念1.1 什么是排序1.2 排序算法的稳定性1.3 排序算法的分类1.4 内排序的方法2、插入排序2.1 直接插入排序2.2 直接插入排序2.3 希尔排序3、交换排序3.1 冒泡排序3.2 快速排序4、选择排序4.1 简单选择排序4.2 树形选择排序4.3 堆排序4.4 二路归并排序5、基数排序…...

在linux中web服务器的搭建与配置

以下涉及到的linux命令大全查阅 https://www.runoob.com/linux/linux-command-manual.htmlvim命令查阅 https://www.runoob.com/linux/linux-vim.htmlscp命令https://www.runoob.com/linux/linux-comm-scp.html首先要有一个请求的服务地址用ssh 进入到linux系统中ssh 请求的服务…...

《Python机器学习》基础代码2

👂 逝年 - 夏小虎 - 单曲 - 网易云音乐 目录 👊Matplotlib综合应用:空气质量监测数据的图形化展示 🌼1,AQI时序变化特点 🌼2,AQI分布特征 相关性分析 🌼3,优化图形…...

如何基于MLServer构建Python机器学习服务

文章目录前言一、数据集二、训练 Scikit-learn 模型三、基于MLSever构建Scikit-learn服务四、测试模型五、训练 XGBoost 模型六、服务多个模型七、测试多个模型的准确性总结参考前言 在过去我们训练模型,往往通过编写flask代码或者容器化我们的模型并在docker中运行…...

9.1 IGMPv1实验

9.4.1 IGMPv1 实验目的 熟悉IGMPv1的应用场景掌握IGMPv1的配置方法实验拓扑 实验拓扑如图9-7所示: 图9-7:IGMPv1 实验步骤 (1)配置IP地址 MCS1的配置 MCS1的IP地址配置如图9-8所示: 图9-8:MCS1的配置 …...

软考高级系统分析师系列论文之十:论实时控制系统与企业信息系统的集成在通信业应用

软考高级系统分析师系列论文之十:论实时控制系统与企业信息系统的集成在通信业应用 一、摘要二、正文三、总结一、摘要 近年来,在应用需求的强大驱动下,我国通信业有了长足的进步。现有通信行业中的许多企业单位,如电信公司或移动集团,其信息系统的主要特征之一是对线路的…...

NIO与零拷贝

目录 一、零拷贝的基本介绍 二、传统IO数据读写的劣势 三、mmap优化 四、sendFile优化 五、 mmap 和 sendFile 的区别 六、零拷贝实战 6.1 传统IO 6.2 NIO中的零拷贝 6.3 运行结果 一、零拷贝的基本介绍 零拷贝是网络编程的关键,很多性能优化都离不开。 在…...

【PAT甲级题解记录】1151 LCA in a Binary Tree (30 分)

【PAT甲级题解记录】1151 LCA in a Binary Tree (30 分) 前言 Problem:1151 LCA in a Binary Tree (30 分) Tags:树的遍历 并查集 LCA Difficulty:剧情模式 想流点汗 想流点血 死而无憾 Address:1151 LCA in a Binary Tree (30 分…...

Android 获取手机语言环境 区分简体和繁体,香港,澳门,台湾繁体

安卓和IOS 系统语言都是准守:ISO 639 ISO 代码表IOS:plus.os.language ios正常,安卓下简体和繁体语言,都是zh安卓获取系统语言方法:Locale.getDefault().language手机切换到繁体(台湾,香港&…...

一文搞懂Python时间序列

Python时间序列1. datetime模块1.1 datetime对象1.2 字符串和datatime的相互转换2. 时间序列基础3. 重采样及频率转换4. 时间序列可视化5. 窗口函数5.1 移动窗口函数5.2 指数加权函数5.3 二元移动窗口函数时间序列(Time Series)是一种重要的结构化数据形…...

GeoServer发布数据进阶

GeoServer发布数据进阶 GeoServer介绍 GeoServer是用于共享地理空间数据的开源服务器。 它专为交互操作性而设计,使用开放标准发布来自任何主要空间数据源的数据。 GeoServer实现了行业标准的 OGC 协议,例如网络要素服务 (WFS)…...

Docker离线部署

Docker离线部署 目录 1、需求说明 2、下载docker安装包 3、上传docker安装包 4、解压docker安装包 5、解压的docker文件夹全部移动至/usr/bin目录 6、将docker注册为系统服务 7、重启生效 8、设置开机自启 9、查看docker版本信息 1、需求说明 大部份公司为了服务安全…...

《数据库系统概论》学习笔记——第七章 数据库设计

教材为数据库系统概论第五版(王珊) 这一章概念比较多。最重点就是7.4节。 7.1 数据库设计概述 数据库设计定义: 数据库设计是指对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构&#x…...

【Datawhale图机器学习】半监督节点分类:标签传播和消息传递

半监督节点分类:标签传播和消息传递 半监督节点分类问题的常见解决方法: 特征工程图嵌入表示学习标签传播图神经网络 基于“物以类聚,人以群分”的Homophily假设,讲解了Label Propagation、Relational Classification&#xff…...

【分布式缓存学习篇】Redis数据结构

一、Redis的数据结构 二、String 数据结构 2.1 字符串常用操作 //存入字符串键值对 SET key value //批量存储字符串键值对 MSET key value [key value ...] //存入一个不存在的字符串键值对 SETNX key value //获取一个字符串键值 GET ke…...

【跟着ChatGPT学深度学习】ChatGPT带我入门NLP

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...

RGB888与RGB565颜色

颜色名称RGB888原色RGB565还原色英RGB888[Hex]RGB888_R[Hex]RGB888_G[Hex]RGB888_B[Hex]RGB565[Hex]RGB565_R[Hex]RGB565_G[Hex]RGB565_B[Hex]黑色Black0x0000000000000x0000000昏灰Dimgray0x6969696969690x6B4DD1AD灰色Gray0x8080808080800x8410102010暗灰Dark Gray0xA9A9A9A9…...

常见的域名后缀有哪些?不同域名后缀的含义是什么?

域名发展至今,已演变出各种各样的域名后缀,导致很多网站管理人员在注册域名时不知该如何选择。下面,中科三方针对常见域名后缀种类,以及不同域名后缀的含义做下简单介绍。 什么是域名后缀? 域名是由一串由点分隔开的…...

LevelDB架构介绍以及读、写和压缩流程

LevelDB 基本介绍 是一个key/value存储,key值根据用户指定的comparator排序。 特性 keys 和 values 是任意的字节数组。数据按 key 值排序存储。调用者可以提供一个自定义的比较函数来重写排序顺序。提供基本的 Put(key,value),Get(key),…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...