RTMP协议分析 二、AMF数据
来源:互联网 发布:mac如何设置用户名 编辑:程序博客网 时间:2024/05/01 19:39
RTMP封包包括包头和AMF数据2部分,AMF数据里面可以是命令也可以是音视频数据。组成服务器和Flash客户端之间的所有数据都是用AMF格式的数据在传送,例如connect() publish()等命令. AMF数据由2部分组成: ObjType 加上 ObjValue。ObjType的大小为一个字节。ObjValue的大小不固定,和ObjType相关。 常用的ObjType类型和对应的ObjValue大小整理如下,详细的ObjType的数据在本文的最下面列出:类型说明(ObjType) 数据 dataSizeCORE_String 0x02 2字节 (2字节的数据纪录了String的实际长度)CORE_Object 0x03 0字节(开始嵌套0x00000009表示嵌套结束)NULL 0x05 0字节 空字节无意义CORE_NUMBER 0x00 8字节CORE_Map 0x08 4字节(开始嵌套)CORE_BOOLEAN 0x01 1字节
ObjValue不一定是一个固定的大小,他可以包含另外一个AMF数据,这另外一个AMF数据里面又有ObjType 加上 ObjValue,也就是AMF数据的嵌套关系
AMF0数据的嵌套关系如下:
Object={ObjType + ObjValue}
CORE_BOOLEAN={Value(1 Byte)}
CORE_NUMBER={Value(8 Byte)}
CORE_String={StringLen(2 Byte) + StringValue(StringLen Byte)}
CORE_DATE={value(10 Byte)}
CORE_Array={ArrayLen(4 Byte) + Object}
CORE_Map={MapNum(4 Byte) + CORE_Object}
CORE_Object={CORE_String + Object}
看起来有些复杂,所以我这里图文并茂来详解,例如完成握手后,Flash向FMS发送的第一个RTMP数据,内容如下:
蓝色的表示包头,红色的表示ObjType,绿色的表示数据。上面一段数据由2个RTMP包组成,2个RTMP包头分别用蓝色表示,第一个蓝色的是12字节的包头,后面一个蓝色的C3是一个字节的包头,绿色部分是数据,红色的是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
FMS3中为了实现H.264数据的直播而增加了一个数据类型,这个类型的值为0x16,这个类型不在下表中,如果需要请参看http://www.cnweblog.com/fly2700/archive/2009/02/06/297957.html
详细的ObjType数据类型如下:,参考Red5
enum AMF
{
/**
* Boolean value marker constant
*/
TYPE_BOOLEAN = 0x01,
/**
* String marker constant
*/
TYPE_STRING = 0x02,
/**
* Object marker constant
*/
TYPE_OBJECT = 0x03,
/**
* Movieclip marker constant
*/
TYPE_MOVIECLIP = 0x04 ,
/**
* Null marker constant
*/
TYPE_NULL = 0x05,
/**
* Undefined marker constant
*/
TYPE_UNDEFINED = 0x06,
/**
* Object reference marker constant
*/
TYPE_REFERENCE = 0x07,
/**
* Mixed array marker constant
*/
TYPE_MIXED_ARRAY = 0x08,
/**
* End of object marker constant
*/
TYPE_END_OF_OBJECT = 0x09,
/**
* Array marker constant
*/
TYPE_ARRAY = 0x0A,
/**
* Date marker constant
*/
TYPE_DATE = 0x0B,
/**
* Long string marker constant
*/
TYPE_LONG_STRING = 0x0C,
/**
* Unsupported type marker constant
*/
TYPE_UNSUPPORTED = 0x0D,
/**
* Recordset marker constant
*/
TYPE_RECORDSET = 0x0E,
/**
* XML marker constant
*/
TYPE_XML = 0x0F,
/**
* Class marker constant
*/
TYPE_CLASS_OBJECT = 0x10,
/**
* Object marker constant (for AMF3)
*/
TYPE_AMF3_OBJECT = 0x11,
/**
* true marker constant
*/
VALUE_TRUE = 0x01,
/**
* false marker constant
*/
VALUE_FALSE = 0x00
};
RTMP协议分析 一、RTMP包头 :http://www.cnweblog.com/fly2700/archive/2008/04/09/281431.html
程序下载
http://www.cnweblog.com/fly2700/archive/2008/04/02/280641.html- RTMP协议分析 二、AMF数据
- RTMP协议分析 二、AMF数据
- RTMP协议分析 二、AMF数据
- RTMP协议分析 二、AMF数据
- RTMP协议中的AMF数据
- RTMP协议中的AMF数据
- RTMP协议中的AMF数据
- RTMP协议中的AMF数据
- RTMP协议中的AMF数据
- RTMP协议中的AMF数据类型说明
- Rtmp协议简单分析(一)——协议数据
- rtmp协议头分析
- RTMP协议分析
- RTMP协议分析
- RTMP协议分析
- RTMP协议分析
- RTMP协议分析
- RTMP协议过程分析
- FLAG_ACTIVITY_NEW_TASK和singleTask一起使用的意义
- 制作arcgis符号
- linux mysql用户管理
- No smpd passphrase specified through the registry or .smpd file, exiting
- MongoDB Shard Model
- RTMP协议分析 二、AMF数据
- ios7兼容 蛋疼的问题
- u-boot Makefile分析 -- (2)
- ListActivity
- css属性值定位方式
- 常用查询条件
- Hessian服务搭建
- Android/Linux Kernel 記憶體管理-入門筆記
- AVCapture中实现拉近拉远镜头