流媒体RTMP协议解析
背景
当前用到的直播场景有很多, 比如视频通话, 个人直播, 赛事直播;直播的协议也有很多;
比如HTTP+FLV:流式tag+渐进式下载(理论延迟1-3s)
HLS: ts分片+索引管理(理论延时10s+,跟切片时间大小有关)
RTMP: tcp流+chunk块传输(理论延迟1-3s)
下面详细描述一下RTMP
RTMP(Real Time Messaging Protocol) 使用Flash Player作为播放器客户端; 协议有很多变种:
1.RTMP本身, 基于TCP.默认使用1935端口的明文协议;
2.RTMPS,通过TLS/SSL链接传输的RTMP
3.RTMPE,使用Adobe自有安全机制加密的RTMP
4.RTMPT,将RTMP封装在HTTP中,用于穿透防火墙,通常使用TCP的80和443端口;
5.RTMFP,基于UDP的RTMP
包格式
RTMP的逻辑处理基本单元是Message. 传输的基本单元是Chunk即消息块,多个消息块(也可能一个)拼接成一个Message; 如果一个有效的消息, 数据量超出当前ChunkSize的话, 会被拆分成多个分块来分批传输.而接收端会根据Chunk中包含的data长度, message id和message长度把chunk还原成完整的Message; 具体协议的字段就不详细描述了
步骤
- 握手
- tcp三次握手
- rtmp握手
根据抓包来分析:
Client->Server, 内容是C0+C1
Server->Client,内容是S0+S1+S2
Client->Server,内容是C2
C0和S0表示的是RTMP版本号
根据抓包来分析:
Client->Server, 内容是C0+C1
Server->Client,内容是S0+S1+S2
Client->Server,内容是C2
C0和S0表示的是RTMP版本号
这里我们可以看到, 还没发流名, 但是地址有app名: “media-gb-pc5d8467db66d4889b7c59b6d5d61df25/44010300001320000024”
RTMP包头里面的StreamID,是每个消息的唯一标识, 就是我们上面讲到的message和chunk; 同一个chunk streamid是属于同一个message的;
服务端在收到connect消息, 会向客户端发送Window Acknowledgement Size和Set Peer Bandwidth;
Window Acknowledgement Size: 通知客户端, 如果收到该大小字节的数据, 需要回复一个Acknowledgement. 设置大小是524288, 达到这个数据量的较少, 所以没有在抓包中也没看到客户端的ack回复;
Set Peer Bandwidth: 流量控制; 所以后面客户端收到了之后, 也会给服务端回一个Window Acknowledgement Size消息;
StreamBegin 用户控制消息
_result(‘NetConnection.Connect.Success’): 客户端发送connect消息后, 服务端向客户端发送了_result消息; 通知了客户端连接状态是success;
到这里, 连接就建立完毕了, 下面就是流的操作了;
建立网络流
服务器和客户端只建立一个网络连接, 多个网络流可以复用这一个网络连接;
createStream–创建逻辑通道;通道用于传输音视频;
result: Stream ID,用于唯一的标示该Stream
getStreamLength: 获取’‘3402000000131000001’'流的长度. 一个完整的推流地址, 到这里也就可以推出来了. connect+getStreamLength
PLAY/PUBLISH
Play: 播放指定流,等待服务端传输音视频数据;
publish: 开始上传音视频数据
服务端回包: streamBegin: 向客户端指示流传输开始;
onStatus: NetStream.Play.Reset消息只有在客户端发送play消息设置了reset标志才会发, 如果客户的请求的播放流不存在, 服务端应返回NetStream.Play.StreamNotFound. 当然这个一般业务层都会拦截;
音视频传输
到这里, 整个RTMP的主体流程就结束了;
参考文档
https://www.adobe.com/content/dam/acom/en/devnet/rtmp/pdf/rtmp_specification_1.0.pdf
流媒体RTMP协议解析相关推荐
- 流媒体-RTMP协议-rtmpdump-flv封装解析(一)
流媒体-RTMP协议-rtmpdump-flv封装解析(一) 流媒体-RTMP协议-librtmp库学习(二) 流媒体-RTMP协议-librtmp库学习-c++多线程实现rtmp推流flv文件(三) ...
- 通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程
作者:Elias Zhang 声网资深工程师,拥有从Iaas层的基础信息存储服务到paas层的云服务的职业经历,喜欢python语言,习惯使用C#,熟悉基于和结合CDN的业务产品架构,点播.直播.云导 ...
- RTMP协议解析(一) —— 基本了解
版本记录 版本号 时间 V1.0 2017.09.04 前言 大家都知道很多视频应用的app中都是使用RTMP格式的协议,这个是国际上共同使用的协议,我自己虽然做过了直播类型的app,但是从没时间深入 ...
- RTMP协议深度解析:从原理到实践,掌握实时流媒体传输技术
目录标题 1. 引言 1.1 流媒体传输技术的重要性 1.2 为什么选择RTMP协议 1.3 RTMP协议的发展与应用 2. RTMP协议基础 2.1 RTMP协议简介 2.2 RTMP协议与其他流媒 ...
- nginx搭建rtmp协议流媒体服务器总结
最近在 ubuntu12.04+wdlinux(centos)上搭建了一个rtmp服务器,感觉还挺麻烦的,所以记录下. 大部分都是参考网络上的资料. 前提: 在linux下某个目录中新建一个nginx ...
- RTMP 流媒体系统协议 简介
什么是RTMP协议 RTMP(Real-Time Messaging Protocol实时消息传送协议)的缩写,它是Adobe Systems公司为Flash播放器和服务器之间音频.视频和数据传输开发 ...
- 利用nginx搭建http和rtmp协议的流媒体服务器
利用nginx搭建http和rtmp协议的流媒体服务器 一.准备工作 1.安装依赖包: yum install gcc glibc glibc-devel libtool make openssl-d ...
- (转)rtmp协议简单解析以及用其发送h264的flv文件
Adobe公司太坑人了,官方文档公布的信息根本就不全,如果只按照他上面的写的话,是没法用的.按照文档上面的流程,server和client连接之后首先要进行握手,握手成功之后进行一些交互,其实就是交互 ...
- 基于RTMP协议的Flash流媒体网页直播播放器
本文记录一些基于Flash技术的网页播放器.基于Flash的网页播放器相比于其他网页播放器来说最大的优势就是"免插件安装"了,这一点可以很大的提高用户的体验质量. 主要是几种常用的 ...
- 流媒体-H264协议-编码-x264学习-相关概念x264编译及文件解析(一)
流媒体-H264协议-编码-x264学习-相关概念x264编译及文件解析(一) 流媒体-H264协议-编码-x264学习-主要结构体(二) 流媒体-H264协议-编码-x264学习-主要函数(三) 流 ...
最新文章
- pandas统计缺失值的个数
- Mac安装Open CC进行繁简转化
- Self Crossing
- 开启 ASA 5505 snmp协议
- PHP 5.3.0以上推荐使用mysqlnd驱动
- cpp存储类型说明符(storage class specifier)
- 虚拟打印机 android版,Doro PDF Writer
- 【机器人技术基础】第1章选择题
- xshell连不上阿里云服务器Connection closed by foreign host.解决办法
- TikTok(国际版抖音)时间线
- JavaScript案例:页面自动跳转到首页
- 如何防止QT程序未响应
- java 读取word页码
- winrar主要参数
- 超融合和服务器关系_超融合服务器是什么?和超融合一体机有什么区别?
- 枕上诗书-初入红尘,不知人间疾苦,
- Java 8计算一年前或一年后的日期
- OpenCV C++案例实战十九《制作电子相册查看器》
- 谷歌浏览器实现多开,单独cookie
- 3. 自然语言处理NLP:具体用途(近义词类比词;情感分类;机器翻译)