RTMP 协议解析 1
介绍
📖 什么是 RTMP?
RTMP协议(Real-Time Messaging Protocol,实时消息传输协议)是由Adobe公司(最初由Macromedia开发)设计的一种用于实时传输音频、视频和数据流的网络协议,主要用于直播和流媒体传输,最初是为了让 Flash Player 和 Flash Media Server 之间进行音视频和数据的实时传输。
现在虽然 Flash 被淘汰了,但 RTMP 这个协议因为其简单、低延迟、稳定的特点,依然在直播领域广泛应用,比如 OBS 推流、斗鱼、Bilibili、Twitch 都在用。
• 作用:RTMP用来实现音视频数据的实时传输,比如直播视频、在线音频等。它让客户端(如播放器)和服务器之间能快速、连续地交换多媒体数据。
• 工作层级:RTMP是应用层协议,依赖底层的传输层协议(通常是TCP)来保证数据可靠传输。
• 默认端口:通常使用TCP的1935端口进行通信,也有变种支持通过HTTP端口(80、443)传输以穿透防火墙。
• 多路复用和分包:RTMP会把数据分成许多小块(称为Chunk),每个Chunk带有标识信息,接收端再把这些Chunk组装成完整的消息,实现多路复用和高效传输。
• 双向通信:客户端和服务器之间可以相互发送命令和数据,比如客户端发出“播放”、“暂停”命令,服务器则推送视频流。
RTMP 播放,浏览器端已经不支持(需要 Flash,已经淘汰)。
🛠️ RTMP 的核心特点
特点 | 说明 |
---|---|
低延迟 | 通常能做到 1-2 秒,非常适合直播 |
分块传输 | 大文件(比如视频流)会被切成小块,实时传输 |
支持音视频同步 | 可以同时传输音频、视频、文字数据,保持同步 |
基于 TCP | 传输可靠,不会丢包,但速度比 UDP 稍慢一点 |
持久连接 | 建立一次连接后长时间保活,适合流式数据 |
📦 RTMP 的数据流程
RTMP 整个通信过程可以分为三步:
- Handshake(握手阶段)
- 建立 TCP 连接后,客户端和服务器通过握手确认彼此协议版本,完成初始化。
- Connect(连接阶段)
- 客户端发送一个 connect 命令,请求推流或拉流,比如指定应用名(app)、流名(streamName)、认证信息(token)等。
- Stream(数据传输阶段)
- 开始音视频数据传输,比如推送 h264 编码的视频流、AAC 编码的音频流,还有一些控制消息(比如 pause、seek、metadata 更新)。
🔥 常见的 RTMP 使用场景
场景 | 示例 |
---|---|
直播推流 | OBS 推流到斗鱼、虎牙、B站 |
直播拉流 | 播放器从服务器拉 RTMP 流 |
流媒体服务器内部通信 | Nginx-RTMP、SRS、Red5、Wowza 等服务器使用 |
实时弹幕推送 | 用 RTMP 的 data message 功能 |
📡 RTMP URL 的格式
rtmp://服务器地址:端口号/app/stream
🔍 RTMP 的几个子协议
协议 | 说明 |
---|---|
RTMPT | 把 RTMP 封装成 HTTP 请求(端口80,穿防火墙) |
RTMPS | 加密版 RTMP,用 SSL/TLS |
RTMPE | Adobe 自己的加密版 RTMP,半开源 |
⚡ 现在最流行的一种组合是:
- 推流用 RTMP(客户端推到服务器)
- 播放用 HLS 或 WebRTC(服务器转码输出给观众 HTTP-FLV)
软件播放
这里主要针对mac 平台的播放软件:
-
VLC Media Player
-
Live Stream Player
提供两个可以测试的 rtmp 流地址
rtmp://liteavapp.qcloud.com/live/liteavdemoplayerstreamid
rtmp://ns8.indexforce.com/home/mystream
📦 (标准直播系统):
主播 → RTMP 推流 → 直播服务器(比如 SRS) → 转码 + 分发 → → HTTP-FLV/HLS(观众拉流,单向)→ WebSocket(观众互动消息,双向)→ WebRTC(连麦,双向音视频)
流程链路
1. 🔥 建立 TCP 连接
首先,RTMP 是基于 TCP 的,所以:
- 客户端(比如 OBS、推流SDK)通过 TCP 连接到 RTMP 服务器(比如 SRS、Nginx-RTMP、Wowza)。
- 默认端口是 1935(可以改成443/80穿透)。
Client → TCP三次握手 → Server
2. 🔥 RTMP 握手(Handshake)
RTMP的握手分成3步(C0、C1、C2 + S0、S1、S2):
阶段 | 描述 |
---|---|
C0 + C1 | 客户端发送 1 字节版本号(C0) + 1536字节随机数据(C1) |
S0 + S1 + S2 | 服务器返回 1字节版本号(S0)+1536字节随机数据(S1),再返回一份确认(S2) |
C2 | 客户端最后发送一份确认 |
3. 🔥 连接请求(Connect)
握手成功后,客户端发送一个 connect 命令,告诉服务器:
- 我要连哪个应用(app,比如 /live)
- 使用什么流(stream key,比如 /live/stream123)
- 包含了很多信息(版本号、URL、认证token、编码格式要求等等)
服务器收到 connect 请求后,回复一个 _result 或 _error。
4. 🔥 建立流(CreateStream)
- 客户端再发 createStream 请求(可以理解成 “我要打开一个播放或推流通道”)
- 服务器返回一个 stream_id
- 这个 stream_id 后续用来标识当前的媒体流。
5. 🔥 推流或拉流(Publish / Play)
类型 | 动作 |
---|---|
推流(主播) | 发送 publish 命令(准备往服务器推送音视频) |
拉流(观众) | 发送 play 命令(准备从服务器拉取音视频) |
6. 🔥 音视频数据传输
这部分就是不停发 RTMP Message:
- 音频帧(Audio Message)
- 视频帧(Video Message)
- 元数据(Metadata Message,比如宽高fps变化)
每个消息有自己的 header 和 payload,服务器和客户端之间基于 TCP 保持通信
📦 连接和释放的关系
🔥 连接建立流程(Connection Setup)
TCP连接 → RTMP握手 → connect命令 → createStream → publish或play → 推流或拉流
整个连接生命周期是绑定的!
- 只要 TCP 连接存在,RTMP的 session 就存在。
- 流(stream)是基于连接之上的一个资源(stream_id标识)。
🔥 连接释放流程(Connection Teardown)
场景 | 触发条件 |
---|---|
正常断开 | 客户端发送 deleteStream 命令,告诉服务器我要关闭流;然后发送 close 命令断开连接;最后 TCP 四次挥手 |
异常断开 | 客户端断电、崩溃、网络异常,TCP连接直接断掉 |
服务器踢出 | 如果服务器检测到非法流、长时间空闲、认证失败,会强制关闭 TCP 连接 |
超时断开 | 有些服务器设置 idle timeout,比如 60秒无数据,自动踢掉 |
一旦 TCP 断开,RTMP session 和所有相关 stream 都被清理。
如下图所示:
[Client] [Server]| TCP connect ||------------------->|| RTMP handshake ||<------------------->|| connect ||------------------->|| _result ||<-------------------|| createStream ||------------------->|| _result(streamId)||<-------------------|| publish/play ||------------------->|| start streaming ||<===================>|| deleteStream ||------------------->|| close connection ||------------------->|| (TCP close) |
相关文章:
RTMP 协议解析 1
介绍 📖 什么是 RTMP? RTMP协议(Real-Time Messaging Protocol,实时消息传输协议)是由Adobe公司(最初由Macromedia开发)设计的一种用于实时传输音频、视频和数据流的网络协议,主要…...
c++初始化数组
1.前言 话说数组是n年前的事了,我为啥现在又提到它呢?因为很多人不会初始化数组,所以今天我来教教大家 2.初始化数组 初始化数组就是定义数组,就像这样 int a[5]{0}; 这样是a[0]到a[5]全都等于0 如果要输出这个数组…...
支持Win和Mac的批量图片压缩方法
软件介绍 如果你的图片太大,传输或上传总是卡壳,那就需要一款好用的图片压缩工具了。今天推荐的这款工具支持Windows和Mac双系统,简直是图片压缩界的"变形金刚"! 图压(图片压缩双系统版) …...
autodl(linux)环境下载git-lfs等工具及使用
一、git-lfs工具下载 #初始化git.lfs命令 curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash sudo apt-get install git-lfs git lfs install 二、 huggingface-cli工具下载及使用 Linux设置huggingface的镜像: ex…...
云原生--核心组件-容器篇-3-Docker核心之-镜像
1、定义与作用 定义: Docker镜像是一个只读的模板,包含运行应用程序所需的所有内容,包括代码、依赖库、环境变量、配置文件等。简单来说,Docker镜像是一个轻量级、独立、可执行的软件包,它包含了运行某个软件所需的所有…...
Dify与n8n深度对比:AI应用开发与自动化工作流的双轨选择
Dify与n8n深度对比:AI应用开发与自动化工作流的双轨选择 在数字化转型加速的2025年,Dify和n8n作为两大主流工具,分别代表了AI应用开发与自动化工作流领域的顶尖解决方案。本文将从核心定位、功能特性、使用场景等维度展开对比,为…...
AI算法优化建筑形态与能耗管理 实现方案和技术架构
以下是基于AI算法优化建筑形态与能耗管理的实现方案与技术架构,结合行业实践与前沿技术趋势,分层次解析核心要素及实施路径: 一、技术架构设计 1. 数据采集与感知层 多源数据融合 传感器网络:部署温湿度、CO₂浓度、光照、人流密度等传感器,构建实时数据采集体系(如北京…...
【互联网架构解析】从物理层到应用层的全栈组成
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现(Python网络请求)运行结果验证 三、性能对比测试方法论量化数据对比结果分…...
Redis和MQ的区别
redis是一个高性能的key-value数据库,支持消息推送功能,可以当做一个轻量级的队列服务器使用。 redis只是提供一个高性能的、原子操作内存键值队,具有高速访问能力,虽然可以做消息队列的存储,但不具备消息队列的任何功…...
多系统安装经验,移动硬盘,ubuntu grub修改/etc/fstab 移动硬盘需要改成nfts格式才能放steam游戏
笔记本一个系统,移动硬盘两个系统,当前系统sda4.jpg 移动硬盘需要再装一个linux会有boot/efi,启动的时候grub界面才能识别,单linux没有efi别的电脑识别不到 没efi甚至启动不了grub 按下f6.jpg 看看笔记本grub能不能识别得到移动硬…...
4.26学习——web刷题
把攻防世界的web做了20道左右,挑了几道学到东西的题目记录一下 攻防世界warmup 进到环境中读取源代码发先有个提示:source.php,进去看看 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$wh…...
Go 语言中的实时交互式编程环境
在 Go 语言中,确实有几种方法可以实现类似 Python REPL 的实时交互式编程体验,让你可以实时编写代码并查看输出,而无需每次都编译运行整个程序。 但是需要注意的是,由于 Go 是编译型语言,完全的实时交互体验不如解释型…...
动态规划求解leetcode300.最长递增子序列(LIS)详解
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1&#…...
冯·诺依曼和哈佛架构两种架构的总线组成及核心特点
在计算机体系结构中,哈佛架构和冯诺依曼架构是两种不同的存储与总线设计范式,它们的总线组成和访问方式有显著差异。以下是两种架构的总线组成及核心特点的详细分析: 1. 冯诺依曼架构(Von Neumann Architecture) 核心…...
7.学习笔记-Maven进阶(P75-P89)-进度(p75-P80)
1.MAVEN-01-分模块开发的意义 (一)分模块开发意义 模块可以按功能划分,也可以按团队划分,所以把domain的方法抽取出来,进行共享,从而提高开发 的效率。 (1)分模块开发的意义…...
Java——令牌技术
目录 一、何为令牌 JWT令牌 介绍 JWT组成 二、JWT用于验证用户登录 三、JWT令牌生成和校验 简单用法 1.创建生成密钥的方法 2.接着添加过期时间,密钥,BASE64解码密钥的属性以及生成token的方法,合并上面生成密钥的方法,下面…...
【含文档+PPT+源码】基于Python校园跑腿管理系统设计与实现
项目介绍 本课程演示的是一款基于Python校园跑腿管理系统设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Python学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.…...
Spring AI Alibaba - Milvus 初体验,实现知识库效果
先看效果 数据被存储在 milvus 中,包括原始数据和向量数据。 大模型使用向量化数据的回答: 环境准备 安装 milvus Milvus 是一款专为向量相似性搜索设计的高性能开源数据库。 本地测试环境可以直接 Standalone 模式安装,需要用到 docke…...
arcpy列表函数的应用
arcpy.ListDatasets() 该函数用于列出指定工作空间中的所有数据集(如要素数据集、栅格数据集等)。 语法: python arcpy.ListDatasets(wild_cardNone, feature_typeNone) • wild_card:用于筛选数据集名称的通配符。 • feat…...
上位机知识篇---时钟分频
文章目录 前言 前言 本文简单介绍了一下时钟分频。时钟分频(Clock Division)是数字电路设计中常见的技术,用于将高频时钟信号转换为较低频率的时钟信号,以满足不同模块的时序需求。它在处理器、FPGA、SoC(片上系统&am…...
Redis的两种持久化方式:RDB和AOF
Redis持久化概述 Redis作为内存数据库,数据存储在内存中。为了保证数据在服务器重启或宕机时不丢失,Redis提供了两种持久化方案: RDB(Redis Database):定时生成内存快照 AOF(Append Only File&…...
1位的推理框架bitnet.cpp
源码:https://github.com/microsoft/BitNet bitnet.cpp 技术解析 bitnet.cpp 是专为 低精度大语言模型(如 BitNet b1.58) 设计的官方推理框架,其核心特性如下: 一、架构优势 全栈优化引擎 提供高度优化…...
教育领域的AIGC革命:构建多模态智能教学系统
一、智能教育系统技术架构 1.1 教育场景技术需求 教学环节 传统痛点 AIGC解决方案 课程设计 耗时耗力,创新不足 跨学科教案自动生成 课堂互动 单向传授,参与度低 多模态交互式虚拟教师 作业批改 重复劳动,反馈延迟 全自动批改与个性化评语 学…...
Simulink 数据存储机制:Base Workspace、Model Workspace 与 Data Dictionary 的核心区别
1. 核心定位与设计目标 存储方式本质核心设计目标Base WorkspaceMATLAB全局内存空间临时数据交互,快速原型开发Model Workspace模型私有数据容器模型数据隔离,防止命名冲突Data Dictionary专业数据管理文件(.sldd)复杂系统数据治理,支持团队…...
TI---UART通信
一、SysConfig 中 UART 配置的核心参数与生成逻辑 1. 基础参数配置(图形化界面) 配置项功能说明生成代码影响模式选择主机模式(Master)/ 从机模式(仅部分芯片支持,如 UART 作为 I2C 桥接)生成…...
spark总结
文章目录 一 spark简介1.1 什么是spark1.2 spark运行过程1.2.1 组成1.2.2 过程1.2.3 事例(词频统计WordCount程序) 1.3 spark运行模式1.4 pyspark 二 SparkCore2.1 RDD介绍2.2 RDD编写2.3 RDD算子2.4 RDD的持久化2.4.1 为什么需要缓存和检查点机制&#…...
【随笔】地理探测器原理与运用
文章目录 一、作者与下载1.1 软件作者1.2 软件下载 二、原理简述2.1 空间分异性与地理探测器的提出2.2 地理探测器的数学模型2.21 分异及因子探测2.22 交互作用探测2.23 风险区与生态探测 三、使用:excel 一、作者与下载 1.1 软件作者 作者: DOI: 10.…...
补码底层逻辑探讨
在计算机里面以二进制进行存储,二进制并不能区分正负数 为了处理负数,人们想了很多办法 1.原码 首先,很直观的区分方法就是设置一个flag 在二进制前面加一个符号位,0是正、1是负 但是在电路里面处理这样的信号却很复杂&#…...
第二大脑-个人知识库
原文链接:https://i68.ltd/notes/posts/20250407-llm-person-kb/ Quivr-第二大脑一样的个人助手,利用AI技术增强个人生产力 将 GenAI 集成到您的应用程序中的个性化 RAG,专注于您的产品而非 RAG项目仓库:https://github.com/QuivrHQ/quivr Star:37.7k官网:https:/…...
泰勒展开概念解释(图优化SLAM中非线性系统的线性处理)
1. 泰勒展开 泰勒展开是一种用多项式近似复杂函数的数学方法,其核心思想是通过函数在某一点的各阶导数信息,构建一个多项式来逼近原函数,即通过函数在某一点x0的各阶导数值,构造一个多项式 P(x),使得该多项式在 x0 附近与原函数 f(x) 的值及其导数尽可能匹配,数学形式为…...
CANape与MATLAB数据接口技术详解
目录 CANape与MATLAB数据接口技术详解 一、数据互操作背景与意义 1.1 汽车电子开发中的测量需求 1.2 技术标准演进分析 二、CANape数据导出深度解析 2.1 MDF文件结构说明 2.2 转换流程优化建议 三、MATLAB数据处理进阶技术 3.1 数据质量评估脚本 3.2 数据可视化增强方…...
per-task affinity 是什么?
Per-Task Affinity(任务级CPU亲和性)详解 Per-Task Affinity 是 Linux 调度器提供的一种机制,允许将单个任务(进程/线程)绑定到特定的 CPU 核心(或核心集合)上运行,从而优化性能、减…...
基于先进MCU的机器人运动控制系统设计:理论、实践与前沿技术
摘要:随着机器人技术的飞速发展,对运动控制系统的性能要求日益严苛。本文聚焦于基于先进MCU(微控制单元)的机器人运动控制系统设计,深入剖析其理论基础、实践方法与前沿技术。以国科安芯的MCU芯片AS32A601为例…...
Network.framework 的引入,不是为了取代 URLSession
Network.framework 的引入,不是为了取代 URLSession 如果你感觉 Network.framework 的引入, 可能是为了取代 URLSession, 那你就大错特错了!这里需要非常准确地区分一下: 🔵 Network.framework 不是为了取代 URLSession。 &…...
gradle-缓存、依赖、初始化脚本、仓库配置目录详解
1.启用init.gradle文件的方法 在命令置顶文件,例如gradle --init-script yourdir/init.gradle -q taskName,你可以多次输入此命令来制定多个init文件把init.gradle文件放到USER_HOME/.gradle/目录下把以.gradle结尾的文件放到USER_HOME/.gradle/.init.d/目录下把以…...
提示词的神奇魔力——如何通过它改变AI的输出
一、引言:初识AI的惊艳与迷茫 最近这段时间,我像很多人一样,一头扎进了生成式AI的世界,尝试使用各种工具,从文字助手到图像生成器。一开始,我被它们的能力深深震撼,感觉就像突然拥有了一个无所…...
零基础上手Python数据分析 (24):Scikit-learn 机器学习初步 - 让数据预测未来!
写在前面 在前面的学习中,我们已经掌握了使用 Python、Pandas、NumPy、Matplotlib 和 Seaborn 进行数据处理、分析和可视化的全套核心技能。我们学会了如何从数据中提取信息、清洗数据、整合数据、探索数据模式并将其可视化呈现。 现在,我们站在了一个新的起点。数据分析不仅…...
React 与 Vue 虚拟 DOM 实现原理深度对比:从理论到实践
在现代前端开发中,React 和 Vue 作为最流行的两大框架,都采用了虚拟 DOM(Virtual DOM) 技术来优化渲染性能。虚拟 DOM 的核心思想是通过 JavaScript 对象模拟真实 DOM,减少直接操作 DOM 的开销,从而提高页面…...
结合五层网络结构讲一下用户在浏览器输入一个网址并按下回车后到底发生了什么?
文章目录 实际应用第一步:用户在浏览器输入 www.baidu.com 并按下回车1. 浏览器触发域名解析(DNS查询) 第二步:DNS请求的逐层封装与传输1. 应用层(DNS协议)2. 传输层(UDP协议)3. 网络…...
关于Code_流苏:商务合作、产品开发、计算机科普、自媒体运营,一起见证科技与艺术的交融!
Code_流苏 🌿 名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 🌟 欢迎来到Code_流苏的CSDN主页 —— 与我一起&…...
Webpack模块打包工具
1. 认识webpack的基本用法步骤创建项目->下载webpack webpack-cli -> npm init -y -> package.json的scripts中配置webpack默认打包入口:src/index.js默认打包出口: dist/main.js2. 认识webpack.config.js的基本配置loader -> 打包css,less…...
crossOriginLoading使用说明
1. 说明 此配置用于控制 Webpack 动态加载的代码块(chunk)(例如代码分割或懒加载的模块)在跨域(不同域名)加载时的行为。它通过为动态生成的 <script>标签添加 crossorigin 属性,确保符合…...
Linux系统性能调优技巧分享
在数字化时代,Linux 系统以其开源、稳定、高效的特性,成为服务器、云计算、物联网等领域的核心支撑。然而,随着业务规模的扩大和负载的增加,系统性能问题逐渐凸显。掌握 Linux 系统性能调优技巧,不仅能提升系统运行效率,还能降低运维成本。下面从多个方面介绍实用的性能调…...
在Windows11中配置Git+SSH环境,本此实践使用Gitee(码云),方法同样适用于其它绝大部分Git服务
1.下载并安装Git 进入官网下载 Git - Downloading Package 选择下载Standalone Installer安装包,看自己电脑是64-bit还是32-bit(一般都是64-bit) 双击安装包进行安装,Next 这里可以自定义安装路径 这里可以勾选添加桌面快捷方式…...
【软考-架构】14、软件可靠性基础
✨资料&文章更新✨ GitHub地址:https://github.com/tyronczt/system_architect 文章目录 软件可靠性基本概念软件可靠性建模软件可靠性管理软件可靠性设计N版本程序设计恢复块设计(动态冗余)双机容错技术、集群技术负载均衡软件可靠性测试…...
怎样理解ceph?
Ceph 是一个开源的、高度可扩展的 分布式存储系统,设计用于提供高性能、高可靠性的对象存储(Object)、块存储(Block)和文件存储(File)服务。它的核心思想是通过去中心化的架构和智能的数据分布策…...
《AI大模型趣味实战》智能Agent和MCP协议的应用实例:搭建一个能阅读DOC文件并实时显示润色改写过程的Python Flask应用
智能Agent和MCP协议的应用实例:搭建一个能阅读DOC文件并实时显示润色改写过程的Python Flask应用 引言 随着人工智能技术的飞速发展,智能Agent与模型上下文协议(MCP)的应用场景越来越广泛。本报告将详细介绍如何基于Python Flask框架构建一个智能应用&…...
Pygame字体与UI:打造游戏菜单和HUD界面
Pygame字体与UI:打造游戏菜单和HUD界面 在现代游戏中,用户界面(UI)是玩家与游戏互动的重要桥梁。一个精心设计的UI不仅能够提升游戏的视觉效果,还能增强玩家的游戏体验。Pygame作为一个强大的游戏开发库,提供了丰富的工具和方法来创建和管理UI元素。本文将详细介绍如何使…...
游戏引擎学习第246天:将 Worker 上下文移到主线程创建
回顾并为今天的工作做准备 关于GPU驱动bug的问题,目前本地机器上没有复现。如果有问题,昨天的测试就应该已经暴露出来了。当前演示的是游戏的过场动画,运行正常,使用的是硬件渲染。 之前使用软件渲染时没有遇到太多问题ÿ…...
系统设计(2)—Redis—消息队列—数据库—熔限降
Redis 缓存设计 在高并发系统中,缓存是提升性能、减轻后端负载的杀手锏。Redis 作为内存级的高性能缓存数据库,被广泛应用于各类系统设计中。利用 Redis,将热点数据存储在内存中,可以加速读写并大幅降低对后端关系型数据库的直接…...