概述:
•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. 转:Google论文之一----Bigtable学习翻译

    文章来自于:http://www.cnblogs.com/geekma/archive/2013/05/30/3108391.html Bigtable研究 摘要 Bigtable是一个用于管理结构型 ...

  2. 转:Zend_Cache的使用

    一.Zend_Cache快速浏览 Zend_Cache 提供了一个缓存任何数据的一般方法. 在Zend Framework中缓存由前端操作,同时通过后端适配器(File, Sqlite, Memcac ...

  3. stringstream复用【原创】

    stringstream ss("123"); int i=0; ss>>i;   ss.str("");        ----清空内容 ss.c ...

  4. Android Service 简介

    Service是Android系统中的一种组件,它跟Activity的级别差不多,但是它不能自己运行,只能后台运行,并且可以和其他组件进行交互.Service是没有界面的长生命周期的代码.Servic ...

  5. [flex & bison]编译器杂谈

    flex与bison是编译器设计工具.这里的编译器为广义,其中包括一般的编译器.脚本解析器等,需要进行语言结构解析来得出意义的程序. 当我们需要用一个语言来设计一款编译器时,需要考虑太多设计重心外的东 ...

  6. 【转】第 02 天:在 Windows 平台必裝的三套 Git 工具

    原文网址:https://github.com/doggy8088/Learn-Git-in-30-days/blob/master/docs/02%20%E5%9C%A8%20Windows%20% ...

  7. HTML父子页面通信问题(showModalDialog)

    1. showModalDialog参数说明 window.showModalDialog(URL, ARGS,Features)(在父窗口中调用打开新的窗口) URL          --  必选 ...

  8. [置顶] 【Git入门之八】分支管理

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12309385 1.分支又是神马? 我为什么说又是... 分支就是一个我们能通 ...

  9. jquery实现停留半秒后再选择

    jquery实现tab停留半秒后,选中菜单.切换tab下的内容: var showHandler=null; function init(){ $("#tab_ul").find( ...

  10. 关于Hibemate

    1.Hibernate定位 HIbernate是一款实现了ORM思想的框架 JDO TOpLink 2.HIbernate初次解释 Hibernate:冬眠,蛰伏 和持久化有关系 将内存中data持久 ...