概述:
•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. poj Fishnet

    http://poj.org/problem?id=1408 #include<cstdio> #include<cstring> #include<cmath> ...

  2. ISO14443标准详细介绍

    这篇文章从各方面详细介绍了ISO/IEC14443标准.第一部分:物理特性1.范围ISO/IEC14443的这一部分规定了邻近卡(PICC)的物理特性.它应用于在耦合设备附近操作的ID-1型识别卡.I ...

  3. C获取本地时间的localtime函数

    最近有朋友问如下问题: #include <stdio.h>#include <stdlib.h>#include <iconv.h>#include <ti ...

  4. Aho_Corasick自动机(AC自动机)

    首先,AC自动机不是Accept自动机,别以为把这段代码复制到OJ上就全都自动AC了…… 其实这玩意是Aho-Corasick 造出来的,所以你懂的. 那么这玩意能干嘛咧? •字符串的匹配问题 •多串 ...

  5. sql优化(oracle)

    系统优化中很重要的方面是SQL语句的优化,对于海量数据,优质的SQL能够有效的提高系统的可用性. 总结的有点罗嗦,列个简单的目录啦~ 目录 第一部分知识准备                      ...

  6. 前端问题——png图片在IE6下透明失效,解决办法

    今天,一位同事问我问题,png 图片在IE6下透明背景失效. 解决办法,在网上查了很多,最后还是采用两种方案来解决这个问题 1.把这个网页的png格式图片变更为gif格式的图片.问题解决 2.就是让这 ...

  7. Socket的协议地址属性

    首先列举所需要的头文件 #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #in ...

  8. Linq to Sql语法及实例大全

    LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的 ,而判断条件就是它后面所接的 ...

  9. JS 实现显示和隐藏div(以百度地图为例)

    主要参考的文章:https://my.oschina.net/xsh1208/blog/215811,https://zhidao.baidu.com/question/568774688.html ...

  10. web前端面试试题总结---css篇

    CSS 介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不同的? (1)有两种, IE 盒子模型.W3C 盒子模型: (2)盒模型: 内容(content).填充(padding).边界(m ...