目录
1 rtmp格式
Real Time Messaging Protocol(实时消息传送协议协议)是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的私有协议。 在RTMP协议中信令和媒体数据都称之为Message,包含Message head。RTMP基于TCP,在TCP三次握手完成后,RTMP也定义了自己的六次握手,主要用于版本适配、RTT计算;直播场景最低延时通常3秒左右。由于TCP的包长度受限于MTU(1500个字节),而RTMP的Message长度可能超过MTU,会采取分片,将消息体拆分成多个chunk data
RTMP 协议来的传输单元是 chunk。一个 RTMP 包就是一个 chunk。RTMP消息组成:包头,包体。包头可以是4种长度的任意一种:12, 8, 4, 1 byte(s).完整的RTMP包头应该是12bytes,包含了时间戳,AMFSize,AMFType,StreamID信息, 8字节的包头只纪录了时间戳,AMFSize,AMFType,其他字节的包头纪录信息依次类推 。包体最大长度默认为128字节,通过chunkSize可改变包体最大长度,通常当一段AFM数据超过128字节后,超过128的部分就放到了其他的RTMP封包中。

RTMP 协议最多支持 65597 个流(chunk)。
2 header
chunk header中Chunk stream ID 是用来区分消息信道的。CS ID(块流ID) 范围为: 3 ~ 65599。

Adobe建议的CS ID设置

AMFType消息类型
StreamID
StreamID是音视频流的ID,如果AMFType!=0x08或!=0x09那么 StreamID为0。
ChannelID 和StreamID之间的计算公式:StreamID=(ChannelID-4)/5+1 参考red5
例如当ChannelID为2、3、4时StreamID都为1当ChannelID为9的时候StreamID为2
基本头分为三种情况由Base Header第一个字节后六个bits决定
(后六个bits==0):基本头长度为2字节第二个字节表示块流ID
(后六个bits==1):基本头长度为3字节,第二三个字节表示快流ID
(1<后六个bits<=64):基本头长度为1字节,后6bits表示块流ID
3 chunk data
如果 AMFType = 0×09, 数据就是 Video Data。Video Data由多个video tag组成,一个video tag,包含:SPS,PPS,访问单元分隔符,SEI,I帧包

VideoTagHeader结构
AVCPacketType表示 VIDEODATA
IF AVCPacketType ==0 AVCDecoderConfigurationRecord(AVC sequence header)//包含sps,pps等信息。解码器stop之后再次start之前,如seek、快进快退状态切换等,都需要重新送一遍sps和pps的信息。AVCDecoderConfigurationRecord在FLV文件中一般情况也是出现1次,也就是第一个 video tag.
IF AVCPacketType == 1 One or more NALUs (Full frames are required)

编码器输出的裸音视频数据是不能直接用于推拉流的,RTMP直播通常采用FLV格式,FLV格式要求:
对于音频数据,在裸数据之前,必须增加1个字节的元格式,这个格式定义了采样率、采样精度、通道布局,对于AAC格式,还需要增加ADTS头。
对于视频数据,在裸数据之前,也必须增加1个字节的元格式,这个格式定义了编码器、帧格式,对于H264,还需要增加SPS和PPS。
4 rtmp推流
采用RTMP协议直播,通常延迟3秒左右,成本低
采用QUIC协议通常800毫秒,
RTC通常300毫秒左右,成本高

RTMP/QUIC/RTC延迟对比
ffmpeg -stream_loop -1 -re -i "abc.mp4" -vcodec h264 -acodec aac -f flv -y rtmp://127.0.0.1/live/buji2
wireshark抓包,若过滤rtmp,则无内容显示。过滤rtmpt

RTMP是一种实时消息协议,常用于Flash播放器与服务器之间的音视频传输。它基于TCP并有自己的握手过程,最小延迟约为3秒。RTMP消息由包头和包体组成,包头可有不同长度,而chunk是RTMP的传输单元。流ID和AMFType在header中定义,chunkdata包含如VideoData等信息。在推流中,如使用ffmpeg,原始数据需转化为FLV格式,添加必要的元数据。
3万+

被折叠的 条评论
为什么被折叠?



