Real Time Messaging Protocol 学习
来源:互联网 发布:网络知名小说家排行榜 编辑:程序博客网 时间:2024/05/21 22:24
Real Time Messaging Protocol(实时消息传送协议协议)是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的私有协议。
具体使用RTMP的AS代码大概如下:
var videoInstance:Video = your_video_instance;
var nc:NetConnection = new NetConnection();
var connected:Boolean = nc.connect("rtmp://localhost/myapp");
var ns:NetStream = new NetStream(nc);
videoInstance.attachVideo(ns);
ns.play("flvName");
Adobe也在官方网站已经提供了RTMP协议的官方文档说明,为什么要写这个系列文章最大的原因只是对前一段工作的一个总结和回顾,最近两个月,实现了一个RTMP Server的c++版本,把公司的流媒体服务和flash无缝对接起来。希望我的文字能给后来研究这个协议的同学有一定的帮助。
RTMP协议是一个基于TCP的高层协议族,当然这个玩意据说还有UDP协议版本的,不过现在还没有出来,好像Adobe下一版本的FMS会提供支持。下文将要描述的是TCP协议版本的协议。
RTMP协议是为了和flash之间交换信令以及媒体数据。为了提高使用效率信令和媒体数据都是使用相同的机制。因为是相同的机制Adobe就整出来了一些比较搞人的概念,当然每个协议第一次接触都是比较难理解的。
完整的12字节RTMP包头每个字节的含义:
一、Head_Type
第一个字节Head_Type的前两个Bit决定了包头的长度.它可以用掩码0xC0进行"与"计算:
Head_Type的前两个Bit和长度对应关系:
Head_Type的后面6个Bit和StreamID决定了ChannelID。
例如在rtmp包里面经常看到的0xC2, 就表示一字节的包头,channel=2.
二、TiMMER
TiMMER占3个字节纪录的是时间戳,音视频流的时间戳是统一排的。可分为绝对时间戳和相对时间戳。
fms对于同一个流,发布的时间戳接受的时间戳是有区别的
publish时间戳,采用相对时间戳,时间戳值等于当前媒体包的绝对时间戳与上个媒体包的绝对时间戳之间的差距,也就是说音视频时间戳在一个时间轴上面.单位毫秒。
play时间戳,相对时间戳,时间戳值等于当前媒体包的绝对时间戳与上个同类型媒体包的绝对时间戳之间的差距, 也就是说音视频时间戳分别为单独的时间轴,单位毫秒。
flv格式文件时间戳,绝对时间戳,时间戳长度3个字节。超过0xFFFFFF后时间戳值等于TimeStamp & 0xFFFFFF。
flv格式文件影片总时间长度保存在onMetaData的duration属性里面,长度为8个字节,是一个翻转的double类型。
三、AMFSize
AMFSize占三个字节,这个长度是AMF长度,可超过RTMP包的最大长度128字节。如果超过了128字节,那么由多个后续RTMP封包组合,每个后续RTMP封包的头只占一个字节。一般就是以0xC?开头。
四、AMFType
AMFSize占三个字节,这个长度是AMF长度,可超过RTMP包的最大长度128字节。
AMFType是包的类型
五、StreamID
StreamID是音视频流的ID,如果AMFType!=0x08 或!=0x09那么 StreamID为0。
ChannelID 和StreamID之间的计算公式:StreamID=(ChannelID-4)/5+1
例如当ChannelID为2、3、4时StreamID都为1 当ChannelID为9的时候StreamID为2
六、封包分析
例如有一个RTMP封包的数据能
03 00 00 00 00 01 30 14 00 00 00 00 02 00 07 63 6F 6E 6E 65 63 74 00 3F F0 00 00 00 00 00 00 03 00 03 61 70 70 02 00 08 72 6F 6F 6D 2F 30 30 31 00 08 66 6C 61 73 68 56 65 72 02 00 0E 57 49 4E 20 31 30 2C 30 2C 31 32 2C 33 36 00 06 73 77 66 55 72 6C 06 00 05 74 63 55 72 6C 02 00 1C 72 74 6D 70 3A 2F 2F 31 39 32 2E 31 36 38 2E 31 2E 31 38 2F 72 6F 6F 6D 2F 30 30 31 00 04 66 70 61 64 01 00 00 0C 63 61 70 61 62 69 6C 69 C3 74 69 65 73 00 40 2E 00 00 00 00 00 00 00 0B 61 75 64 69 6F 43 6F 64 65 63 73 00 40 A8 EE 00 00 00 00 00 00 0B 76 69 64 65 6F 43 6F 64 65 63 73 00 40 6F 80 00 00 00 00 00 00 0D 76 69 64 65 6F 46 75 6E 63 74 69 6F 6E 00 3F F0 00 00 00 00 00 00 00 07 70 61 67 65 55 72 6C 06 00 0E 6F 62 6A 65 63 74 45 6E 63 6F 64 69 6E 67 00 40 08 00 00 00 00 00 00 00 00 09 02 00 0F 30 38 31 32 31 31 C3 30 39 32 30 32 32 32 32 32 02 00 02 33 34 02 00 0D 31 39 35 2E 31 36 38 2E 31 34 2E 32 32 02 00 03 30 30 31 02 00 01 30 02 00 01 38 02 00 01 30
03表示12字节头,channelid=3
000000表示时间戳 Timer=0
000102表示AMFSize=18
14表示AMFType=Invoke 方法调用
//到此,12字节RTMP头结束
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
03表示Map数据开始
- Real Time Messaging Protocol 学习
- Real Time Messaging Protocol
- Real Time Messaging Protocol
- RTMP: Real Time Messaging Protocol
- Real Time Messaging Protocol Chunk Stream(RTMP数据块流)
- 实时消息传输协议 RTMP(Real Time Messaging Protocol)
- 实时消息传输协议 RTMP(Real Time Messaging Protocol)
- Real Time Streamping Protocol
- Real Time Streaming Protocol
- RTP, Real-time Transport Protocol
- rtsp : Real Time Streaming Protocol
- RTSP(Real Time Streaming Protocol)
- Real-Time Transport Protocol (RTP) Parameters
- RFC3550 RTP(real-time transport protocol)
- RFC2326 - Real Time Streaming Protocol (RTSP) 完整中英文对照版
- RTSP:实时流协议(Real Time Streaming Protocol)
- RTSP:实时流协议(Real Time Streaming Protocol)
- RTSP(Real Time Stream Protocol,实时流协议)
- Android图片加载Glide框架使用详解
- VS+QT环境搭建
- TypeScript学习笔记之基本类型
- Swift: How to convert a String to UInt8 array?
- Spring MVC JSR 303 数据效验
- Real Time Messaging Protocol 学习
- Hadoop2.5.2+Sqoop-1.4.6(2.0以上的版本hadoop使用)伪分布式实现mysql数据上传到ndfs
- Python datetime模块
- 第四篇:赔率和盘口的特征之一
- SpringBoot自有Tomcat不同方式配置
- python发送各类邮件的主要方法
- 刚入行想做一名程序员
- Retrofit2.0-demo
- vim配置及插件安装管理(超级详细)