网页直播视频抓取工具下载(RTMP协议网络RTMP握手app要创建一个有效的RTMP连接)

优采云 发布时间: 2022-02-08 03:15

  网页直播视频抓取工具下载(RTMP协议网络RTMP握手app要创建一个有效的RTMP连接)

  作者:Elias Zhang,声网高级工程师,具有从Iaas层基础信息存储服务到paas层云服务的专业经验,喜欢python语言,习惯使用C#,熟悉基于CDN并结合CDN的业务产品架构,点播、直播、云导等。喜欢探索问题和研究创新,拥有5项国家发明专利。html

  直播是最常见的实时音视频场景,而RTMP是这个场景中最重要的协议之一,也是很多刚接触实时音视频的开发者需要了解的。本文将使用winshark工具抓包,分析RTMP协议的基本原理,帮助大家更容易理解。Python

  先给出RTMP协议的原文件……需要的时候可以参考一下~。服务器

  对于直播来说,接触最多也最重要的就是RTMP协议网络

  

  RTMP 步骤:架构

  1. 握手应用

  要创建一个有效的RTMP Connection连接,首先“握手”:客户端向服务端发送C0、C1、C2三个chunk(依次),服务器向客户端发送S0、S1、S2三个chunk(依次) ,然后可以进行有效的信息传输。RTMP协议本身并没有规定这6条Message的具体传输顺序,但是RTMP协议的实现者需要保证这几点:工具

  

  其实真正的包如下:orm

  

  我们可以看到 TCP 的三次握手,而 RTMP 是基于 TCP 的可靠传输。视频

  

  接下来,过滤 rtmpt 协议。跟着rtmp握手过程,我们发现真正的数据包是由C0+C1一起发送的;S0、S1 和 S2 一起发送。htm

  2. 创建一个网络连接

  

  

  a) 客户端将命令消息中的“连接”发送到服务器,请求创建与服务应用程序实例的链接。

  

  打开connect包,一个OSI5层协议模型。最后一个是RTMP协议发送connect连接消息。内容中收录推流地址名称,但可以观察到流名称还没有发送,地址有app名称。

  观察RTMP的头部

  

  StreamID 是每条消息的唯一标识符。在划分红色Chunk并将Chunk还原为Message时,就是根据这个ID来识别是否是同一条消息的Chunk。这里的值 0 表示该消息是最初的 0 消息。

  

  Chunk Stream ID:message会拆分多个chunk,同一个Chunk Stream ID必须属于同一个Message。

  

  message type id(message type id):表示实际发送的数据类型,如音频数据为8,视频数据为9。

  格式:指块类型。有4种不同的格式,其中第一个格式字段为0,可以表示其他三种格式所代表的所有数据,但是因为其余三种格式都是基于前一个chunk的差分量化表示,所以可以表示更简洁 实际使用中同样的数据还是应该用尽可能少的字节来表示。由于type0代表的是不同的数据,其余都是不同的,可以想象,如果找不到type0的包,就说明这个流肯定有问题。可以通过“rtmpt.header.format == 0”过滤。

  b) 服务器收到链接命令消息后,向客户端发送窗口确认大小协议消息,并链接到链接命令中提到的应用程序。

  c) 服务器向客户端发送设置带宽协议消息。

  d) 客户端处理完设置带宽协议报文后,向服务器发送Window Acknowledgment Size协议报文。

  e) 服务器将用户控制消息中的“Stream Begin”消息发送给客户端。

  f) 服务器在命令消息中发送“结果”(_result),通知客户端链路的状态。b~f 如图:在_result中我们可以看到连接已经创建成功

  

  在下一个包中,我们看到发出了releaseStream命令,其中的agora是流名,所以我们可以通过连接包connect和releaseStream来捕获一个推流地址。

  

  创建网络流 (NetStream)

  

  提示:网络流表示发送多媒体数据的通道。服务器和客户端之间只能创建一个网络链接,多个网络流可以复用这个网络链接。

  一个。客户端向服务器发送请求以创建流(createStream)。

  

  湾。服务端收到请求后向客户端发送_result(),响应建立流的消息。至此,NetStream成立。

  

  4. 播放

  

  a) 客户端将命令消息中的“播放”命令发送给服务器。

  

  b) 服务器收到播放命令后,发送设置块大小(ChunkSize)协议消息。

  c) 服务器在用户控制消息中发送“streambegin”通知客户端流ID。

  d) 如果播放命令成功,服务器在命令消息中发送“响应状态”NetStream.Play.Start & NetStream.Play.reset,通知客户端“播放”命令执行成功。

  

  e) 之后,服务器发送客户端播放的音视频数据。

  

  可以注意到,音频类型为 8,视频类型为 9。

  5. 发布

  

  推流从握手开始,与之前的步骤123一致。

  和第四步play的区别是netstream的命令改成publish

  

  

  关于本文,如果您在按照步骤或阅读过程中遇到任何问题,请点击此处跳转至原文直接与作者交流。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线