概述:
•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. 转:Eclipse Kepler已支持Java 8

    文章来自于:http://www.infoq.com/cn/news/2014/04/eclipse-kepler-support-java8 期待已久的Java 8已于2014年3月19日正式发布, ...

  2. Jzzhu and Chocolate

    CF#257 div2 C:http://codeforces.com/contest/450/problem/C 题意:n*m的方格,每次可以横着或者纵向的切一刀,问切k之后,最小的最大是多少. 题 ...

  3. MV规范 ---ISO7816 T=1协议的时间特性

    终端发送的连续字符之间的时间间隔应在11etu域42etu之间,卡片应能正确接收终端发送的时间间隔为11.8+Netu的连续字符. 卡片发出的连续字符之间的时间间隔最小为11etu,终端应能正确接收卡 ...

  4. 一个修改过简化版的InputQuery(简单实用,用到了Canvas)

    主要是觉得在单输入的情况下, 原来InputQuery输入框左边的文本太难看了...... function _InputQuery(const ACaption: string; const APr ...

  5. 哈希集合——hashSet

    /**     哈希集合特点:存取顺序不确定,同一个哈希值的位置可以存放多个元素,                   哈希集合存放元素的时候是先判断哈希地址值:hashCode()是否相同,如果不同 ...

  6. COCI2014-2015CONTEST#7——POLICE

    http://www.hsin.hr/coci/archive/2014_2015/contest7_tasks.pdf [题目描述] 有N个书架,每个书架可以容纳M本书.给出了若干本书,每本书有一个 ...

  7. Flask+Mysql搭建网站之安装Mysql

    安装Mysql # sudo apt-get install mysql-server 安装过程需要输入root密码,这个密码是mysql 的root密码,之后连接mysql会用到,这个要记住. 安装 ...

  8. 非常全面的Linux知识点总结

    $1 我的Linux需求 Linux博大精深.我只在此讨论一些我对线上Linux机器维护人员的基本需求,比如装机,加硬盘,配网络.只讨论CentOS 6,或者类似的RHEL,当然Ubuntu也可以此类 ...

  9. 对MFC 框架的认识

    1.MFC 的概念 微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Wind ...

  10. fsck 修复ext3文件系统(用于linux系统时间不对,文件系统信息有错引起的die with exit status等的一些问题)

    有时候我们用虚拟机装了linux,可是我们做开发的人员,系统时间可能出于一些特殊要求调整过(例如保持一些特殊软件不过期,需要锁定时间等等),这样linux的系统时间久不准了,如果时间不准,会造成ext ...