`
阅读更多
RTMP协议详解(转)
2010-03-03 22:54

转自《RTMP协议详解(一) (二) (三)

Real Time Messaging Protocol(实时消息传送协议协议)Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的私有协议。

具体使用RTMPAS代码大概如下:

  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 Serverc++版本,把公司的流媒体服务和flash无缝对接起来。希望我的文字能给后来研究这个协议的同学有一定的帮助。

RTMP协议是一个基于TCP的高层协议族,当然这个玩意据说还有UDP协议版本的,不过现在还没有出来,好像Adobe下一版本的FMS会提供支持。下文将要描述的是TCP协议版本的协议。

   RTMP协议的概要理解:

RTMP协议是为了和flash之间交换信令以及媒体数据。为了提高使用效率信令和媒体数据都是使用相同的机制。因为是相同的机制Adobe就整出来了一些比较搞人的概念,当然每个协议第一次接触都是比较难理解的。

       RTMP协议中信令和媒体数据都称之为Message,在网络中传输这些Message,为了区分它们肯定是要加一个Message head的,所以RTMP协议也有一个Message head,还有一个问题因为RTMP协议是基于TCP的,由于TCP的包长度是有限制的(一般来说不超过1500个字节),而RTMPMessage长度是有可能很大的,像一个视频帧的包可能会有几十甚至几千K,这个问题就必然有一个分片的问题,在RTMP协议中对应的说法就是chunk,每一个Message + head都是由一个和多个chunk组成的。到这里对RTMP协议的概要理解就算完了。

RTMP的字节序:
       RTMP的字节序和大多数网络协议一样是大端序,也有一些字段是小端序的,不过都有特殊的说明。
RTMP的head组成

         RTMP的head在协议中的表现形式是chunk head,前面已经说到一个Message + head可以分成一个和多个chunk,为了区分这些chunk,肯定是需要一个chunk head的,具体的实现就把Message head的信息和chunk head的信息合并在一起以chunk head的形式表现。

        一个完整的chunk的组成如下图所示

                                                        
    

Chunk basic header:

该字段包含chunk的stream ID和 type 。chunk的Type决定了消息头的编码方式。该字段的长度完全依赖于stream ID,该字段是一个可变长的字段。

Chunk Msg Header:0, 3 ,7, 11

该字段包含了将要发送的消息的信息(或者是一部分,一个消息拆成多个chunk的情况下是一部分)该字段的长度由chunk basic header中的type决定。

Extend Timestamp: 0 ,4 bytes

该字段发送的时候必须是正常的时间戳设置成0xffffff时,当正常时间戳不为0xffffff时,该字段不发送。当时间戳比0xffffff小该字段不发送,当时间戳比0xffffff大时该字段必须发送,且正常时间戳设置成0xffffff。

        Chunk Data
        实际数据(Payload),可以是信令,也可以是媒体数据。

Chunk basic header:
   chunk basic head的长度为1~3个字节,具体长度主要是依赖chunk stream ID的长度,所谓chunk stream ID是flash server用来管理连接的客户端的信令交互的标识,在red5的文档中称之为channel ID,协议最大支持65597个streamID 从3~65599。ID 0,1,2为协议保留,0代表ID是64~319(第二个byte + 64);1代表chunk stream ID为64~65599((第三个byte)* 256 + 第二个byte + 64)(小端表示);2代表该消息为低层的协议(在RTMP协议中控制信令的chunk stream ID都是2)。3~63的chunk stream ID就是该byte的值。没有附加的字段来标识chunk stream streamID。在这里要指出的是虽然RTMP的chunk stream ID理论是可以达到65599,但是目前使用的chunk stream ID很少,2~7都是约定的,8是用来传输publish play等命令,其他的chunk stream ID目前好像没有使用,至少我不知道用来干嘛的。
      所以目前chunk basic head的长度一般为1个字节。这一个字节由两部分组成
                           +++++++++++++++++++
                            +fmt    + cs id               +
                            +++++++++++++++++++
      fmt占两个bit用来标识紧跟其后的chunk Msg Header的长度,cs id占六个bit。
      两位的fmt取值为 0~3,分别代表的意义如下:
      case 0:chunk Msg Header长度为11;
      case 1:chunk Msg Header长度为7;
      case 2:chunk Msg Header长度为3;
      case 3:chunk Msg Header长度为0;
      所以 只有一个字节的chunk basic header取值为 chunk basic header = (fmt << 6) | (cs id).

Chunk Msg Header

Chunk Msg Header的长度是可变的,Chunk Msg Header可变的原因是为了压缩传输的字节数,把一些相同类型的chunkhead去掉一些字节,换句话说就是四种类型的包头都可以通过一定的规则还原成11个字节,这个压缩和还原在RTMP协议中称之为复用/解复用。

那我们以11个字节的完整包头来解释Chunk Msg Header,如图所示

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+        timestamp    +    message length + message type id +    message stream id +

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

Timestamp3bytes

对于type 0chunk,绝对时间戳在这里表示,如果时间戳值大于等于0xffffff16777215),该值必须是0xffffff,且时间戳扩展字段必须发送,其他情况没有要求。

message length:3bytes

Message的长度,注意这里的长度并不是跟随chunk head其后的chunk data(Payload)的长度,而是前文提到的一条信令或者一帧视频数据或音频数据的长度。前文提到过信令或者媒体数据都称之为Message,一条Message可以分为一条或者多条chunk。

message type id:1byte

Message的类型ID,具体的值将在后文专门来讨论。

message stream id:4bytes

message stream id的字节序是小端序,这个字段是为了解复用而设计的,RTMP文档上说的相当的模糊,

 

message stream ID可以使任意值,不同的消息流复用成相同的chunk stream,基于它们的ID能够解复用。于chunk stream 是相关的,这个字段是一个不透明的值没有整明白什么意思,我的理解就是用来标识和服务器连接的flash端的序号。

长度是7 byteschunk head,该类型不包含stream ID,该chunkstreamID和前一个chunkstream ID是相同的,变长的消息,例如视频流格式,在第一个新的chunk以后使用这种类型,注意其中时间戳部分是相对时间,为何上一个绝对时间之间的差值 如图所示:

++++++++++++++++++++++++++++++++++++++++++++++++++++++

+     timestamp    delta    +    message length + message type id +   

++++++++++++++++++++++++++++++++++++++++++++++++++++++

        3 bytes的chunk head,该类型既不包含stream ID 也不包含消息长度,这种类型用于stream ID和前一个chunk相同,且有固定长度的信息,例如音频流格式,在第一个新的chunk以后使用该类型。如图所示:

                           ++++++++++++++++++++

                           +     timestamp    delta    +

                           ++++++++++++++++++++

 

        0 bytes的chunk head,这种类型的chunk从前一个chunk得到值信息,当一个单个消息拆成多个chunk时,这些chunk除了第一个以外,其他的都应该使用这种类型,

chunk的长度:

chunk的长度初始长度固定为128个字节,但是这个值并不是不可变的,在客户端和服务端建立连接以后,客户端和服务端都可以通过发送信令的方式来通知对端修改chunk的长度,理论上来说可以修改chunk的最长长度为65536。这里chunk的长度是指chunk的数据部分的长度,即chunk data(payload)的长度,如果一条Message的数据长度超过了chunk的长度,就必须把Message分割成多条chunk,即如果一条视频类型Message长度为2000个byte,chunk长度为1500,则该Message将会分割成两条chunk,第一条的chunk data长度为1500,第二条的chunk data长度为500。当然这两条chunk的chunk head肯定是不同的,其中第二条chunk的chunk head就是0字节的

分享到:
评论
1 楼 binglingyuyang 2010-11-10  
有好多地方的文字看不到耶,不过写得很好,这方面的资料好像很少样的,我也正准备做这个相关方面的开发,以后多发点上来啊

相关推荐

    rtmp 协议规范 中文版

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

    rtmp协议官方文档中文版

    RTMP协议在直播和点播领域有着广泛的应用。 官方文档《rtmp_specification_1.0.pdf》是RTMP协议的权威指南,它详细阐述了协议的各个方面,包括连接建立、数据传输、命令消息以及错误处理等。这份文档通常包含了以下...

    RTMP协议框架完美实现

    `rtmpdump`是基于RTMP协议的一个开源工具,它提供了一种方便的方式来捕获、分析以及回放RTMP流,对于开发者来说,是一个强大的调试和集成RTMP功能的实用程序。 **RTMP协议详解:** RTMP协议基于TCP,主要由三部分...

    rtmp协议.pdf

    本文将详细介绍RTMP协议的核心概念和技术细节,并探讨其在现代多媒体通信中的应用。 #### 二、RTMP协议概述 RTMP协议是一种基于TCP的应用层协议,主要用于实时音频、视频和数据传输。它能够提供低延迟的流媒体传输...

    RTMP协议规范中文翻译

    RTMP协议规范的中文翻译文档是理解并实现该协议的关键资源,尤其对于开发者和网络流媒体服务提供者而言,具有很高的学习价值。 RTMP协议的主要特点包括以下几点: 1. **连接建立**:RTMP协议首先通过TCP建立连接,...

    RTMP 协议下载C++实现

    1. **RTMP协议**:RTMP协议基于TCP,设计时主要考虑了音视频数据的实时传输需求。它包括握手、建立连接、发布/播放、数据传输、断线重连等几个关键步骤。协议支持AMF(Action Message Format)编码的数据,能处理...

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

    RTMP协议的工作原理是建立一个低延迟的TCP连接,通过这个连接发送编码后的音视频数据。 RTMP协议的基础: 1. 连接建立:RTMP协议首先通过TCP连接到服务器,通常在端口1935上。这个连接过程包括握手、建立通道和发送...

    RTMP协议官方文档

    RTMP协议设计之初衷是实现在因特网上实现实时数据传输的高性能、高可靠性和低延迟。RTMP协议在很多直播平台和视频点播服务中得到了广泛的应用。 从官方文档来看,RTMP协议的主要知识点涵盖了以下几个方面: 1. ...

    RTMP协议中文.pdf

    RTMP协议,全称为Real Time Messaging Protocol,是由Adobe公司开发的一种网络流媒体协议,它允许数据以极低的延迟进行实时传输。RTMP设计之初是为了在Flash/AIR平台和流媒体服务器之间传输音频、视频和数据,它作为...

    基于rtmp协议android端推流Demo

    本文将深入探讨一个基于RTMP协议的Android端推流Demo,以及与之相关的技术知识点。 首先,RTMP(Real-Time Messaging Protocol)是一种实时传输协议,常用于在线视频直播、音频传输等场景。它由Adobe Systems开发,...

    基于Rtmp协议的流媒体直播 Demo

    【基于Rtmp协议的流媒体直播 Demo】 在IT行业中,流媒体直播已经成为互联网内容分发的重要方式,尤其在在线教育、游戏竞技、社交娱乐等领域应用广泛。本Demo着重讲解了如何利用Rtmp(Real-Time Messaging Protocol...

    Rtmp协议中文介绍

    ### RTMP协议中文详解 #### 引言 RTMP(Real Time Messaging Protocol),即实时消息传输协议,是一种专为实时音频、视频和数据传输而设计的协议,主要用于流媒体服务,如在线直播、视频点播等场景。本文将对RTMP...

    rtmp协议规范(中文翻译)

    以下是RTMP协议的核心知识点,基于其交互过程和报文构成的详细说明: 1. **协议概述**: RTMP协议主要用于在服务器和客户端之间进行音视频数据的实时传输,如直播或点播服务。它基于TCP,提供可靠的连接,并且支持...

    rtmp协议官方文档1.0中文版

    RTMP块流是RTMP协议的一个重要组成部分,它允许将多媒体数据复用、打包并通过如TCP这样的传输层协议进行传输。 1. 块流的特性: - 块流是一种应用层协议,旨在复用和分组多媒体数据,包括音频、视频和交互数据。 ...

    RTMP协议中AMF的定义.pdf

    ### RTMP协议中AMF的定义 #### 一、引言 实时消息传输协议(Real-Time Messaging Protocol,简称RTMP)是一种专为实时音频、视频数据传输设计的协议,广泛应用于流媒体服务中。在RTMP协议中,AMF(Action Message ...

    RTMP协议详解

    ### RTMP协议详解 #### 一、RTMP协议概述 RTMP(Real-Time Messaging Protocol),即实时消息传输协议,是由Adobe Systems开发的一种专用于音视频流传输的协议。该协议最初设计目的是为了满足互联网上实时音视频...

    rtmp协议文档.7z

    "rtmp协议文档.7z"这个压缩包包含了一系列关于RTMP协议的学习资料,包括中文翻译,对于想要深入理解RTMP的人来说是必不可少的资源。 首先,我们来看看"rtmp规范翻译1.0.docx",这可能是RTMP协议官方规范的中文翻译...

    rtmp协议详解和例子(带书签)

    ### RTMP协议详解 #### 一、RTMP协议概述 RTMP(Real-Time Messaging Protocol)是一种由Adobe Systems开发的协议,主要用于实现音视频等数据在客户端和服务端之间的实时传输。该协议最初是为Flash Player设计的,...

Global site tag (gtag.js) - Google Analytics