流媒体协议之RTMP

news2024/11/15 15:39:09

一、RTMP 协议概述

今天我们要一起了解的这个协议叫 RTMP 协议,它并不复杂,对于拉流相关的协议,我们可以先思考一下拉流一般要交互什么,我理解有以下几项,

  1. 连接信息:包括服务器的地址、端口号等,以建立与流媒体源的连接。
  2. 认证信息:如果需要进行用户认证或授权访问,可能需要交互用户名、密码或令牌等认证凭据。
  3. 流标识:明确要拉取的具体流媒体内容的标识,例如频道号、视频 ID 等,这个也可以在协议中直接约定。
  4. 控制指令:例如播放、暂停、快进、快退等控制操作的指令。
  5. 媒体描述:指定所需的视频或音频质量,如分辨率、帧率、码率等。
  6. 缓冲设置:包括缓冲区大小、缓冲策略等,以优化流媒体播放的流畅性。
  7. 错误报告和状态反馈:向服务器报告拉流过程中出现的错误,同时接收服务器关于流的状态信息,如是否可用、是否中断等。
    知道了协议设计的目的,对协议的理解就更加方便了。

1.1 RTMP 协议

RTMP 是 Real Time Messaging Protocol( 实时消息传输协议) 的首字母缩写。该协议基于 TCP,是一个协议族,包括 RTMP 基本协议及 RTMPT/RTMPS/RTMPE 等多种变种。

RTMP(Real Time Messaging Protocol)实时消息传送协议是 Adobe Systems 公司为 Flash 播放器和服务器之间音频、视频和数据传输开发的开放协议。

作为应用层协议,RTMP是建立在TCP上的,在TCP建立完成后,RTMP通过握手,来见RTMP的connection。

在这个connection上,会传输一些控制信息,比如SetChunkSize,SetAckWinowSize,其中CreateStream命令会创建一个Stream连接,

RTMP 协议传输时会对数据格式化,而实际传输的时候为了更好地实现多路复用、分包和信息的公平性,发送端会把 Message 划分为带有 Message ID 的 Chunk,每个 Chunk 可能是一个单独的 Message,也可能是 Message 的一部分,在接收端会根据 Chunk 中包含的 data 的长度,message id 和 message 的长度把 chunk 还原成完整的 Message,从而实现信息的收发。 即RTMP基本的逻辑单元是Message,基本的传输单元是Chunk。

1.2、变种

它有多种变种:

  • RTMP 工作在 TCP 之上,默认使用端口 1935;
  • RTMPE 在 RTMP 的基础上增加了加密功能;encrypt
  • RTMPT 封装在 HTTP 请求之上,可穿透防火墙;http–rtmp
  • RTMPS 类似 RTMPT,增加了 TLS/SSL 的安全功能;

1.3 RTMP和RTSP的区别

RTMP 和 RTSP 都是流媒体传输协议,它们在实时音视频传输方面有着广泛的应用。以下是它们之间的主要区别:

  1. 实时传输协议:RTMP 是一种基于 TCP 的实时传输协议,而 RTSP 是一种基于 UDP 的实时传输协议。

  2. 传输方式:RTMP 是一种单向传输协议,信息只能从服务器端传输到客户端。而 RTSP 支持双向传输,允许服务器端和客户端之间进行实时通信。

  3. 控制协议:RTSP 是一种控制协议,它可以用于控制媒体流的播放、暂停、停止等操作。而 RTMP 不是一种控制协议,它只负责媒体流的传输。

  4. 安全性:RTMP 提供了较低的安全性,因为它使用 TCP 协议进行传输,容易受到中间人攻击。而 RTSP 提供了较高的安全性,因为它使用 UDP 协议进行传输,并支持加密和认证。

  5. 应用场景:RTMP 主要用于直播和视频点播应用,而 RTSP 主要用于实时视频监控和安防监控等应用。

二、RTMP协议详解

RTMP传输的数据被称为消息(Message),这些消息包括音视频数据和信令,但某些消息可能很大,所以这些Message还会被分块传输,这样的块被称为Chunk。Chunk中带有message id,用于指示它属于哪个消息,接收端根据这个id来组成完整的消息。

即RTMP基本的逻辑单元是Message,基本的传输单元是Chunk。

2.1 Chunk的基本组成

请添加图片描述

  • 基本头:基本头包含了分块的基本信息。chunk stream ID(流通道Id)和chunk type(chunk的类型)
  • 消息头:消息头包含了分块的扩展时间戳(如果有)和分块的长度信息。
  • 扩展时间戳:如果消息头中的时间戳字段取值为0xFFFFFF,则表示时间戳需要通过扩展时间戳字段来传输。*
  • 负载(Payload):负载部分包含了分块的实际数据,可能是音视频数据或者是控制信令。
2.1.1 Basic Header

包含了chunk stream ID(流通道Id)和chunk type(chunk的类型),chunk stream id⼀般被简写为CSID,⽤来唯⼀标识⼀个特定的流通道,chunk type决定了后⾯Message Header的格式。BasicHeader的⻓度可能是1,2,或3个字节,其中chunk type的⻓度是固定的(占2位),Basic Header是变⻓的,其⻓度取决于CSID的⼤⼩,在⾜够存储这两个字段的前提下最好⽤尽量少的字节从⽽减少由于引⼊Header增加的数据量。
长度如何计算再此不赘述。

2.1.2 Message Header

包含了要发送的实际信息(可能是完整的,也可能是⼀部分)的描述信息。Message Header的格式和⻓度取决于Basic Header的chunk type,共有4种不同的格式,由上⾯所提到的Basic Header中的fmt字段控制。其中第⼀种格式可以表示其他三种表示的所有数据,但由于其他三种格式是基于对之前chunk的差量化的表示,因此可以更简洁地表示相同的数据,实际使⽤的时候还是应该采⽤尽量少的字节表示相同意义的数据。以下按照字节数从多到少的顺序分别介绍这4种格式的Message Header。

  • type 0 :11bit

type=0时Message Header占⽤11个字节,其他三种能表示的数据它都能表示,但一般在chunk stream的开始的第⼀个chunk会采用这种类型。请添加图片描述
比如onMetaData Message
请添加图片描述

  • type = 1:7bit
    请添加图片描述
  • 其他
    其它类似,在此也不赘述了。
2.1.3 Extended Timestamp(扩展时间戳)

当chunk中的时间戳或者时间戳差值大于3字节能表示的最大数值(0xFFFFFF = 16777215)时,用这个字段来表示真正的时间戳。

2.1.4 Chunk Data

实际数据

三、RTMP的建连流程

1、建立一个连接,2、建立一个网络流

3.1 建立连接

包括握手和连接相关的参数设置。

3.1.1 握手

要建立一个有效的RTMP连接,首先要握手。客户端向服务器发送C0 C1 C2三个chunk,服务器向客户端发送S0、S1、S2三个chunk,才能开始数据传输。

RTMP协议没有规定这6个MESSAGE的顺序,但是需要保证几点。

1、客户端要收到S1才能发送C2

2、客户端要收到S2后才能发送其他信息

3、服务端要收到C0才能发送S1

4、服务端要收到C2后才能发送其他信息。

但实际中为了尽量减少通信的次数,一般发送顺序是这样的,
请添加图片描述
其中C0和S0主要是为了交互双方的RTMP协议版本
C1和S1是为了交互双方的时间戳和随机数据,时间戳用于计算双方协议交互的延迟(基本不用),随机数据用于在密钥协商过程中生成密钥。
C2、S2和C1、S1格式是一样的,主要是为了确认回复。

3.1.2 建立网络连接
  • S1. 发送connect到服务器,请求和服务应用实例建立连接
    在这里插入图片描述

  • S2. 服务端设置客户端的应答窗口大小、发送带宽大小、接收块大小
    请添加图片描述

  • S3 服务端响应创建网络连接的结果
    请添加图片描述

  • S4 客户端设置服务器的接收块大小

请添加图片描述

3.1.3 建立网络流
  • S1 客户端发送命令消息中的“创建流” (createStream) 命令到服务器端。
    请添加图片描述

  • S2. 服务器端接收到“创建流” 命令后, 发送命令消息中的“结果” (_result), 通知客户端流的状态
    请添加图片描述

  • S3. 客户端向服务器获取指定流的长度
    请添加图片描述

3.1.4 播放
  • S1 客户端发送播放请求play
    请添加图片描述
  • S2 服务端发送stream begin,告知客户端流id

请添加图片描述

  • S3 服务端开始发送数据
    在这里插入图片描述

四、RTMP和HLS以及HTTP-FLV的比较

请添加图片描述

五、总结

本文主要介绍了RTMP协议的相关内容,包括协议概述、协议详解、建连流程以及与其他协议的比较,RTMP是基于TCP的实时消息传输协议,是一个协议族,包括多种变种,变种包括RTMPT、RTMPS、RTMPE等,它们在功能上有所不同。。作为应用层协议,建立在TCP之上,通过握手建立connection,传输控制信息,如SetChunkSize、SetAckWinowSize等,CreateStream命令创建Stream连接。RTMP协议传输时对数据格式化,将Message划分为Chunk,接收端再还原。建连包括建立连接和建立网络流,建立连接包含握手和连接相关的参数设置。握手时客户端和服务器交互C0、C1、C2、S0、S1、S2六个chunk,并遵循一定的顺序和规则。立网络连接和网络流时,客户端和服务器会进行相应的消息交互和参数设置。播放时客户端发送请求,服务器响应并开始发送数据。

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

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

相关文章

每日Attention学习16——Multi-layer Multi-scale Dilated Convolution

模块出处 [CBM 22] [link] [code] Do You Need Sharpened Details? Asking MMDC-Net: Multi-layer Multi-scale Dilated Convolution Network For Retinal Vessel Segmentation 模块名称 Multi-layer Multi-scale Dilated Convolution (MMDC) 模块作用 多尺度特征提取与融合…

一家物流装备企业终止,业绩下滑严重,恐不符合创业板新上市标准

鸿安机械终止的原因如下:首先,报告期内鸿安机械的营业收入和净利润出现下滑趋势,公司最近一年净利润恐不达标,或许不能满足创业板更新的第一套上市标准;其次,鸿安机械经营业绩对比同行业可比公司&#xff0…

笔记整理—uboot启动过程(5)BL2板级初始化

上一章说到了uboot在BL2阶段大概都要干什么,也说到了为了实现这些要先进行内存排布,实现了这些后便可实现BL2部分的板级初始化。首先先来看一下init_fnc_ptr函数指针。 for(init_fnc_ptrinit_sequence;*init_fnc_ptr;init_fnc_ptr){if((*init_fnc_ptr)(…

一文带你了解html标签

一、文档结构标签 <html>&#xff1a;网页的根标签 &#xff0c;嵌套包含所有标签。 <head>&#xff1a;头标签&#xff0c;包含文档的元数据用于编写网页的修饰内容&#xff0c;附加信息。 <body>&#xff1a;身体标签&#xff0c;用于编写展示内容&…

精益工程师资格证书:2024年CLMP报名指南

随着全球对精益管理的需求日益增长&#xff0c;精益管理专业人士资格认证&#xff08;CLMP&#xff09;正成为越来越多精益工程师和精益管理人员提升职业竞争力的首选。作为一种注重管理而非生产的认证&#xff0c;CLMP不仅适用于制造业的专业人士&#xff0c;也吸引了各行业的…

Qt之窗口

目录 Qt窗口简介: 菜单栏 ⼯具栏 状态栏 浮动窗⼝ 对话框 Qt内置对话框 1.消息对话框QMessageBox 2.颜⾊对话框QColorDialog 3.⽂件对话框QFileDialog 4.字体对话框QFontDialog 5.输⼊对话框QInputDialog 总结 接下来的日子会顺顺利利&#xff0c;万事胜…

Android Studio:模拟器页面闪烁,手机模拟器输入画面闪烁 android studio闪屏

主要解决&#xff0c;android studio 启动app测试&#xff0c;输入数据时&#xff0c;手机画面就会闪烁&#xff0c;闪屏 1. 如图所示&#xff0c;依照顺序找到Edit &#xff0c;并点击Edit 2. 找到Graphics 选择为SoftWare &#xff0c;并保存修改即可 3. 如果此处不能选择S…

奇安信渗透测试岗位三面经验分享

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…

算法的学习笔记—二叉搜索树与双向链表(牛客JZ36)

&#x1f600;前言 在数据结构的学习过程中&#xff0c;二叉搜索树&#xff08;Binary Search Tree, BST&#xff09;是一个常见的主题。它不仅具有排序的特性&#xff0c;还为各类算法的实现提供了基础。然而&#xff0c;在某些特定的应用场景中&#xff0c;我们可能需要将二叉…

Web安全:SQL注入实战测试.(扫描 + 测试)

Web安全&#xff1a;SQL注入实战测试. SQL注入就是 有些恶意用户在提交查询请求的过程中 将SQL语句插入到请求内容中&#xff0c;同时程序的本身对用户输入的内容过于相信&#xff0c;没有对用户插入的SQL语句进行任何的过滤&#xff0c;从而直接被SQL语句直接被服务端执行&am…

Docker绑定挂载使用手册

目录 目标 官方文档 绑定挂挂载&#xff08;Bind mounts&#xff09; 简介 基本创建方法 控制读写权限&#xff08;默认有读写权限&#xff09; 为什么绑定挂载不适合做数据库持久化 为什么绑定挂载更适合做热部署 临时挂载&#xff08;tmpfs mounts&#xff09; 简介…

CSS中的元素布局与定位详细说明

1、前言 在CSS开发中&#xff0c;很重要的一个工作就是根据UI设计稿&#xff0c;进行元素的布局与定位&#xff0c;使得元素&#xff08;比如某一段文本、按钮、图片等&#xff09;显示在页面正确的位置。本文就元素的布局与定位方面&#xff0c;做一些讲解和说明。 2、元素的…

PHP易支付系统,支付系统源码下载,已测试,带多个支付接口

易支付系统源码&#xff0c;已测试&#xff0c;功能齐全&#xff0c;带有多支付接口&#xff0c;站内有对应的视频教程&#xff0c;详细教程 搭建出来的网站前端和后台还是比较美观的 PHP全开源易支付系统源码&#xff0c;一键安装版 搭建环境&#xff1a;PHP 5.4 以上 推荐7…

数学基础(九)

一、相关分析 相关分析&#xff1a; 衡量事物之间或称变量之间线性相关的强弱&#xff0c;并适当的统计指标表示出来的过程 相关系数&#xff1a; 连续变量的相关分析&#xff1a; 连续变量即数据变量&#xff0c;它的取值之间可以比较大小&#xff0c;可以用加减法计算出差…

Google Colab快速使用

Google Colab快速使用 1. 引言2. Jupyter笔记本的创建3. 上传代码和数据集4. Colab常规指令 1. 引言 Google Colab是谷歌提供的免费Jupyter&#xff0c;很类似于Linux系统这些在终端界面操纵的感觉&#xff0c;不需要深度学习环境配置就可以使用&#xff0c;完全基于云端运行。…

【celery-2】python-Django发送邮件-短信-钉钉通知

一 Python发送邮件 1.1 使用SMTP模块发送邮件 import smtplib from email.mime.text import MIMEText from email.header import Headermsg_from xxxqq.com # 发送方邮箱 passwd xxx # 填入发送方邮箱的授权码(填入自己的授权码&#xff0c;相当于邮箱密码) msg_to [xxx…

两种方式实现图片标记

效果图 第一种&#xff1a;通过动态添加dom元素实现标记 代码如下 // index.tsx import React from "react"; import "./index.less";export default function index() {const parentRef React.useRef<any>(null);const ulRef React.useRef<a…

网站技术分析必备插件Wappalyzer Chrome介绍

引言 在日常的开发过程中&#xff0c;开发者们经常会对访问的某些网站使用了哪些技术感到好奇。无论是网页的前端框架、后台的编程语言&#xff0c;还是数据库的类型&#xff0c;这些信息对于开发者优化自己的网站或者了解行业趋势都非常有用。然而&#xff0c;直接从浏览器获…

LLM开发之自动编码系统实战开发(一)-- MiniRBAC 集成

文章目录 前言&#x1f387;MiniRBAC部署启动日志修改更换Mysql创建数据库数据库连接修改查询 Next ✨ 前言&#x1f387; 首先这个系统呢&#xff0c;俺们目前是还没有做好的&#xff0c;但是相关的技术积累我们是完全没有问题的。当然这个系统其实将是我们这个项目&#xff…

Android 消息机制Handler完全解析(一)

提到Handler相信即使你是刚入行的android开发也会用过&#xff0c;可能你会觉得很简单&#xff0c;但是Handler中包含的内容真的不是你理解的那么简单&#xff0c;可能有些工作3-5年的同学也没有对其有很深入的了解。但Handler在android中的地位非常重要&#xff0c;并且几乎是…