- 浏览: 257205 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
zoukaiwolai:
...
Java 16进制字符串与2进制字符串相互转换 -
sooxin:
j2ee的事务对连接有自己的管理机制,包括建立和关闭。没进j2 ...
c3p0 spring 包没进事务管理,连接池就不能释放 -
sooxin:
mina 采用一种NIO通信,底层的连接机制没有具体研究过,但 ...
转 Mina框架在项目中的使用 -
tywo45:
写得很好,希望博主把格式调一下!
Tomcat性能参数设置介绍 -
freecode:
采用了cp30,项目中出现很多未关闭的连接,一直在找原因.
c3p0 spring 包没进事务管理,连接池就不能释放
一、基于TCP之上的高层协议;
二、自定义新的包结构chunk;
三、基于TCP,又有自己的包,所以提出个概念——消息块流 chunk message stream;
怎么讲呢?就是说包肯定不能太大了,TCP包都有个最大值,所以得分开成自己的包,但还要考虑节省带宽,而又基于TCP流,是一种安全的流,所以当然还是分为包头和包体,但这个包头是可以节省的,从1个字节到12个字节不等,这又是怎么回事呢?是这样的,首先有一个基本的chunk basic header这个是必须都有的,但就这个header都还是一个1到3字节可变的头,再加上一个0到11字节的chunk message header都是由chunk basic header头的第一个字节的前2bit分成的四个类型来控制的,这四种类型就说明了这个消息块是一个新消息包的开始块?一个跟随前面块的消息块?等!从而来决定这个chunk message header中的四种内容是需要还是不需要,所以就出现0,3,7,11字节这四种情况,chunk message header中包括时间戳、消息长度、stream id、消息类型、扩展时间戳这种数据。
四、其实主要还是得知道chunk basic header的构成,它是一个2 + 6 + 8 + 8 bit的情况,2就是前面说的类型,后面的这22bit是个chunk stream id,这个好像很重要,现在还没有搞清楚,大致是6处为0的话,第一个8是有效的,而得到的chunk stream id的值为1片8的值+64,如果6处为1,则第一8第二8都是有效的,最终的chunk stream id的值就是第二8*256 + 第一8 + 64,这就说明6处0 1 都为保留值,当然现在2也是个说什么低层协议的消息(在RTMP协议中控制信令的chunk stream ID都是2)这个暂不明白什么是控制信令,“2~7都是约定的,8是用来传输publish play等命令”,这个就得继续再找资料看了!
==============================================================
完整的12字节RTMP包头每个字节的含义:
一、Head_Type
第一个字节Head_Type的前两个Bit决定了包头的长度.它可以用掩码0xC0 进行"与"计算:
Head_Type的前两个Bit和长度对应关系:
Head_Type的后面6个Bit和StreamID决定了ChannelID。 StreamID和ChannelID对应关系:StreamID=(ChannelID-4)/5+1 参考red5
例如在 rtmp包里面经常看到的0xC2, 就表示一字节的包头,channel=2.
四、AMFType
AMFSize占三个字节,这个长度是AMF长度,可超过RTMP包的最大长度128字节。
AMFType是包的类型
五、StreamID
StreamID是音视频流的ID,如果AMFType!=0x08 或!=0x09那么 StreamID为0。
ChannelID 和StreamID之间的计算公式:StreamID=(ChannelID-4)/5+1 参考red5
例如当ChannelID为2、3、4 时StreamID都为1 当ChannelID为9的时候StreamID为2
六、封包分析
例如有一个RTMP封包的数据03 00 00 00 00 01 02 14 00 00 00 00 02 00 07 63 6F 6E 6E 65 63 74 00 3F F0 00 00 00 00 00 00 08 ,,,
数据依次解析的含义
03表示12字节头,channelid=3
000000表示Timmer=0
000102 表示AMFSize=18
14表示AMFType=Invoke 方法调用
00 00 00 00 表示StreamID = 0
// 到此,12字节RTMP头结束
下面的是AMF数据分析,具体的AMF0数据格式请参考
http://www.cnweblog.com/fly2700/archive/2008/04/09/281432.html
02表示String
0007表示String长度7
63 6F 6E 6E 65 63 74 是String的Ascall值"connect"
00表示Double
3F F0 00 00 00 00 00 00 表示double的0.0
08表示Map数据开始
===================================================================
例如完成握手后,Flash向FMS发送的第一个RTMP数据,内容如下:
上面一段数据由2个RTMP包组成,2个RTMP包头分别用蓝色表示,第一个蓝色的是12字节的包头,后面一个蓝色的C3是一个字节的包头,绿色部分是AMF数据,红色的是AMF数据类型,整个RTMP解码过程如下
[2008-06-18 16:59:20] DecodeInvoke:
[2008-06-18 16:59:20] InvokeName:String:connect
[2008-06-18 16:59:20] InvokeID:Double:0
[2008-06-18 16:59:20] Map:MapNum:0
[2008-06-18 16:59:20] Params:{
[2008-06-18 16:59:20] Key:String:objectEncoding
[2008-06-18 16:59:20] Value:Double:0
[2008-06-18 16:59:20] Key:String:app
[2008-06-18 16:59:20] Value:String:mediaserver
[2008-06-18 16:59:20] Key:String:fpda
[2008-06-18 16:59:20] Value:Bool:0
[2008-06-18 16:59:20] Key:String:tcUrl
[2008-06-18 16:59:20] Value:String:rtmp://127.0.0.1/mediaserver
[2008-06-18 16:59:20] Key:String:audioCodecs
[2008-06-18 16:59:20] Value:Double:615
[2008-06-18 16:59:20] Key:String:videoCodecs
[2008-06-18 16:59:20] Value:Double:76
[2008-06-18 16:59:20] }End Params
[2008-06-18 16:59:20] InvokeParams:String:PUBLISHER
[2008-06-18 16:59:20] InvokeParams:String:streamRecode
二、自定义新的包结构chunk;
三、基于TCP,又有自己的包,所以提出个概念——消息块流 chunk message stream;
怎么讲呢?就是说包肯定不能太大了,TCP包都有个最大值,所以得分开成自己的包,但还要考虑节省带宽,而又基于TCP流,是一种安全的流,所以当然还是分为包头和包体,但这个包头是可以节省的,从1个字节到12个字节不等,这又是怎么回事呢?是这样的,首先有一个基本的chunk basic header这个是必须都有的,但就这个header都还是一个1到3字节可变的头,再加上一个0到11字节的chunk message header都是由chunk basic header头的第一个字节的前2bit分成的四个类型来控制的,这四种类型就说明了这个消息块是一个新消息包的开始块?一个跟随前面块的消息块?等!从而来决定这个chunk message header中的四种内容是需要还是不需要,所以就出现0,3,7,11字节这四种情况,chunk message header中包括时间戳、消息长度、stream id、消息类型、扩展时间戳这种数据。
四、其实主要还是得知道chunk basic header的构成,它是一个2 + 6 + 8 + 8 bit的情况,2就是前面说的类型,后面的这22bit是个chunk stream id,这个好像很重要,现在还没有搞清楚,大致是6处为0的话,第一个8是有效的,而得到的chunk stream id的值为1片8的值+64,如果6处为1,则第一8第二8都是有效的,最终的chunk stream id的值就是第二8*256 + 第一8 + 64,这就说明6处0 1 都为保留值,当然现在2也是个说什么低层协议的消息(在RTMP协议中控制信令的chunk stream ID都是2)这个暂不明白什么是控制信令,“2~7都是约定的,8是用来传输publish play等命令”,这个就得继续再找资料看了!
==============================================================
完整的12字节RTMP包头每个字节的含义:
用途 | 大小(Byte) | 含义 |
Head_Type | 1 | 包头 |
TiMMER | 3 | 时间戳 |
AMFSize | 3 | 数据大小 |
AMFType | 1 | 数据类型 |
StreamID | 4 | 流ID |
一、Head_Type
第一个字节Head_Type的前两个Bit决定了包头的长度.它可以用掩码0xC0 进行"与"计算:
Head_Type的前两个Bit和长度对应关系:
Bits | Header Length |
00 | 12 bytes |
01 | 8 bytes |
10 | 4 bytes |
11 | 1 byte |
ChannelID | Use |
02 | Ping 和ByteRead通道 |
03 | Invoke通道 我们的connect() publish()和自字写的NetConnection.Call() 数据都是在这个通道的 |
04 | Audio和Vidio通道 |
05 06 07 | 服务器保留,经观察FMS2用这些Channel也用来发送音频或视频数据 |
例如在 rtmp包里面经常看到的0xC2, 就表示一字节的包头,channel=2.
四、AMFType
AMFSize占三个字节,这个长度是AMF长度,可超过RTMP包的最大长度128字节。
AMFType是包的类型
0×01 | Chunk Size | changes the chunk size for packets |
0×02 | Unknown | |
0×03 | Bytes Read | send every x bytes read by both sides |
0×04 | Ping | ping is a stream control message, has subtypes |
0×05 | Server BW | the servers downstream bw |
0×06 | Client BW | the clients upstream bw |
0×07 | Unknown | |
0×08 | Audio Data | packet containing audio |
0×09 | Video Data | packet containing video data |
0x0A-0x0E | Unknown | |
0x0F | FLEX_STREAM_SEND | TYPE_FLEX_STREAM_SEND |
0x10 | FLEX_SHARED_OBJECT | TYPE_FLEX_SHARED_OBJECT |
0x11 | FLEX_MESSAGE | TYPE_FLEX_MESSAGE |
0×12 | Notify | an invoke which does not expect a reply |
0×13 | Shared Object | has subtypes |
0×14 | Invoke | like remoting call, used for stream actions too. |
0×16 | StreamData | 这是FMS3出来后新增的数据类型,这种类型数据中包含AudioData和VideoData |
StreamID是音视频流的ID,如果AMFType!=0x08 或!=0x09那么 StreamID为0。
ChannelID 和StreamID之间的计算公式:StreamID=(ChannelID-4)/5+1 参考red5
例如当ChannelID为2、3、4 时StreamID都为1 当ChannelID为9的时候StreamID为2
六、封包分析
例如有一个RTMP封包的数据03 00 00 00 00 01 02 14 00 00 00 00 02 00 07 63 6F 6E 6E 65 63 74 00 3F F0 00 00 00 00 00 00 08 ,,,
数据依次解析的含义
03表示12字节头,channelid=3
000000表示Timmer=0
000102 表示AMFSize=18
14表示AMFType=Invoke 方法调用
00 00 00 00 表示StreamID = 0
// 到此,12字节RTMP头结束
下面的是AMF数据分析,具体的AMF0数据格式请参考
http://www.cnweblog.com/fly2700/archive/2008/04/09/281432.html
02表示String
0007表示String长度7
63 6F 6E 6E 65 63 74 是String的Ascall值"connect"
00表示Double
3F F0 00 00 00 00 00 00 表示double的0.0
08表示Map数据开始
===================================================================
例如完成握手后,Flash向FMS发送的第一个RTMP数据,内容如下:
上面一段数据由2个RTMP包组成,2个RTMP包头分别用蓝色表示,第一个蓝色的是12字节的包头,后面一个蓝色的C3是一个字节的包头,绿色部分是AMF数据,红色的是AMF数据类型,整个RTMP解码过程如下
[2008-06-18 16:59:20] DecodeInvoke:
[2008-06-18 16:59:20] InvokeName:String:connect
[2008-06-18 16:59:20] InvokeID:Double:0
[2008-06-18 16:59:20] Map:MapNum:0
[2008-06-18 16:59:20] Params:{
[2008-06-18 16:59:20] Key:String:objectEncoding
[2008-06-18 16:59:20] Value:Double:0
[2008-06-18 16:59:20] Key:String:app
[2008-06-18 16:59:20] Value:String:mediaserver
[2008-06-18 16:59:20] Key:String:fpda
[2008-06-18 16:59:20] Value:Bool:0
[2008-06-18 16:59:20] Key:String:tcUrl
[2008-06-18 16:59:20] Value:String:rtmp://127.0.0.1/mediaserver
[2008-06-18 16:59:20] Key:String:audioCodecs
[2008-06-18 16:59:20] Value:Double:615
[2008-06-18 16:59:20] Key:String:videoCodecs
[2008-06-18 16:59:20] Value:Double:76
[2008-06-18 16:59:20] }End Params
[2008-06-18 16:59:20] InvokeParams:String:PUBLISHER
[2008-06-18 16:59:20] InvokeParams:String:streamRecode
发表评论
-
小学语文课堂教学三维目标的制定和落实-广安齐祥娥
2019-07-06 11:31 15教学目标是教学过程中重要的一部分,它是教学的出发点 也是教学 ... -
air打包是去掉air前缀
2017-02-05 12:13 762air打包是去掉air前缀当用air导报生成apk是会自动在a ... -
Adobe AIR 3新特性
2012-04-24 11:15 1238自从2008年发布了第一 ... -
四川血战麻将pc版下载
2012-01-17 16:59 111见附件! -
四川血战麻将 v0.3 整装待发!
2012-01-09 21:40 80app 搜索关键字:四川血战麻将app store 地址:ht ... -
四川血战麻将 app store 正式上线!
2012-01-05 17:15 76四川麻将, 又称血战麻将, 采用四川地区流行的麻将打法, 尤其 ... -
Flex 数据绑定易犯的错误:普遍的误用和错误
2011-07-12 21:21 1042http://www.cnblogs.com/kakaflex ... -
Flex框架选择的一点个人之见
2011-05-05 20:56 905时下,国人都热衷于开 ... -
flex缓存客户端
2011-05-05 20:53 772flex或者flash客户端的缓 ... -
flashbuiler4 格式化地址
2011-01-07 13:03 803http://flexformatter.googlecode ... -
Garbage Collection with Flex and Adobe Air
2010-10-28 15:43 1133I finally found some spare time ... -
分离MXML和AS
2010-04-26 09:40 1131package oreilly.cookbook { ... -
ACE框架在网络游戏服务器中的设计与应用
2010-04-19 21:26 2221陶 道,万旺根 (上海大 ... -
网络游戏同步
2010-04-19 21:24 1048同步在网络游戏中是非 ... -
关于完美的Flex应用框架的思考(Part 1 of 2)
2010-04-14 23:56 1112自Flex技术开始广泛应用以来,对于企业级Flex应用开发框架 ... -
Flash的socket在实际应用上需要注意的问题
2010-04-14 23:34 2208本文作者:奶瓶先生 转 ... -
flex的Timer事件几点注意
2010-03-17 22:57 2109flex的Timer事件几点注意 1. 设定Timer的延 ... -
关于强引用和弱引用
2010-03-17 22:54 1609强引用:使用最普遍的引用。如果一个对象具有强引用,那就类似于必 ... -
关于MC的复制
2010-02-27 10:58 1741关于MC的复制一直都是 ... -
谜一样的TextField
2010-02-02 16:32 1196文章来之:http://hi.baidu.com/mr%5Fz ...
相关推荐
《rtmp_specification_1.0_cn.pdf》则是该官方文档的中文翻译版本,对于中文使用者来说,这使得理解RTMP协议变得更加方便。中文版文档同样涵盖了上述所有内容,并且可能针对中文读者的习惯进行了适当的调整和解释。 ...
RTMP协议规范的中文翻译文档是理解并实现该协议的关键资源,尤其对于开发者和网络流媒体服务提供者而言,具有很高的学习价值。 RTMP协议的主要特点包括以下几点: 1. **连接建立**:RTMP协议首先通过TCP建立连接,...
总结起来,`RTMP协议框架完美实现`意味着深入理解RTMP协议,并能够使用如`rtmpdump`这样的工具以及`librtmp`库有效地进行流媒体处理。无论是对开发者还是运维人员,掌握这些知识都对处理RTMP相关的任务至关重要。
RTMP(Real Time Messaging Protocol)是一种由Adobe公司开发的网络流媒体协议,主要用于在客户端和服务器之间传输...文档中的示例和图表有助于更好地理解协议的细节和工作机制,是深入了解RTMP协议不可或缺的资源。
实现RTMP协议需要对TCP/IP网络编程有深入理解,包括套接字编程、网络字节序处理、异步I/O模型等。此外,还要实现AMF编码和解码,因为RTMP协议中的数据是以AMF格式传输的。 3. **关键组件**: - **Handshake(握手...
而AMF3协议中文版.pdf则可能深入解析了AMF3编码规则和数据表示,帮助开发者更好地理解和实现RTMP协议。 总的来说,理解并掌握RTMP协议及其相关的AMF编码对于开发和维护流媒体应用至关重要。通过深入学习这些资源,...
"rtmp协议文档.7z"这个压缩包包含了一系列关于RTMP协议的学习资料,包括中文翻译,对于想要深入理解RTMP的人来说是必不可少的资源。 首先,我们来看看"rtmp规范翻译1.0.docx",这可能是RTMP协议官方规范的中文翻译...
### Flash RTMP协议详解 #### 一、RTMP协议概述 ...通过对RTMP协议的理解和应用,可以有效提升在线直播、远程教育等场景下的用户体验。随着技术的不断发展,RTMP协议也将不断进化,以适应新的需求和技术环境。
### RTMP协议详解 ...通过对RTMP协议的深入理解,可以帮助开发者更好地利用这一协议来构建高质量的实时通信系统。同时,了解RTMP与HTTP之间的关系也有助于解决实际部署过程中遇到的一些网络问题。
本文将深入探讨一个基于RTMP协议的Android端推流Demo,以及与之相关的技术知识点。 首先,RTMP(Real-Time Messaging Protocol)是一种实时传输协议,常用于在线视频直播、音频传输等场景。它由Adobe Systems开发,...
通过对RTMP协议的基本概念、工作原理以及具体实现细节的学习,可以更好地理解和利用这一协议来实现高质量的音视频直播服务。随着技术的发展,虽然新兴的协议如HLS、DASH等正在逐渐兴起,但RTMP协议仍然在某些场景下...
7. **网络编程**:实现RTSP拉取和RTMP推送需要对TCP/IP协议有深入理解,包括建立连接、发送和接收数据包、错误处理等。 8. **多线程/异步编程**:为了保证视频流的实时性和流畅性,可能需要在不同的线程或者使用...
RTMP(Real-Time ...了解这些RTMP协议的基础知识,有助于开发者理解和实现基于RTMP的流媒体系统,或者解决与之相关的技术问题。通过深入研究《rtmp规范翻译1.0.docx》文档,可以获取更详尽的技术细节和实践指导。
RTMP协议规范中文版本详细介绍了RTMP协议的工作原理,包括握手创建过程、操作命令及流的分块机制,为理解和实施RTMP协议提供了详尽的指导。 ### 握手创建过程 RTMP协议的握手是连接建立的第一步,它发生在客户端和...
在这个场景中,我们讨论的是如何使用C++来实现RTMP协议打包发送,并且特别关注H264编码的视频数据。 1. **RTMP协议基础**: - RTMP是基于TCP的,它通过建立连接、握手、建立通道、发送命令和数据等步骤来工作。 -...
学习RTMP协议,你需要理解以下几个关键点: 1. **协议基础**:了解TCP/IP基础知识,以及如何在应用层使用协议。 2. **AMF编码**:深入学习AMF0和AMF3的编码规则,能读写AMF数据。 3. **命令和流管理**:理解如CREATE...
### RTMP协议中AMF的定义 #### 一、引言 实时消息传输协议(Real-Time Messaging Protocol,简称RTMP)是一种专为实时音频、视频数据传输设计的协议,广泛应用于流媒体服务中。在RTMP协议中,AMF(Action Message ...
了解RTMP协议的封包结构和各个字段的含义对于开发和调试RTMP相关的应用至关重要,无论是客户端的播放器还是服务器端的处理逻辑,都需要对这些基础知识有深入的理解。在使用Red5这样的服务器时,这些知识可以帮助...
RTMP协议简单且高效,但不支持现代浏览器的原生播放。 **FFmpeg**是一个强大的跨平台的开源工具套件,用于处理音视频文件。它可以用于转换、录制、封装、解码和编码多种音视频格式。在这个场景中,FFmpeg被用来从...