RTMP握手过程目的:
1.检验客户端和服务器端RTMP协议版本号
2.发了一堆数据,测试网络环境
RTMP分块
创建RTMP连接比较复杂,涉及消息分块chunk和AFM格式数据
Chunk Size
RTMP是按照chunk size进行分块,chunk size指chunk的实际数据大小。客户端和服务器有各自的chunk size,默认chunk size 128字节。通过命令:set chunk size来更改chunk size大小
在实际代码中,会把chunk size设置很大,如:4096,FFMPEG推流时候设置60*1000,这样设置好处避免频繁拆包组包,占用CPU;设置过大,如果包发送,丢失,播放器就会出现花屏或黑屏现象
Chunk Type
RTMP分成Chunk4种类型:由chunk basic header 高两位指定。
在拆包时候会把一条RTMP消息拆成Type_0类型开始的chunk,之后的包拆成Type_3类型的chunk。
RTMP中message分chunk
RTMP消息
推流
Connect消息
握手之后先发送一个connect命令消息,真实通信中要指定一些编解码的信息,这些信息是AMF格式发送
发送完connect命令之后,会发送一个set chunk size消息来设置chunk size的大小,也可以不发。
然后等待服务器对于connect的回应,一半是服务器返回chunk都读完组成完整的RTMP消息,进行下一步。
Create Stream消息
创建完RTMP连接之后创建RTMP流,客户端要向服务器发送一个releaseStream命令消息,之后是FCPbulish命令消息,在之后是createStream命令消息。当发送完createStream消息之后,解析服务器返回的消息会得到一个stream ID,这个ID也就是以后和服务器通信的message stream ID,一般返回的是1
Publish Stream
推流准备工作的最后一步是Publish Stream,就是向服务器发送一个publish命令,这个命令的message stream ID就是上面create stream之后服务器返回的stream ID,发完这个命令一般不用等待服务器返回的回应,直接下一步发送音视频数据。有些rtmp库还会发setMetaData消息,这个消息可以发液可以不发,里面包含一些音视频编码的消息
发布音视频
当以上工作都完成,就可以发送音视频了。音视频RTMP消息的都是按照flv-tag格式封的音视频包
关于RTMP的时间戳
RTMP时间戳在发送音视频之前都为0,开始发送音视频消息的时候保证时间戳是单增的就可以正常播放音视频。
关于Chunk Stream ID
RTMP的chunk stream ID是用来区分某一个chunk是属于哪一个message的,0和1是保留的。每次发送一个不同类型的RTMP消息时都要有不同的chunk stream id.