![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
手撕Rtmp协议
视界音你而不同
音视频开发者
展开
-
手撕Rtmp协议细节(11)——videoData
上一篇我们看了rtmp audio的数据结构,这一篇我们来一起看一看rtmp video的数据结构。老规矩,先上一个video数据的抓包文件,有个直观的感受。通过抓包文件,我们可以看到,熟悉的Rtmp Header + Rtmp Body的组织结构,Body中打包的是经过压缩的视频数据。Body中打包视频数据的方式也与音频类似。首先用一个字节表示视频数据的header,之后是压缩后的视频数据(压缩后的数据是使用FLV的标准进行封装的)。我们来看一下videoData中的header部分...原创 2020-05-28 09:21:34 · 1926 阅读 · 0 评论 -
手撕Rtmp协议细节(10)——audio
前面我们历经千难万险和重重障碍,接下来,我们音视频通信的二位主角终于要粉墨登场了,那就是音频君和视频君,这一篇我们来一睹音频君的风采。老样子,抓包文件先摆上来:说明:rtmp协议wireshark中过滤音频数据包的条件为:rtmpt.header.typeid == 0x08通过抓包文件,我们看到音频数据也是按照RTMP Header + Rtmp Body的组织结构来进行封装的。Header部分之前的文章解析过,我们主要来看Body部分。因为rtmp是Adobe公司开发的协...原创 2020-05-28 09:19:00 · 1020 阅读 · 1 评论 -
手撕Rtmp协议细节(9)——play拉流
1综述在客户端发起createStream命令之后,客户端收到服务端反馈的_result消息,接下来客户端就可以向服务端发起请求播放的指令,这个指令就是play。首先我们看一下官方给出的关于play的消息流示意图。首先我们来简单介绍一下关于play的流程,客户端向服务端发送play指令之后,服务端收到之后向客户端发送SetChunkSize消息,实际场景中大都在服务器回复客户端connect消息的时候一起发送setChunkSize消息;服务端向客户端发送Stre...原创 2020-05-20 19:11:41 · 1521 阅读 · 0 评论 -
手撕Rtmp协议细节(8)——publish推流
publish对于推流端,经过releaseStream,createStream消息之后,得到了_result消息之后,接下来客户端就可以发起publish消息。推流端使用publish消息向rtmp服务器端发布一个命名的流,发布之后,任意客户端都可以以该名称请求视频、音频和数据。我们首先来看一下publish消息的组织结构: commandName:使用string类型,表示消息类型(“publish”); transactionID:使用number类型表示事物ID;...原创 2020-05-19 19:44:36 · 2329 阅读 · 0 评论 -
手撕rtmp协议细节(7)——createStream
创建完RTMP连接之后就可以创建或者访问RTMP流,对于推流端,客户端要向服务器发送一个releaseStream命令消息,之后是createStream命令消息,对于拉流端,则要发送play消息请求视频资源。我们先来看看推流端的消息流程,当发送完createStream消息之后,解析服务器返回的消息会得到一个stream ID, 这个ID也就是以后和服务器通信的 message stream ID, 一般返回的是1,不固定。createStream我们来先看看createStream...原创 2020-05-19 19:43:22 · 1286 阅读 · 1 评论 -
手撕Rtmp协议细节(6)——connect后续三剑客
在讲解connect消息的时候,我们说过服务器收到connect消息之后,会向客户端发送Window Acknowledgement Size消息和Set Peer Bandwidth消息,这一篇就来介绍一下这两条消息。1.概览首先从抓包文件看一下:示例中服务器ip地址是192.17.1.200,客户端ip地址是192.17.1.92,客户端向服务器发送connect消息之后,服务器向客户端发送了Window Acknowledgement Size和Set Peer Bandw...原创 2020-05-19 19:42:04 · 1032 阅读 · 0 评论 -
手撕Rtmp协议细节(5)——result消息
rtmp客户端发送connect消息之后,rtmp server会给客户端发送_result消息,通过该消息通知客户端连接状态(success/fail)。这一篇我们就详细来讲讲_result消息。1.概览老规矩,我们先来看一个_result消息的抓包。可以看到,一个_result消息由4部分组成,类型标识,transaction ID,properties,response related information,这四部分均以AMF格式进行编码,我们一一来看:...原创 2020-05-19 19:40:42 · 746 阅读 · 1 评论 -
手撕Rtmp协议细节(4)——connect消息
我们继续来说rtmp协议哈。当rtmp客户端和rtmp服务端握手完成之后,客户端就会向服务端发送connect消息。connect消息的格式按照RTMP Header+RTMP Body的格式组织。其中RTMP Header的Type ID为0x14,表示以AMF0编码的command消息。对于RTMP Body,connect的组织格式如下:connect消息由四部分组成,首先是command name,用字符串类表示命令的类型,即"connect";在其之后紧跟着的是事务id,该值永...原创 2020-05-19 19:39:09 · 1496 阅读 · 0 评论 -
手撕Rtmp协议细节(3)——Rtmp Body
上一篇讲了RTMP数据包中关于Header的数据组织格式,不过一个完整的RTMP数据包除了Header之外,紧跟着的是RTMP Body,这一篇就继续来说一下RTMP Body的数据组织结构了。说到RTMP Body的数据包组织格式,就不得不提到AMF。AMF英文全称Action Message Format,是Adobe定义的一套用来进行数据打包的格式,主要的版本有AFM0和AMF3,不过发展至今,实际场景中AMF0一直用的比较多,AMF3相对少见,本篇就以AMF0为例来讲解了。...原创 2020-05-19 19:36:21 · 1146 阅读 · 0 评论 -
手撕rtmp协议细节(2)——rtmp Header
Rtmp协议握手完成之后,就可以进行数据交互了,但交换的数据格式需要一个组织的标准,发送端按照该标准进行数据的组装,接收方按照该标准进行数据的拆解,这样才能完成通信。rtmp的协议的数据包,总的来讲分为两大部分,一部分是Rtmp Header,另一部分为Rtmp Body,这一篇我们来主要讲解一下Rtmp Header的组织形式。RTMP header的长度不固定,可能的长度为12字节,8字节,4字节,1字节。具体长度为多少个字节,由RTMP header数据包的第一个字节的高2位决...原创 2020-05-19 19:34:36 · 1412 阅读 · 0 评论 -
手撕Rtmp协议细节(1)——握手
之前文章,我们介绍过基于rtmp的直播环境的搭建,接下来,我们一起来学习一下Rtmp协议的细节,由于协议本身比较琐碎,小编会将rtmp协议拆解为一个个的小的模块,通过本公号推送rtmp协议的系列文章,欢迎诸位关注,本篇首先来看看rtmp协议握手的部分。RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。该协议是应用层协议,基于TCP。RTMP是一种设计用来进行实时通信的网络协议,主要用来在Flash平台和支持RTMP协议的流媒体/交互服务器之...原创 2020-05-19 19:32:22 · 1102 阅读 · 0 评论