概述:
•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
•通知对方给我发送一个Window Acknowledgement Size消息
•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 一休摸鱼

rtmp协议介绍的更多相关文章

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

    [转]流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls) http://blog.csdn.net/tttyd/article/details/12032357 RTP       ...

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

    RTP           参考文档 RFC3550/RFC3551 Real-time Transport Protocol)是用于Internet上针对多媒体数据流的一种传输层协议.RTP协议详细 ...

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

    http://blog.csdn.net/tttyd/article/details/12032357 RTP           参考文档 RFC3550/RFC3551 Real-time Tra ...

  4. RTMP协议

    Real Time Messaging Protocol(实时消息传送协议协议)概述   实时消息传送协议是Adobe Systems公司为Flash播放器和服务器之间音频.视频和数据传输开发的私有协 ...

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

    http://www.cnblogs.com/haibindev/archive/2011/12/29/2305712.html C++实现RTMP协议发送H.264编码及AAC编码的音视频 RTMP ...

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

    C++实现RTMP协议发送H.264编码及AAC编码的音视频(转) RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia ...

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

    RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系F ...

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

    最近在 ubuntu12.04+wdlinux(centos)上搭建了一个rtmp服务器,感觉还挺麻烦的,所以记录下. 大部分都是参考网络上的资料. 前提: 在linux下某个目录中新建一个nginx ...

  9. FFmpeg实现监控摄像头的RTSP协议转RTMP协议直播

    文章来源:http://www.cuplayer.com/player/PlayerCode/RTSP/2014/0706/1419.html FFmpeg实现监控摄像头的RTSP协议转RTMP协议直 ...

随机推荐

  1. org.elasticsearch.bootstrap : JNA not found. native methods will be disabled

    在pom.xml中添加以下依赖,解决elasticsearch的WARN: <dependency> <groupId>com.sun.jna</groupId> ...

  2. 【转】JAVA字符串格式化-String.format()的使用

    原文网址:http://blog.csdn.net/lonely_fireworks/article/details/7962171 常规类型的格式化 String类的format()方法用于创建格式 ...

  3. Java---文件的切割与合并,已经实现图形界面(工具)

    实现对任意文件的切割,实现对切割后的文件的合并. 上次只写了特定目录下的文件切割与合并,有点遗憾, 这次,我写了一个图形界面来实现对文件的切割与合并. 文件切割: 用户可以自己选择需要切割的文件, 软 ...

  4. HDU 3853 LOOPS

    题意:对于每一格,都可以往右走,原地不走,往下走,概率分别为a[i],b[i],c[i](每一个格子与其他格子的概率不一定相同).在R*C的棋盘上(输入数据保证不会走出棋盘),求从(0, 0)走到(R ...

  5. 【H5开发基础】移动端1像素边框问题的解决方案

    自从乔帮主提出retina屏以来.可练就了不少前端兄弟的像素眼,有强迫症的伙伴们日子可就煎熬了.为了画出真正的1像素边框,前端猿们也是受尽各浏览器的虐待了. 关于什么是移动端1像素边框问题,先上两张图 ...

  6. Com原理及應用——Com對象和接口

    1.COM对象的理解 COM对象类似于C++语言中类的概念,类的每个实例代表一个COM对象,它也包括属性(即状态)和方法(即操作),状态反映对象的存在,方法就是接口. 2.COM对象的标识-CLSID ...

  7. [Flexbox] Using flex-direction to layout content horizontally and vertically

    The Flexbox css spec allows for more adjustable layouts. The flex-directionproperty allows you to ea ...

  8. Zend Studio 10正式版破解(2013-02-26更新)

    Zend Studio 10正式版注册破解(2013-02-26完成更新) 1.以下方法仅供技术交流学习,请勿非法使用,如长期使用请支持购买正版. 2.若你还没有最新安装程序? ZendStudio ...

  9. [转] thrift的使用介绍

    http://gemantic.iteye.com/blog/1199214 一.About  thrift   二.什么是thrift,怎么工作? 三.Thrift  IDL 四.Thrift   ...

  10. [转] linux下的僵尸进程处理SIGCHLD信号

    什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些 信息至少包括进程ID,进程的终止状态,以及 ...