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握手过程的解释:
客户端向服务器发送C0数据包,数据包中包含客户端请求的RTMP版本。
然后客户端在没有等到服务器表示已接收到C0的情况下,发送包含了1536字节随机数据的C1。
此时,服务器必须等到它收到C0才能响应S0和S1(可选)。在这个阶段,服务器知道客户端所请求的RTMP版本。服务器响应S0和S1——它们本质上是C0和C1的副本。
然后客户端和服务器交换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ÿ…...
【分布式缓存学习篇】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),…...
华为OD机试模拟题 用 C++ 实现 - 快递货车(2023.Q1)
最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明快递货车题目输入输出示例一输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单…...
伺服三环控制深层原理解析
我们平时使用的工业伺服,通常是成套伺服,即驱动器和电机型号存在配对关系。 但有些时候,我们要用电机定转子和编码器制作非成套电机,这种时候,我们需要对驱动器进行各种设置才能驱动电机。 此篇文章将通过介绍伺服控制的三环控制原理入手来说明我们调试非成套伺服时需要…...
Cornerstone完整的基于 Web 的医学成像平台(一)
1.简介 Cornerstone是一个开源的基于Web的医学成像平台,它提供了一个易于使用的界面,可以用于加载、显示和处理医学图像。Cornerstone可以用于许多医学图像处理应用程序,例如计算机断层扫描(CT)、磁共振成像ÿ…...
老板让我在Linux中使用traceroute排查服务器网络问题,幸好我收藏了这篇文章!
一、前言 作为网络工程师或者运维工程师,traceroute命令不会陌生,它的作用类似于ping命令,用于诊断网络的连通性,不过traceroute命令输出的命令会比ping命令丰富的多,可以跟踪从源系统到目标系统的路径。 很多工程师…...
一文读懂【数据埋点】
数据埋点是数据采集领域(尤其是用户行为数据采集领域)的术语,指的是针对特定用户行为或事件进行捕获、处理和发送的相关技术及其实施过程。比如用户某个icon点击次数、观看某个视频的时长等等。 数据分析是我们获得需求的来源之一,…...
Qt图片定时滚动播放器+透明过渡动画
目录参考结构PicturePlay.promain.cppmyqlabel.h 自定义QLabelmyqlabel.cpp自定义QLabelpictureplay.hpictureplay.cpppictureplay.uistyle.qss效果源码参考 Qt图片浏览器 QT制作一个图片播放器 Qt中自适应的labelpixmap充满窗口后,无法缩小只能放大 Qt的动画类修改…...
手把手带你做一套毕业设计-征程开启
本文是《手把手带你做一套毕业设计》专栏的开篇,文本将会包含我们创作这个专栏的初衷,专栏的主体内容,以及我们专栏的后续规划。关于这套毕业设计的作者呢前端部分由狗哥负责,服务端部分则由天哥操刀。我们力求毕业生或者新手通过…...
万字解析 Linux 中 CPU 利用率是如何算出来的?
在线上服务器观察线上服务运行状态的时候,绝大多数人都是喜欢先用 top 命令看看当前系统的整体 cpu 利用率。例如,随手拿来的一台机器,top 命令显示的利用率信息如下 这个输出结果说简单也简单,说复杂也不是那么容易就能全部搞明白…...
芯驰(E3-gateway)开发板环境搭建
1-Windows下环境配置 可以在Windows上使用命令行或者IAR IDE编译SSDK项目。Windows编译依赖的工具已经包含在 prebuilts/windows 目录中,包括编译器、Python和命令行工具。 1.1.1 CMD SSDK集成 msys 工具,可以在Windows命令行中完成SDK的配置、编译和…...
HiveSql一天一个小技巧:如何巧用分布函数percent_rank()求去掉最大最小值的平均薪水问题
0 问题描述参考链接(3条消息) HiveSql面试题12--如何分析去掉最大最小值的平均薪水(字节跳动)_莫叫石榴姐的博客-CSDN博客文中已经给出了三种解法,这里我们借助于此题,来研究如何用percent_rank()函数求解,简化解题思路…...
wordpress创建页面失败/网址域名
点击上方蓝色字体关注我们 小 编 有 话 说Hello!我是你们的新朋友:米萌萌。这里是:米萌萌的知识库首先给大家介绍下米萌萌的知识库是干什么的米萌萌的知识库专注搜集市面上最新的网络课程 低价购课 众筹新课 原价几千几万的付费课ÿ…...
aspcms做双语网站修改配置/东莞网站制作公司联系方式
1. 1.js事项编程式跳转 2.在onload生命周期函数中接受参数 3. 调试接口请求必须是https协议,调试阶段可以设置不校验就可以用:...
自己做网站怎么选架构/威海seo优化公司
原标题:一起来捉妖:在线6小时被劝退?只需网络断开,跳过等待15分钟一起来捉妖这款游戏刚出来的时候就凭借着新颖的玩法吸引了大部分玩家的驻足,而且这个游戏也是让玩家们完全停不下手,不过之卿由于已经成年所…...
最靠谱的网站建设公司/广告传媒公司主要做什么
参加认证考试是相当多的人寻求职业发展的必经之路。对于绝大多数人来说,没有证书,是"万万不能"的。在国外,每增加一个认证证书都会带来薪水的提高。国内的薪资水平虽然没有国外那么高,但是相比较国内其他行业࿰…...
时时彩网站开发代理代码/最新注册域名查询
android:divider"drawable/shape"<!--分割线图片-->android:showDividers"middle|beginning|end" <!--分割线位置-->分割线如果是图片那就直接使用图片就行,如果要使用颜色就必须使用shape来显示,直接使用颜色或Color是…...
网站制作专业吗/常州网站推广
知识点:string删除最后一个元素也可以用pop_back()来实现 还有就是这一段得写在if内,当时sb了思考了一下才明白233 class Solution { public:vector<string>res;void gene(int n,int lc,int rc,string s){if(lcrc&&…...