RTMP协议详解

本篇博客主要讲解RTMP协议重点,包括握手、连接、消息类别以及解码后各类型帧的缓存帧数设置等内容。


本专栏知识点是通过<零声教育>的音视频流媒体高级开发课程进行系统学习,梳理总结后写下文章,对音视频相关内容感兴趣的读者,可以点击观看课程网址:零声教育


RTMP协议详解

    • 1. RTMP
    • 2. RTMP协议
    • 3.音视频解码后帧队列

1. RTMP

RTMP(Real Time Messaging Protocol)是一个应用层协议,主要用于在Flash player和服务器之间传输视频、音频、控制命令等内容。该协议的突出优点是: 低延时。
播放流程:
在这里插入图片描述

传输基本流程:

在这里插入图片描述

2. RTMP协议

2.1握手
RTMP握手分为简单握手复杂握手
实际实现中为了在保证握⼿的身份验证功能的基础上尽量减少通信的次数,⼀般的发送顺序如下所示,可以通过wireshark抓ffmpeg推流包进⾏验证:
| client | Server |
|---C0+C1---> |
|<--S0+S1+S2-- |
|----C2----> |
简单握手:
在这里插入图片描述
简单握手:

  • C1和S1,4个字节表示时间,4个字节0,从第9个字节开始为随机数。
  • S2是C1的复制,C2是S1的复制
  • C0和S0都有8个字节,代表协议版本号,C0(客户端版本)、S0(服务器版本),目前版本为3。

复杂握手:
复杂握手将简单握手中1528比特的随机数部分平分为两部分。
1.768比特的public key(公共密匙)
2.768比特的digest(32字节的密文)
复杂握手的Version部分不为0,服务器可以由此判断握手类型。
2.2 连接
不同的Application Instance可根据功能等进行划分,例如,直播->live,点播回放->vod。
在这里插入图片描述
2.3 创建逻辑通道
creatStream命令用于创建逻辑通道,用来传输视频、音频和metadata。
服务器的响应报文中会返回Stream ID,标识改Stream。
2.4 play
客户端发送play命令播放指定流。
想要立即播放,需要先清空play队列中的其他流,并将reset置为true。
2.5 删除流deleteStream
删除指定Stream ID的流,服务器就不用对这条命令发送响应报文
2.6 RTMP层次关键结构
在这里插入图片描述
对于FLV的tag而言,对应RTMP中每个message。
在这里插入图片描述
2.7 消息分类
消息主要分为三类: 协议控制消息、数据消息、命令消息等。

  1. 协议控制消息
    Message Type ID = 1 2 3 5 6和Message Type ID = 4两大类,主要用于协议内的控制
  2. 数据消息
    Message Type ID = 8 9 18
    8: Audio 音频数据
    9: Video 视频数据
    18: Metadata 包括音视频编码、视频宽高等信息。
  3. 命令消息
    Command Message ID = 20 17
    此类型消息主要有NetConnection和NetStream两个类。
    在这里插入图片描述

Chunk通过Chunk Stream ID判别自己所属的Message。同一个Chunk Stream ID必然属于同一个Message。
RTMP流中视频和音频拥有单独的Chunk Stream ID
比如音频的cs id=20,视频的cs id=21
接收端接收到Chunk之后,根据cs id分别将音频和视频“拼成消息”。

Message被拆分成一个或多个Chunk,然后在网络上一个接一个的进行发送。
默认Chunk Size是128字节

2.8 RTMP实质
•发送端
首先将数据加工成消息(中间物),然后再将消息分割成
hunk(加上Chunk Header),然后将Chunk通过网络发送出去。
•接收端
接收端将接收到的Chunk组装成消息。

2.9 RTMP Chunk Header
RTMP Chunk Header包含Basic HeaderMessage Header和Extended Timestamp三种,其长度不是固定的,分为:12 Bytes、8 Bytes、4 Bytes、1 Byte 四种,由RTMP Chunk Header2位决定。

前2 BitsHeader Length说明
0012 bytesMetaData流刚开始的绝对时间戳
视频帧流刚开始的绝对时间戳
音频流刚开始的绝对时间戳
connect控制消息
018 bytes常见类型
104 bytes比较少见
111 bytes偶尔会出现 频率远远低于8 Bytes

RTMP Basic Header 一般为1字节。

  • 一般情况下, msg stream id是不会变的,所以针对视频或音频, 除了第一个RTMP Chunk Header是12Bytes的,后续即可采用8Bytes的。
  • 如果消息的长度(message length)和类型(msg type id,如视频为9或音频为8)又相同,即可将这两部分也省去, RTMP Chunk Header采用4Bytes类型的。
  • 如果当前Chunk与之前的Chunk相比, msg stream id相同, msg typeid相同, message length相同,而且都属于同一个消息(由同一个Message切割成),这类Chunk的时间戳(timestamp)也是相同的,故后续的也可以省去,RTMP Chunk Header采用1 Byte类型的。

2.10 时间戳:

RTMP时间戳为相对于某个时间点的相对值,单位为毫秒(ms)

  • 时间戳的长度为32bit,不考虑回滚的话,最大可表示49天17小
    时2分钟47.296秒
  • Timestamp delta 单位也是毫秒,为相对于前一个时间戳的一个
    无符号整数;可能为24bit或32bit。
  • RTMP Message的时间戳 4个字节
  • 大端存储

rtmp流的chunk视频流(或音频流)除第一个视频时间戳为绝对时间戳外,后续的时间戳均为timestamp delta,即当前时间戳与上一个时间戳的差值。比如帧率为25帧/秒的视频流, timestamp delta基本上都为40ms。
在这里插入图片描述
一般chunk的时间戳timestamp3字节,当时间戳值超过0xFFFFFF时,启用Extend Timestamp(4字节)

音频:1024/48k=21.333333毫秒
call back间隔肯定是不匀称的。
帧差值矫正:
误差按浮点数做累加,当误差超过半帧的话,按照当前时间发送,误差清零。

3.音视频解码后帧队列

FrameQueue
解码后的数据量比较大,需要要控制解码后帧队列的大小
参考ffplay固定大小:

#define VIDEO_PICTURE_QUEUE_SIZE 3 // 图像帧缓存数量
#define SUBPICTURE_QUEUE_SIZE 16 // 字幕帧缓存数量
#define SAMPLE_QUEUE_SIZE 9 // 采样帧缓存数量
#define FRAME_QUEUE_SIZE FFMAX(SAMPLE_QUEUE_SIZE,
FFMAX(VIDEO_PICTURE_QUEUE_SIZE, SUBPICTURE_QUEUE_SIZE))

考虑到不同类型的帧数据量大小不同,数据量大的,缓存帧数应该少些。
图像帧缓存数量一般设为3,采样帧缓存数量一般设为9,字幕帧缓存数量设为16。

补充:

1.客户端的首帧秒开,本质上就是不做同步先把第一帧显示出来。
服务器首帧秒开:这个功能不能降低延迟 发送i帧本身就有延迟,

在这里插入图片描述

2.推流没有问题时,如果拉流不能正常播放:

  1. 没有声音: dump rtmp拉流后的数据是否可以正常播放
  2. 声音异常:是否有解码错误报告,重采样前的pcm数据是否正常
  3. 没有图像: dump rtmp拉流后的数据是否可以正常播放
  4. 画面异常:是否有解码错误报告, scale前的数据是否正常

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云短信提示被攻击怎么解决!!

你是否收到过这样的短信&#xff0c;【阿里云】尊敬的用户&#xff1a;您的IP: 实例名称&#xff1a; 受到攻击流量已超过云盾DDoS基础防护的带宽峰值&#xff0c;服务器的所有访问已被屏蔽&#xff0c;如果35分钟后攻击停止将自动解除否则会延期解除。详情请登录云盾控制台DDo…

2024第二届智慧教育和人类发展国际会议(ICSEHD2024)

2024第二届智慧教育和人类发展国际会议(ICSEHD2024) 会议简介 智慧教育对于提升教育质量、促进教育公平、推动教育现代化和数字化转型、培养创新人才以及推动教育理论的发展都具有重要的意义&#xff0c;对人类发展产生着深远的影响&#xff0c;人类发展是智慧教育的最终目的…

U盘文件损坏怎么恢复数据?4招快速恢复数据!

“我的u盘不知道是什么原因&#xff0c;好像出了点问题&#xff0c;如果u盘损坏了还有机会恢复数据吗&#xff1f;希望大家给我出出主意。” U盘&#xff0c;作为一种便携式存储设备&#xff0c;在现代社会的信息化浪潮中扮演着举足轻重的角色&#xff0c;我们会将很多重要的数…

python Pandas 操作

Pandas 介绍 Pandas 是一个功能强大的 Python 数据分析工具库&#xff0c;常用于数据处理与分析工作。它为 Python 提供了快速、灵活以及表达能力强的数据结构&#xff0c;旨在简化“实际工作中”的数据操作&#xff0c;使得 Python 成为一种强大而高效的数据分析环境。 核心特…

前端动态旋转地球背景

效果图 贴下源码 <template><div class"map-bg"><div class"canvas" id"canvs"></div><canvas class"canvasxk" id"canv"></canvas></div> </template><script setup …

开源即时通讯IM框架 MobileIMSDK v6.5 发布

一、更新内容简介 本次更新为次要版本更新&#xff0c;进行了bug修复和优化升级&#xff08;更新历史详见&#xff1a;码云 Release Notes、Github Release Notes&#xff09;。 MobileIMSDK 可能是市面上唯一同时支持 UDPTCPWebSocket 三种协议的同类开源IM框架。轻量级、高…

STM32 PWM 计数器模式和对齐

STM32 PWM 计数器模式和对齐 1. TIM高级定时器简介2. TIM计数模式2.1 向上计数2.2 向下计数2.3 中心对齐模式&#xff08;向上/向下计数&#xff09;2.4 重复计数 3. PWM输出模式3.1 举例看下PWM中心对齐模式&#xff0c;设置参数如下&#xff1a; 4. FOC中PWM相关设置说明4.1 …

【话题】软件开发的航海图:程序员的实用神器探秘

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景一、代码编写二、版本控制三、测试与调试四、部署与运维五、总结文章推荐 背景 在软件开发的广阔海洋中&#xff0c;每一位程序员都是一位勇敢的航海家&#xff0c…

ROS控制器插件及机器人模型

ROS中的控制器插件 ros_control 1、ROS为开发者提供的机器人控制中间件 2、包含一系列控制器接口、传动装置接口、硬件接口、控制器工具箱等 3、可以帮助机器人应用功能包更快速落地&#xff0c;提高开发效率 一、控制器管理 提供一种通用的接口来管理怒同的控制器 二、控…

教育部公示!9所“新大学”,来了

5月13日&#xff0c;教育部公示一批拟同意设置的本科高等学校。 根据《中华人民共和国高等教育法》《普通高等学校设置暂行条例》《普通本科学校设置暂行规定》《本科层次职业学校设置标准&#xff08;试行&#xff09;》等有关规定以及第八届全国高等学校设置评议委员会考察评…

SpringAMQP 发布订阅-TopicExchange

根据这个模型编写代码: RabbitListener(bindings QueueBinding(value Queue(name "topic.queue1"),exchange Exchange(name "itcast.topic",type ExchangeTypes.TOPIC),key {"china.#"}))public void listenTopicQueue1(String msg){Syst…

【一触即发】快来围观C3安全大会酷炫九宫格!

C3安全大会2024 2024年5月18日 南京扬子江国际会议中心 C3安全大会2024 即将揭幕&#xff01; 图解C3 | 九宫格 数智变革&#xff0c;“AI”正以其颠覆性力量&#xff0c;重塑我们对未来的定义。亚信安全邀您共襄盛举&#xff0c;见证这场于5月18日盛大开幕的C3安全大会2024…