`
ithero
  • 浏览: 145912 次
社区版块
存档分类
最新评论

转载:RTMP协议封包 参考Red5

阅读更多

RTMP协议封包 参考Red5
RTMP协议封包 由一个包头和一个包体组成,包头可以是4种长度的任意一种:12, 8, 4,  1 byte(s).完整的RTMP包头应该是12bytes,包含了时间戳,AMFSize,AMFType,StreamID信息, 8字节的包头只纪录了时间戳,AMFSize,AMFType,其他字节的包头纪录信息依次类推 。包体最大长度默认为128字节,通过chunkSize可改变包体最大长度,通常当一段AFM数据超过128字节后,超过128的部分就放到了其他的RTMP封包中,包头为一个字节.
完整的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

Head_Type的后面6个Bit和StreamID决定了ChannelID。  StreamID和ChannelID对应关系:StreamID=(ChannelID-4)/5+1 参考red5
ChannelID Use
02 Ping 和ByteRead通道
03 Invoke通道 我们的connect() publish()和自字写的NetConnection.Call() 数据都是在这个通道的
04 Audio和Vidio通道
05 06 07 服务器保留,经观察FMS2用这些Channel也用来发送音频或视频数据

例如在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是包的类型

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
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数据开始

分享到:
评论

相关推荐

    RTMP头RTMP协议封包 参考Red5.

    Red5是一款开源的RTMP服务器,它提供了实现RTMP协议所需的功能。 RTMP协议封包由包头和包体两部分组成。包头的长度可以是12、8、4或1个字节,具体取决于包含的信息量。完整的12字节包头包含了以下关键信息: 1. **...

    RTMP封包协议以及程序

    5. **流控制**:RTMP协议支持流的暂停、恢复和跳跃播放,这通过发送特定的控制消息实现。此外,协议还提供了错误检测和恢复机制,如重传和错误码。 6. **断线和重新连接**:如果网络中断,RTMP协议支持断线重连,...

    RTMP协议规范中文翻译

    5. **缓冲机制**:RTMP协议有内置的缓冲机制,用于平滑网络波动对流媒体播放的影响。当网络状况不佳时,缓冲区可以存储一定量的数据,确保播放的连续性。 6. **错误处理**:协议中定义了错误处理机制,当出现错误时...

    rtmp协议官方文档中文版

    RTMP(Real-Time Messaging Protocol,实时消息传输协议)是一种基于TCP的应用层协议,主要用于在互联网上传输音频、视频和其他类型的数据。它最初由Adobe Systems开发,用于Flash Player和服务器之间的实时流媒体...

    rtmp 协议规范 中文版

    "RTMP 协议规范中文版详解" RTMP(Real-Time Messaging Protocol)是一种应用层协议,主要用于通过可靠的传输层协议(例如 TCP)复用、打包多媒体数据流(音频、视频和交互数据)。RTMP 块流是一种基于 RTMP 的协议...

    RTMP 协议下载C++实现

    5. **调试和测试**:实现RTMP协议下载后,需要进行充分的测试,确保在各种网络环境下都能正常工作,包括连接稳定性、数据完整性、播放流畅性等。 6. **优化和扩展**:对于实际应用,可能需要考虑额外的优化,如缓存...

    rtmp协议.pdf

    ### RTMP实时传输消息协议详解 #### 一、引言 RTMP(Real-Time Messaging Protocol)是一种由Adobe Systems开发的专用于音视频流传输的网络协议。它最初是为了支持Adobe Flash Player而设计的,但随着时间的发展,...

    RTMP协议官方文档

    5. 握手协议:RTMP使用三次握手来建立客户端和服务器之间的连接。握手过程包括C0/C1/S0/S1/C2/S2消息的交换,确保双方有能力处理RTMP消息格式。 6. 协议控制消息:文档详细介绍了RTMP中用于控制协议本身操作的几种...

    基于rtmp协议android端推流Demo

    5. **流媒体服务器配置**:为了接收并分发Android设备推送的RTMP流,服务器端需要运行支持RTMP协议的服务,如Nginx with RTMP module或者Adobe Flash Media Server。开发者需要知道如何配置这些服务器,设置合适的...

    RTMP协议(中文)详解以及规范

    RTMP(Real-Time Messaging Protocol,实时消息传输协议)是Adobe Systems公司开发的一种应用程序协议,主要用于在互联网上传输音频、视频和数据。它被广泛应用于在线直播、视频会议和游戏流媒体等领域。RTMP协议的...

    rtmp中文协议1.0.zip

    压缩包中的"rtmp中文协议1.0.pdf"文档提供了33页的详细解析,深入浅出地阐述了RTMP协议的关键概念和技术细节,对于学习和使用RTMP协议的开发者来说是一份宝贵的参考资料。通过阅读这份文档,读者将能全面理解RTMP的...

    RTMP 规范中英文对照阅读版pdf[带书签]

    5. **文件共享**:RTMP协议可以用于共享存储在服务器上的文件,例如FLV(Flash Video)文件的实时播放。这部分将说明文件共享的具体操作和流程。 6. **错误处理与调试**:RTMP协议提供了一套错误报告和处理机制,...

    rtmp协议规范翻译1.0

    RTMP(Real-Time Messaging Protocol,实时消息传输协议)是一种广泛应用于在线流媒体传输的协议,由Adobe Systems开发,主要用于在互联网上传输音频、视频和其他数据。这个“rtmp协议规范翻译1.0”文档很可能是对...

    利用red5和ffmpeg搭建rtmp流媒体服务器

    - 安装Red5:下载Red5的安装包,并解压到指定目录。修改配置文件red5.properties中的IP地址和端口设置,如果需要可以更改HTTP服务的端口(默认为5080),而RTMP服务默认端口为1935。 - 启动Red5服务器:双击Red5目录...

    rtmp 传输协议code

    RTMP(Real-Time Messaging Protocol,实时消息传输协议)是由Adobe Systems公司开发的一种协议,主要用于在互联网上传输音视频数据。RTMP协议最初是为Flash播放器设计的,用于实现实时流媒体服务,如在线直播、视频...

    RTMP协议框架完美实现

    RTMP(Real-Time Messaging Protocol)协议是Adobe Systems开发的一种用于实时数据传输的协议,主要用于音频、视频流的传输,常用于在线直播、视频会议等场景。`rtmpdump`是基于RTMP协议的一个开源工具,它提供了一...

    rtmp协议规范(中文翻译)

    RTMP(Real-Time Messaging Protocol,实时消息传输协议)是一种广泛应用于在线流媒体传输的协议,尤其在直播领域中。此协议由Adobe Systems开发,旨在提供高效、低延迟的数据传输,支持音频、视频和数据的实时通信...

    rtmp_specification_1.0.pdf.7z

    这份文档详细阐述了RTMP协议的工作原理、协议结构、命令格式以及交互流程,是理解并实现RTMP服务器或客户端的关键参考资料。 RTMP协议由Adobe Systems开发,最初用于Flash Player进行流媒体播放。它的主要功能包括...

    RTMP_1.0协议原理

    5. **时间戳**:为了保证数据同步,RTMP协议中的每个消息都携带一个时间戳,用于指示数据的实际时间。 6. **数据类型**:RTMP协议支持多种数据类型,包括音频、视频、共享对象、元数据等。 #### 四、RTMP协议工作...

    Rtmp 协议规范+音视频数据抓包.rar

    总的来说,RTMP协议规范和音视频数据抓包资源是开发者理解和实现RTMP相关应用的重要参考资料。通过深入学习这些内容,可以更好地优化直播或点播服务,提高音视频数据传输的效率和质量。无论是对于开发自定义的RTMP...

Global site tag (gtag.js) - Google Analytics