diff --git a/2024-6-7.-.md b/2024-6-7.-.md index dfe21db..55c504c 100644 --- a/2024-6-7.-.md +++ b/2024-6-7.-.md @@ -34,4 +34,71 @@ RTMP可以在本身的基础上添加自定义的消息类型和控制命令来 2.2 RTMP数据块(Chunk) 数据块是RTMP协议传输的基本单位,用与客户端和服务端之间传递数据单元。在传输的过程中·数据单元会被分成多个数据块,以便有效的利用网络带宽减少网络延迟,提高实时性,每个RTMP数据块包含下面的部分。 +- 块头 +块头包含了块类型、块长度、时间戳、流ID等信息。块头的长度块类型和所包含的字段 + +- 负载 +实际的音视频数据片段或者控制信息。 + +根据格式类型,可分为四种格式,分别为: + +- 类型0,包含了完整的块头信息,用于传输一个新的数据单元。(适用于新消息) + +- 类型1,相比类型0省略了消息流ID(适用于同一流的后续消息) + +- 类型2,相比类型1省略了消息长度和消息类型ID(适用同一流的同类型消息) + +- 类型3,没有块头,表示与上一个数据块完全相同,仅负载部分内容不同 + +2.3 RTMP流控制和命令消息 +RTMP支持多种流控制和命令消息,用于实现流媒体播放、暂停、拖动等功能,流控制消息用于控制数据流的传输,包括数据流的处理,调节流传输速度和同步视频等。下面是常见的命令消息。 + +- connect:客户端想服务端发起请求,参数应包含应用名称、版本、支持的功能等等 + +- createStream:客户端创建一个新的流 + +- deleteStream:客户端删除一个流 + +- closeStream:客户端关闭一个流 + +- play:客户端请求播放流,参数应包含流名称、开始时间、结束时间、是否本地播放等。 + +- pause::客户端请求暂停或者恢复播放 + +- seek:客户端请求跳转到特定时间点 + +- publish:客户端向服务端发布一个流,用于直播,参数一般包含流名称 + +- onStatus:服务端向客户端发送状态信息,如播放开始、播放结束等。 +流控制和命令消息通过RTMP的控制流(默认为流ID为0的流)进行传输,确保此消息的优先级高于音视频数据。 + +2.4 握手 + +一个RTMP的connection由握手开始,RTMP的握手是由三个固定长度的块组成,而不是向其他协议一样带有报文的可变长度块。首先客户端会向发送C0、C1、C2(按序发送)的三个Chunk,服务端向客户端发送S0、S1、S2(按序发送)的三个Chunk,才能握手成功。以下是握手顺序 + +- 客户端要等收到S1之后才能发送C2 + +- 客户端要等收到S2之后才能发送其他信息,例如命令消息和音视频数据 + +- 服务端要等到收到C0之后发送S1 + +- 服务端必须等到收到C1之后才能发送S2 + +- 服务端必须等到收到C2之后才能发送其他信息,例如命令消息和音视频数据 + +2.5 建立连接 (NetConnection)和从参数交换 +在进行上诉的握手之后,客户端和服务端还要建立一个连接,用于音视频数据的传输和播放,以下是建立连接的主要流程 + +- 发送Connect命令,其中参数参数应包含应用名称、版本、支持的功能等等。 + +- 服务端响应,当服务端接受到Connect命令之后,会进行验证并返回一个“result”or“error”的响应消息。响应消息会包含一个事务ID,用于客户端和服务端之间的消息匹配,还会包含服务器的相关信息。 + +- 交换控制消息,在成功的建立连接之后,客户端和服务端可以相互发送控制消息,如Window Acknowledgement Size(窗口大小),设置Set Peer Bandwidth(对等带宽)等, + +- 创建流:客户端在、建立连接后需要创建一个或者多个流,用于传输音频、视频或者数据。 + +在经过以上的步骤客户端和服务器可以开始进行音视频数据的传输和播放,目前只是初步了解RTMP的流程,后续会对每一快内容进行深入,以填补RTMP知识体系! + +#未完成的任务 +还没有完全的观看SDserver项目的代码,没有对项目有一个非常清楚的认知,目前就知道SDK相关的内容。