前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手撕Rtmp协议细节(4)——connect消息

手撕Rtmp协议细节(4)——connect消息

作者头像
视界音你而不同
发布2020-05-20 00:42:38
1.7K0
发布2020-05-20 00:42:38
举报

我们继续来说rtmp协议哈。当rtmp客户端和rtmp服务端握手完成之后,客户端就会向服务端发送connect消息。connect消息的格式按照RTMP Header+RTMP Body的格式组织。其中RTMP Header的Type ID为0x14,表示以AMF0编码的command消息。

对于RTMP Body,connect的组织格式如下:

connect消息由四部分组成,首先是command name,用字符串类表示命令的类型,即"connect";在其之后紧跟着的是事务id,该值永远设为1;再之后是connect消息中承载的所有object,用来标识一些参数;再后是可选的用户参数。一般比较少用。command object部分就是按照AMF0的标准表示了多个字段,主要包含app、flashVer、tcUrl、fpad、capabilities、audiocodecs、videocodecs等字段。我们还是通过对抓包文件的分析,来熟悉这些字段:

1.概览

首先来个整体的感受:

图中所示是一条rtmp(connect消息),我们可以看到以0x03开头表示为Object数据,0x09表示Object的结尾,总共有app、flashVer、tcUrl、fpad、capabilities、audiocodecs、videocodecs、videoFunction这些字段。接下来我们一一来看:

2.祥探

01 应用程序 app

app是application的缩写,代表客户端要链接到的,rtmp服务器的应用程序,这个一般我们在nginx服务器的配置选项中可以看到。对于该object,首先使用app来表示此object表示的名称,之后按照AMF0格式来表示具体的值。此处app的值为rtmp_live,是字符串类型,占用9个字节。正好,此次请求的rtmp的应用程序确实是rtmp_live,可参照之前文章的rtmp配置文件。

02 版本 flashVer

flashVer表示flash播放器的版本号,同样首先通过一个字符串来表示object的类型;然后再用AMF0的编码格式对具体的值进行编码,此处是flash的版本号,采用字符串表示,值为"LNX 9,0,124,2"。

03 链接 tcUrl

服务器的URL地址,其格式为

protocol://servername:port/appName/appInstance

比如例子中服务器的url地址为

rtmp://192.17.1.200:1935/rtmp_live(此处省略了appInstance)

看抓包文件,我们可以看出,对于tcUrl字段的object,同样是先用一个字符串来表示类型,其后以AMF0的编码格式对具体的数值进行编码(此处还是字符串形式)。

04 代理标志 fpad

fpad是一个布尔值,用来表示是否使用代理。如果使用,值为true,否则值为false。抓包文件中还是首先用一个字符串表示Object的类型,然后按AMF0的格式进行编码。此处为Bool类型,所以比较简单,0x01表示布尔类型,Bool类型没有长度字段,占用一个字节,其后使用一个字节来表示true或者false,此处为false。

05 能力 capabilities

同样,先用字符串表示object的类型,然后再用跟着具体的值,此处为一个数值类型,值为15,即capabilities的值为15。

06 音频 audioCodecs

audioCodes表示支持的音频编码格式,支持的每一种格式用一个bit位来表示,所有的比特位进行或运算得到最终的值。以本抓包文件为例,codecs的值为4071,4071对应的二进制为 0000 1111 1110 0111。

4071 = 0x0001 | 0x0002 | 0x0004 | 0x0020 | 0x0040 | 0x0080 | 0x0100 | 0x0200 | 0x0400 | 0x0800。

然后我们再看下不同的bit位对应的codec编码器,如下图:

对照表,我们可以得出本次连接支持哪些格式的音频编码。简单举个例子,4071中包含0x0400,表明此次rtmp请求音频是支持AAC的,其他标志类似。

07 视频 videoCodecs

说完audioCodecs,再说videoCodecs就简单多了,同样的逻辑,同样的codec表示方式 。此抓包文件中videoCodec的值为252,对应的二进制表示为:

252 = 0x0040 | 0x0080 | 0x0010 | 0x0020 | 0x0040 | 0x0080

再对照videoCodecs的定义

以0x0080为例,我们得知此次rtmp连接针对视频支持H264编码。

08 帧搜索 videoFunction

videoFunction也比较简单,先用字符串表明类型,然后紧跟着一个number类型的数据,值为1。videoFunction的值为1,表示客户端可以执行精确到帧的搜索。

3.connect消息流

好了,这样客户端发送给server的connect消息就组装完成了。接下来我们简单说一下,客户端和服务端通过connect进行交互的一些流程:

下图为connect的消息流

  • 客户端发送connect命令到服务器,请求与服务端的application进行连接;
  • 服务端收到connect命令后,服务器会发送协议消息“Window Acknowledgement size”消息到客户端。服务端同时连接到connect中请求的application;
  • 服务端发送协议消息“Set Peer BandWidth”到客户端;
  • 客户端在处理完服务端发来的“Set Peer BandWidth”消息后,向服务端发送“Window Acknowledgment”消息;
  • 服务端向客户端发送一条用户控制消息(Stream Begin);
  • 如果连接成功,服务端向客户端发送_result消息,否则发送_error消息。

至此,关于connect的消息暂时到这,接下来我们分别看看“Window Acknowledgement Size”、“Set Peer BandWidtth”以及_result消息。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 视界音你而不同 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档