rtmp协议介绍

概述:

•tcp建立连接。

•rtmp握手。

•客户端与服务器对建立rtmp连接达成一致。

•创建rtmp流

•客户端与服务器对play或者Publish达成一致。

•客户端开始传送数据到服务器。

•消息结构简述

Tcp建立连接

Tcp三次握手

Rtmp握手

•客户端发送C0+C1一共是1537个bytes.

•服务端发送S0+S1+S2.

•客户端发送C2

•到此握手建立完成,双方收到C2和S2以后就可以发送命令了,C0,S0都占一个字节保存版本号,C1,S1占1536个字节一次是时间戳4bytes,0四个bytes,随机数填满。C2和S2占1536bytes,具体和C1差不多。

客户端与服务器对建立rtmp连接达成一致

•客户端发送connect

•服务器返回winacksize,set bandwidth,connect.success,onbwdone

客户端发送winacksize

创建rtmp流

•客户端发送createstream

服务端返回_result()

客户端与服务器对play或者Publish达成一致

•客户端发送play()

•服务器返回streatm begin onstatus(reset,start),access,onmetadata()

•客户端开始发送音视频数据

Chunk简述

•chunk大小是可以配置的,大的chunk在低带宽中会增加延迟,大的chunk会减少cpu消耗,小的chunk不利于高码率的流,他的大小应该在不同的场景有不同的设置。

•每个chunk有head和data,每个head有三个部分:basic header ,message header ,extened timestamp

Basehead简述

•baseheader保存的就是stream id.和chunk type。占1-3个字节,最大能支持3-65599的值,其他的0-2是保留值,其中0-2用了两个bit保存,剩下的都用来保存chunk stream id,当前两个bit保存的是0代表第二个字节被使用, csid的范围就是第一个字节剩下的6位+第二个字节的8位,当前两个bit保存的是1表示第一个字节剩下的6位+第二个字节的8位+第三个字节,当保存的是2那么其他的字节都不需要使用了就代表id是2而且这个代表消息chunk或者是command chunk,chunkstreamid在2-63被用来记录版本。

message header

•message header 占0,3,7或者11个字节,他比较复杂保存了type id等东西,命令控制,语音视频等数据的头都在这里。type0,占11个字节里边保存了时间戳,这个字段只需要看懂下面的图就可以了

•type0 数一下一行正好是32位,也就是4个字节,这里是2行+3/4行,正好是8个字节+3=11个字节,注意一个message的第一个chunk必须是type0.

•还有一个type3 就是没有head的情况。

•以上这4种type其实是在传输过程中精细化管理的体现,比如type2,他剪掉了其他的属性,因为他前面的包和他的包,这些属性都是一样的,没必要再传,就省掉了,依次类推。

•chunks的组成是由messages组成的,流发送前会把每个message放到一个chunk,

•当message比较大的时候会切分成多个chunk这个时候采用type3.

•当连续的message正好size, stream ID and spacing in time(时间间隔)都相同的时候就采用type2.

•需要注意两个名词timestamp,timestamp delta,这两个字段是不同的,timestamp指的是当前的时间戳,timestamp delta指的是和上一次相比多多少的值。

•比较一个例子容易明白:

•分析他就看head data的字节数,11是type0,3是type2,0是type3.

•另外,上图的chunk里边第一个是type0,第二个是type2,剩下2个是type3,假如第二个的delta和第一个type0的时间戳的数字正好相等,那么第二个就不是type2而写成type0,因为可以省略delta了。

•协议控制消息,内容分为1,2,3,5,6,用于通知对方,4的时候是用户控制信息,此时的chunk stream ID的值必须是2, message stream id必须是0.

•    1表示:set chunk size

•         type id是1,payload部分(也就是chunk data部分)保存的是要设置的值需要32位。

•    2 表示:Abort Message

•         stream id保存在playload部分 需要32位

•    3 表示:Acknowledgement

•      当上次收到的bytes的个数正好等于最大的窗口数的时候,必须发送这个命令,代表已经拿到的字节数+1,类似于tcp里边的ack。

•5 Window Acknowledgement Size

•发送这个命令的时候,对方必须发送Acknowledgement,参数是32位

•6 Set Peer Bandwidth

•还有一些特殊的message types

•20(amf3)/17(amf0) Command Message

•包含:connect, createStream, publish, play, pause,onstatus, result

•Data Message (18, 15)

•Shared Object Message (19, 16)

•Audio Message (8)

•Video Message (9)

•Aggregate Message (22)

•以上18,15.。。。22看看文档就行了。

•  具体的参见官方文档

•用户控制信息:

•  Payload 前16位保存事件,后边保存相关数据。

•message type 控制着play load内容的含义。

看到connect对象就不用看了下面的都知道。

by 一休摸鱼

时间: 2024-08-24 18:31:49

rtmp协议介绍的相关文章

[转]流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)

[转]流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls) http://blog.csdn.net/tttyd/article/details/12032357 RTP 参考文档 RFC3550/RFC3551 Real-time Transport Protocol)是用于Internet上针对多媒体数据流的一种传输层协议.RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式.RTP 协议常用于流媒体系统(配合RTCP协议),视频会议和一键通(Push to Tal

流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls

http://blog.csdn.net/tttyd/article/details/12032357 RTP 参考文档 RFC3550/RFC3551 Real-time Transport Protocol)是用于Internet上针对多媒体数据流的一种传输层协议.RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式.RTP 协议常用于流媒体系统(配合RTCP协议),视频会议和一键通(Push to Talk)系统(配合H.323或SIP),使它成为IP电话产业的技术基础.RTP协议

流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)

RTP 参考文档 RFC3550/RFC3551 Real-time Transport Protocol)是用于Internet上针对多媒体数据流的一种传输层协议.RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式.RTP协议常用于流媒体系统(配合RTCP协议),视频会议和一键通(Push to Talk)系统(配合H.323或SIP),使它成为IP电话产业的技术基础.RTP协议和RTP控制协议RTCP一起使用,而且它是建立在UDP协议上的. RTP 本身并没有提供按时发送机制或其它

rtmplib rtmp协议过程分析

转自:http://chenzhenianqing.cn/articles/1009.html 写的很好,收藏如下,向作者致敬! 没事碰到了librtmp库,这个库是ffmpeg的依赖库,用来接收,发布RTMP协议格式的数据. 代码在这里:git clone git://git.ffmpeg.org/rtmpdump 先看一段通过librtmp.so库下载RTMP源发布的数据的例子,从rtmpdump中抽取出来.使用的大体流程如下: RTMP_Init主要就初始化了一下RTMP*rtmp变量的成

nginx搭建rtmp协议流媒体服务器总结

最近在 ubuntu12.04+wdlinux(centos)上搭建了一个rtmp服务器,感觉还挺麻烦的,所以记录下. 大部分都是参考网络上的资料. 前提: 在linux下某个目录中新建一个nginx目录. 然后进入该目录去下载搭建环境所需要的一些资源包. 此处在 /root/  目录下新建一个nginx目录即: /root/softsource/ 注意:依赖包和工具包需要下载,请在良好的网络环境下安装,否则在网速不好的情况下容易下漏掉,造成后面安装失败 ====================

流媒体协议介绍

RTP 参考文档 RFC3550/RFC3551 Real-time Transport Protocol)是用于Internet上针对多媒体数据流的一种传输层协议.RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式.RTP协议常用于流媒体系统(配合RTCP协议),视频会议和一键通(Push to Talk)系统(配合H.323或SIP),使它成为IP电话产业的技术基础.RTP协议和RTP控制协议RTCP一起使用,而且它是建立在UDP协议上的. RTP 本身并没有提供按时发送机制或其它

C++实现RTMP协议发送H.264编码及AAC编码的音视频,摄像头直播

C++实现RTMP协议发送H.264编码及AAC编码的音视频 RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系Flash Player和RtmpServer,如FMS, Red5, crtmpserver等.RTMP协议可用于实现直播.点播应用,通过FMLE(Flash Media Live Encoder)推送音视频数据至RtmpServer,可

将OBS录制数据通过RTMP协议引入到自己的程序中

最近在window是平台下,做了一功能实现通过OBS采集音视频,并通过RTMP协议将其编码压缩后的数据接入到自己的程序中来,因OBS软件自带有很强大的游戏录制和桌面录制的功能,以及输入.输出音频设备数据的采集并混音的功能,目前斗鱼游戏直播也是使用的此软件作为录制工具. OBS软件由于使用了window sdk进行音频的采集,所以只支持window vista版本以上平台,故XP系统用户是使用不了此软件的,下载地址:https://obsproject.com/download OBS目前只支持R

C++实现RTMP协议发送H.264编码及AAC编码的音视频

转自:http://www.cnblogs.com/haibindev/archive/2011/12/29/2305712.html RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系Flash Player和RtmpServer,如FMS, Red5, crtmpserver等.RTMP协议可用于实现直播.点播应用,通过FMLE(Flash Me