RTMP的工作原理及优缺点

news2024/9/24 7:01:57

一.什么是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)以及音视频学习路线图等等。

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

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

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

相关文章

Windows 11 网卡MAC地址 | 机器地址 | 网络地址 为 0 | 00-00-00-00-00-00?手动修复……

一位同事反映,他的电脑今天上班开机无法上网,上周末还正常,请我帮忙检修。该同事的电脑安装的是Windows 11,检查网络连接的详细信息,发现IP地址、网关、DNS参数都正常,但物理地址为00-00-00-00-00-00。另外…

力扣每日一题(2023年2月)

2023年2月期每日一题第一天 (2325. 解密消息)第十六天(2341. 数组能形成多少数对)第十七天 (1139. 最大的以 1 为边界的正方形)第十八天 (1237. 找出给定方程的正整数解)第十九天 &a…

再度盈利,搜狐稳了?

2016年在宣布要用3年时间回归互联网舞台中心之后,很长一段时间内张朝阳积极活跃在各种社交媒体上,完全是一派“积极出山”的姿态。而后畅游从美股退市,搜狗“卖身”腾讯,一系列的收缩动作又似乎是在逐渐远离喧嚣。而在最近三年&am…

Zilliz @ GAIDC |Milvus:生产级 AI 数据库探索

2月26日,全球人工智能开发者先锋大会— AI 数据与开源论坛在上海举行,Zilliz 主任工程师刘力在现场发表了名为《Milvus:生产级 AI 数据库探索》的演讲。刘力开篇便提到,Milvus 致力于打造更为完善的 AI 生态体系。随后&#xff0c…

阿赵的MaxScript学习笔记分享五《UI组件使用篇》

大家好,我是阿赵。这个专题的内容比较多,所以抓紧时间更新。这是第五篇,UI组件使用篇。 这里主要是把maxscript的rollout窗体支持的UI组件列举一下,并每个组件写一个使用范例,以方便理解和查看。 1、位图bitmap 可以指…

Java中常用的七种队列你了解多少?

文章目录Java中常用的七种队列你了解多少?ArrayBlockingQueue队列如何使用?添加元素到队列获取队列中的元素遍历队列LinkedBlockingQueue队列如何使用?1. 创建SynchronousQueue对象2. 添加元素到队列3. 获取队列中的元素4. 遍历队列SynchronousQueue队列…

Unity Lighting -- Unity的光源简介

在主菜单栏中,点击Window -> Rendering -> Light Explorer打开光源管理器,这个标签页可以看到场景中所有的光源,包括每个光源的类型,形状,模式,颜色,强度,阴影等信息。 在主菜…

android unit test mock框架使用记录

写在前面 之前上班时,开发一个功能之后,还需要编写测试用例,使用的框架是mock。 为什么防止以后用到时忘了,在这里记录一下。 由于团队没有人使用Espresso进行unit test,所以本人对该框架并不熟悉。想了解该框架的使用…

WPF布局控件之DockPanel

DockPanel DockPanel&#xff0c;英文释义为停靠面板&#xff0c;那是怎么个停靠法呢&#xff1f;如下&#xff1a; <Window x:Class"LearnLayout.DockPanelWin"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http:/…

数字图像处理

文章目录图像复原上升阶跃边缘、下降阶跃边缘、脉冲状边缘和屋顶状边缘曲线及其一阶导数和二阶导数有哪些特征&#xff1f;Hough变换的基本思想是什么&#xff1f;基本概念图像增强灰度变换直方图&#xff1a;直方图特点matlab代码空间域滤波平滑空间滤波均值滤波器&#xff1a…

python如何实现多线程

今天本来打算学习学习多进程的&#xff0c;但是由于我现在的电脑没有Linux系统&#xff0c;无法通过Linux系统编辑一些多进程的程序&#xff0c;因此我打算从多线程入手。 多线程 我们的程序一般都是多任务的&#xff0c;如果你没有好好的利用好&#xff0c;运行时就会出现卡…

【读论文】TCL: an ANN-to-SNN Conversion with Trainable Clipping Layers

DAC 2021 背景 通过ANN2SNN的方法得到的SNN中&#xff0c;存在准确性和延迟之间的一种权衡关系&#xff0c;在较大的数据集&#xff08;如ImageNet&#xff09;上可能会有较高的延迟。 主要贡献 分析了转换后SNN精度与延迟之间存在权衡关系的原因&#xff0c;并指出了如何缓…

6587: 计算分段函数

描述本题目要求计算下列分段函数f(x)的值&#xff1a;输入输入在一行中给出实数x。输出在一行中按“f(x) result”的格式输出&#xff0c;其中x与result都保留两位小数。样例输入10样例输出f(10.00) 3.16提示C/C可在头文件中包含math.h&#xff0c;并调用sqrt函数求平方根&am…

JAVA入门教程||Java Scanner 类||Java 异常处理

Java Scanner 类 java.util.Scanner是Java5的新特征&#xff0c;我们可以通过 Scanner 类来获取用户的输入。 下面是创建 Scanner 对象的基本语法&#xff1a; Scanner s new Scanner(System.in); 接下来我们演示一个最简单的的数据输入&#xff0c;并通过 Scanner 类的 nex…

产品分析丨豆瓣APP

本文将从以下几个方面进行分析&#xff1a;1. 产品功能结构2. 竞品分析3. 用户分析4. 用户调研5. 功能分析与优化方案6. 总结01 产品功能结构产品架构由豆瓣的产品架构图可看出&#xff0c;豆瓣是兼具书影音的评分系统和兴趣社区&#xff0c;以广告、知识付费和电商业务作为商业…

图解LeetCode——剑指 Offer 52. 两个链表的第一个公共节点

一、题目 输入两个链表&#xff0c;找出它们的第一个公共节点。 二、示例 如下面的两个链表&#xff1a; 在节点 c1 开始相交。 注意&#xff1a; 如果两个链表没有交点&#xff0c;返回 null.在返回结果后&#xff0c;两个链表仍须保持原有的结构。可假定整个链表结构中没…

代码质量与安全 | ChatGPT能帮到你什么还有待探索,但人工智能真的可以帮你做自动化测试

当听到“人工智能”&#xff08;AI&#xff09;时&#xff0c;你会想到什么&#xff1f; 你可能会开始想象科幻电影中的先进的人形机器人或者未来科技&#xff0c;但是&#xff0c;人工智能聊天机器人程序Chat GPT的爆火已经证明&#xff0c;这种“未来主义”技术已经融入了我…

三个月自学自动化测试,薪资15K直接翻倍,鬼知道我经历了什么····

学习软件测试是迫不得已&#xff0c;幸好最后通过自己的付出&#xff0c;得到了满意的回报。希望大家能通过我的经历得到一些帮助和思路。 零基础自学遇到的第一个难题就是需要怎么学&#xff0c;刚开始一头雾水&#xff0c;只能先从网上买些书来看&#xff0c;但是收效甚微。…

Unity中获取地形的法线

序之前&#xff0c;生成了地形图&#xff1a;(42条消息) 从灰度图到地形图_averagePerson的博客-CSDN博客那末&#xff0c;地形的法线贴图怎么获取&#xff1f;大概分为两个部分吧&#xff0c;先拿到法线数据&#xff0c;再画到纹理中去。关于法线计算Unity - Scripting API: M…

第4讲 cameraserver.rc详解(下)

本讲是Android Camera Native Framework专题的第4讲&#xff0c;我们介绍cameraserver.rc详解&#xff08;下&#xff09;&#xff0c;包括如下内容&#xff1a;Android init语言简介cameraserver.rc详解serviceuser选项group选项ioprio选项task_profiles选项rlimit选项更多&am…