• rtmp_specification_1.0


    Copyright Adobe Systems Incorporated H. Parmar, Ed.

    M. Thornburgh, Ed.
    Adobe
    December 21, 2012

    Adobe’s Real Time Messaging Protocol

    Abstract

    This memo describes Adobe’s Real Time Messaging Protocol (RTMP), an
    application-level protocol designed for multiplexing and packetizing
    multimedia transport streams (such as audio, video, and interactive
    content) over a suitable transport protocol (such as TCP).

    Table of Contents

    1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3

    1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 3

    2. Contributors . . . . . . . . . . . . . . . . . . . . . . . . . 3

    3. Definitions . . . . . . . . . . . . . . . . . . . . . . . . . 3

    4. Byte Order, Alignment, and Time Format . . . . . . . . . . . . 5

    5. RTMP Chunk Stream . . . . . . . . . . . . . . . . . . . . . . 5

    5.1. Message Format . . . . . . . . . . . . . . . . . . . . . . 6

    5.2. Handshake . . . . . . . . . . . . . . . . . . . . . . . . 7

    5.2.1. Handshake Sequence . . . . . . . . . . . . . . . . . . 7

    5.2.2. C0 and S0 Format . . . . . . . . . . . . . . . . . . . 7

    5.2.3. C1 and S1 Format . . . . . . . . . . . . . . . . . . . 8

    5.2.4. C2 and S2 Format . . . . . . . . . . . . . . . . . . . 8

    5.2.5. Handshake Diagram . . . . . . . . . . . . . . . . . . 10

    5.3. Chunking . . . . . . . . . . . . . . . . . . . . . . . . . 11

    5.3.1. Chunk Format . . . . . . . . . . . . . . . . . . . . . 11

    5.3.1.1. Chunk Basic Header . . . . . . . . . . . . . . . . 12

    5.3.1.2. Chunk Message Header . . . . . . . . . . . . . . . 13

    5.3.1.2.1. Type 0 . . . . . . . . . . . . . . . . . . . . 14

    5.3.1.2.2. Type 1 . . . . . . . . . . . . . . . . . . . . 14

    5.3.1.2.3. Type 2 . . . . . . . . . . . . . . . . . . . . 15

    5.3.1.2.4. Type 3 . . . . . . . . . . . . . . . . . . . . 15

    5.3.1.2.5. Common Header Fields . . . . . . . . . . . . . 15

    5.3.1.3. Extended Timestamp . . . . . . . . . . . . . . . . 16

    5.3.2. Examples . . . . . . . . . . . . . . . . . . . . . . . 16

    5.3.2.1. Example 1 . . . . . . . . . . . . . . . . . . . . 16

    5.3.2.2. Example 2 . . . . . . . . . . . . . . . . . . . . 17

    5.4. Protocol Control Messages . . . . . . . . . . . . . . . . 18

    5.4.1. Set Chunk Size (1) . . . . . . . . . . . . . . . . . . 19

    5.4.2. Abort Message (2) . . . . . . . . . . . . . . . . . . 19

    5.4.3. Acknowledgement (3) . . . . . . . . . . . . . . . . . 20

    Parmar & Thornburgh [Page 1]


    Adobe RTMP December 2012

    5.4.4. Window Acknowledgement Size (5) . . . . . . . . . . . 20

    5.4.5. Set Peer Bandwidth (6) . . . . . . . . . . . . . . . . 21

    6. RTMP Message Formats . . . . . . . . . . . . . . . . . . . . . 21

    6.1. RTMP Message Format . . . . . . . . . . . . . . . . . . . 22

    6.1.1. Message Header . . . . . . . . . . . . . . . . . . . . 22

    6.1.2. Message Payload . . . . . . . . . . . . . . . . . . . 22

    6.2. User Control Messages (4) . . . . . . . . . . . . . . . . 23

    7. RTMP Command Messages . . . . . . . . . . . . . . . . . . . . 23

    7.1. Types of Messages . . . . . . . . . . . . . . . . . . . . 24

    7.1.1. Command Message (20, 17) . . . . . . . . . . . . . . . 24

    7.1.2. Data Message (18, 15) . . . . . . . . . . . . . . . . 24

    7.1.3. Shared Object Message (19, 16) . . . . . . . . . . . . 24

    7.1.4. Audio Message (8) . . . . . . . . . . . . . . . . . . 26

    7.1.5. Video Message (9) . . . . . . . . . . . . . . . . . . 26

    7.1.6. Aggregate Message (22) . . . . . . . . . . . . . . . . 26

    7.1.7. User Control Message Events . . . . . . . . . . . . . 27

    7.2. Types of Commands . . . . . . . . . . . . . . . . . . . . 28

    7.2.1. NetConnection Commands . . . . . . . . . . . . . . . . 29

    7.2.1.1. connect . . . . . . . . . . . . . . . . . . . . . 29

    7.2.1.2. Call . . . . . . . . . . . . . . . . . . . . . . . 35

    7.2.1.3. createStream . . . . . . . . . . . . . . . . . . . 36

    7.2.2. NetStream Commands . . . . . . . . . . . . . . . . . . 37

    7.2.2.1. play . . . . . . . . . . . . . . . . . . . . . . . 38

    7.2.2.2. play2 . . . . . . . . . . . . . . . . . . . . . . 42

    7.2.2.3. deleteStream . . . . . . . . . . . . . . . . . . . 43

    7.2.2.4. receiveAudio . . . . . . . . . . . . . . . . . . . 44

    7.2.2.5. receiveVideo . . . . . . . . . . . . . . . . . . . 45

    7.2.2.6. publish . . . . . . . . . . . . . . . . . . . . . 45

    7.2.2.7. seek . . . . . . . . . . . . . . . . . . . . . . . 46

    7.2.2.8. pause . . . . . . . . . . . . . . . . . . . . . . 47

    7.3. Message Exchange Examples . . . . . . . . . . . . . . . . 48

    7.3.1. Publish Recorded Video . . . . . . . . . . . . . . . . 48

    7.3.2. Broadcast a Shared Object Message . . . . . . . . . . 50

    7.3.3. Publish Metadata from Recorded Stream . . . . . . . . 50

    8. References . . . . . . . . . . . . . . . . . . . . . . . . . . 51
    Authors’ Addresses . . . . . . . . . . . . . . . . . . . . . . . . 52

    Parmar & Thornburgh [Page 2]


    Adobe RTMP December 2012

    1. Introduction
    Adobe’s Real Time Messaging Protocol (RTMP) provides a bidirectional
    message multiplex service over a reliable stream transport, such as
    TCP [RFC0793], intended to carry parallel streams of video, audio,
    and data messages, with associated timing information, between a pair
    of communicating peers. Implementations typically assign different
    priorities to different classes of messages, which can effect the
    order in which messages are enqueued to the underlying stream
    transport when transport capacity is constrained.

    This memo describes the syntax and operation of the Real Time
    Messaging Protocol.

    1.1. Terminology
    The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
    "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
    "OPTIONAL" in this memo are to be interpreted as described in
    [RFC2119].

    2. Contributors
    Rajesh Mallipeddi, formerly of Adobe Systems, was the original editor
    of this specification, and provided most of its original text.

    Mohit Srivastava of Adobe Systems contributed to the development of
    this specification.

    3. Definitions
    Payload: The data contained in a packet, for example audio samples
    or compressed video data. The payload format and interpretation
    are beyond the scope of this document.

    Packet: A data packet consists of fixed header and payload data.
    Some underlying protocols may require an encapsulation of the
    packet to be defined.

    Port: The "abstraction that transport protocols use to distinguish
    among multiple destinations within a given host computer. TCP/IP
    protocols identify ports using small positive integers." The
    transport selectors (TSEL) used by the OSI transport layer are
    equivalent to ports.

    Parmar & Thornburgh [Page 3]


    Adobe RTMP December 2012

    Transport address: The combination of a network address and port
    that identifies a transport-level endpoint, for example an IP
    address and a TCP port. Packets are transmitted from a source
    transport address to a destination transport address.

    Message stream: A logical channel of communication in which messages
    flow.

    Message stream ID: Each message has an ID associated with it to
    identify the message stream in which it is flowing.

    Chunk: A fragment of a message. The messages are broken into
    smaller parts and interleaved before they are sent over the
    network. The chunks ensure timestamp-ordered end-to-end delivery
    of all messages, across multiple streams.

    Chunk stream: A logical channel of communication that allows flow of
    chunks in a particular direction. The chunk stream can travel
    from the client to the server and reverse.

    Chunk stream ID: Every chunk has an ID associated with it to
    identify the chunk stream in which it is flowing.

    Multiplexing: Process of making separate audio/video data into one
    coherent audio/video stream, making it possible to transmit
    several video and audio simultaneously.

    DeMultiplexing: Reverse process of multiplexing, in which
    interleaved audio and video data are assembled to form the
    original audio and video data.

    Remote Procedure Call (RPC): A request that allows a client or a
    server to call a subroutine or procedure at the peer end.

    Metadata: A description about the data. The metadata of a movie
    includes the movie title, duration, date of creation, and so on.

    Application Instance: The instance of the application at the server
    with which the clients connect by sending the connect request.

    Action Message Format (AMF): A compact binary format that is used to
    serialize ActionScript object graphs. AMF has two versions: AMF 0
    [AMF0] and AMF 3 [AMF3].

    Parmar & Thornburgh [Page 4]


    Adobe RTMP December 2012

    4. Byte Order, Alignment, and Time Format
    All integer fields are carried in network byte order, byte zero is
    the first byte shown, and bit zero is the most significant bit in a
    word or field. This byte order is commonly known as big-endian. The
    transmission order is described in detail in Internet Protocol
    [RFC0791]. Unless otherwise noted, numeric constants in this
    document are in decimal (base 10).

    Except as otherwise specified, all data in RTMP is byte-aligned; for
    example, a 16-bit field may be at an odd byte offset. Where padding
    is indicated, padding bytes SHOULD have the value zero.

    Timestamps in RTMP are given as an integer number of milliseconds
    relative to an unspecified epoch. Typically, each stream will start
    with a timestamp of 0, but this is not required, as long as the two
    endpoints agree on the epoch. Note that this means that any
    synchronization across multiple streams (especially from separate
    hosts) requires some additional mechanism outside of RTMP.

    Because timestamps are 32 bits long, they roll over every 49 days, 17
    hours, 2 minutes and 47.296 seconds. Because streams are allowed to
    run continuously, potentially for years on end, an RTMP application
    SHOULD use serial number arithmetic [RFC1982] when processing
    timestamps, and SHOULD be capable of handling wraparound. For
    example, an application assumes that all adjacent timestamps are
    within 2^31 - 1 milliseconds of each other, so 10000 comes after
    4000000000, and 3000000000 comes before 4000000000.

    Timestamp deltas are also specified as an unsigned integer number of
    milliseconds, relative to the previous timestamp. Timestamp deltas
    may be either 24 or 32 bits long.

    5. RTMP Chunk Stream
    This section specifies the Real Time Messaging Protocol Chunk Stream
    (RTMP Chunk Stream). It provides multiplexing and packetizing
    services for a higher-level multimedia stream protocol.

    While RTMP Chunk Stream was designed to work with the Real Time
    Messaging Protocol (Section 6), it can handle any protocol that sends
    a stream of messages. Each message contains timestamp and payload
    type identification. RTMP Chunk Stream and RTMP together are
    suitable for a wide variety of audio-video applications, from one-toone
    and one-to-many live broadcasting to video-on-demand services to
    interactive conferencing applications.

    Parmar & Thornburgh [Page 5]


    Adobe RTMP December 2012

    When used with a reliable transport protocol such as TCP [RFC0793],
    RTMP Chunk Stream provides guaranteed timestamp-ordered end-to-end
    delivery of all messages, across multiple streams. RTMP Chunk Stream
    does not provide any prioritization or similar forms of control, but
    can be used by higher-level protocols to provide such prioritization.
    For example, a live video server might choose to drop video messages
    for a slow client to ensure that audio messages are received in a
    timely fashion, based on either the time to send or the time to
    acknowledge each message.

    RTMP Chunk Stream includes its own in-band protocol control messages,
    and also offers a mechanism for the higher-level protocol to embed
    user control messages.

    5.1. Message Format
    The format of a message that can be split into chunks to support
    multiplexing depends on a higher level protocol. The message format
    SHOULD however contain the following fields which are necessary for
    creating the chunks.

    Timestamp: Timestamp of the message. This field can transport 4
    bytes.

    Length: Length of the message payload. If the message header cannot
    be elided, it should be included in the length. This field
    occupies 3 bytes in the chunk header.

    Type Id: A range of type IDs are reserved for protocol control
    messages. These messages which propagate information are handled
    by both RTMP Chunk Stream protocol and the higher-level protocol.
    All other type IDs are available for use by the higher-level
    protocol, and treated as opaque values by RTMP Chunk Stream. In
    fact, nothing in RTMP Chunk Stream requires these values to be
    used as a type; all (non-protocol) messages could be of the same
    type, or the application could use this field to distinguish
    simultaneous tracks rather than types. This field occupies 1 byte
    in the chunk header.

    Message Stream ID: The message stream ID can be any arbitrary value.
    Different message streams multiplexed onto the same chunk stream
    are demultiplexed based on their message stream IDs. Beyond that,
    as far as RTMP Chunk Stream is concerned, this is an opaque value.
    This field occupies 4 bytes in the chunk header in little endian
    format.

    Parmar & Thornburgh [Page 6]


    Adobe RTMP December 2012

    5.2. Handshake
    An RTMP connection begins with a handshake. The handshake is unlike
    the rest of the protocol; it consists of three static-sized chunks
    rather than consisting of variable-sized chunks with headers.

    The client (the endpoint that has initiated the connection) and the
    server each send the same three chunks. For exposition, these chunks
    will be designated C0, C1, and C2 when sent by the client; S0, S1,
    and S2 when sent by the server.

    5.2.1. Handshake Sequence
    The handshake begins with the client sending the C0 and C1 chunks.

    The client MUST wait until S1 has been received before sending C2.
    The client MUST wait until S2 has been received before sending any
    other data.

    The server MUST wait until C0 has been received before sending S0 and
    S1, and MAY wait until after C1 as well. The server MUST wait until
    C1 has been received before sending S2. The server MUST wait until
    C2 has been received before sending any other data.

    5.2.2. C0 and S0 Format

    The C0 and S0 packets are a single octet, treated as a single 8-bit

    integer field:

    0 1 2 3 4 5 6 7

    +-+-+-+-+-+-+-+-+

    | version |

    +-+-+-+-+-+-+-+-+

    C0 and S0 bits

    Following are the fields in the C0/S0 packets:

    Version (8 bits): In C0, this field identifies the RTMP version
    requested by the client. In S0, this field identifies the RTMP
    version selected by the server. The version defined by this
    specification is 3. Values 0-2 are deprecated values used by
    earlier proprietary products; 4-31 are reserved for future
    implementations; and 32-255 are not allowed (to allow
    distinguishing RTMP from text-based protocols, which always start
    with a printable character). A server that does not recognize the
    client’s requested version SHOULD respond with 3. The client MAY
    choose to degrade to version 3, or to abandon the handshake.

    Parmar & Thornburgh [Page 7]


    Adobe RTMP December 2012

    5.2.3. C1 and S1 Format

    The C1 and S1 packets are 1536 octets long, consisting of the
    following fields:

    0 1 2 3

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | time (4 bytes) |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | zero (4 bytes) |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | random bytes |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    | random bytes |
    | (cont) |
    | .... |

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    C1 and S1 bits

    Time (4 bytes): This field contains a timestamp, which SHOULD be
    used as the epoch for all future chunks sent from this endpoint.
    This may be 0, or some arbitrary value. To synchronize multiple
    chunkstreams, the endpoint may wish to send the current value of
    the other chunkstream’s timestamp.

    Zero (4 bytes): This field MUST be all 0s.

    Random data (1528 bytes): This field can contain any arbitrary
    values. Since each endpoint has to distinguish between the
    response to the handshake it has initiated and the handshake
    initiated by its peer,this data SHOULD send something sufficiently
    random. But there is no need for cryptographically-secure
    randomness, or even dynamic values.

    5.2.4. C2 and S2 Format

    The C2 and S2 packets are 1536 octets long, and nearly an echo of S1
    and C1 (respectively), consisting of the following fields:

    Parmar & Thornburgh [Page 8]


    Adobe RTMP December 2012

    0 1 2 3

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | time (4 bytes) |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | time2 (4 bytes) |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | random echo |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    | random echo |
    | (cont) |
    | .... |

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    C2 and S2 bits

    Time (4 bytes): This field MUST contain the timestamp sent by the
    peer in S1 (for C2) or C1 (for S2).

    Time2 (4 bytes): This field MUST contain the timestamp at which the
    previous packet(s1 or c1) sent by the peer was read.

    Random echo (1528 bytes): This field MUST contain the random data
    field sent by the peer in S1 (for C2) or S2 (for C1). Either peer
    can use the time and time2 fields together with the current
    timestamp as a quick estimate of the bandwidth and/or latency of
    the connection, but this is unlikely to be useful.

    Parmar & Thornburgh [Page 9]


    Adobe RTMP December 2012

    5.2.5. Handshake Diagram
    +-------------+ +-------------+
    | Client | TCP/IP Network | Server |
    +-------------+ | +-------------+
    | | |
    Uninitialized | Uninitialized
    | C0 | |
    |------------------->| C0 |
    | |-------------------->|
    | C1 | |
    |------------------->| S0 |
    | |<--------------------|
    | | S1 |

    Version sent |<--------------------|
    | S0 | |
    |<-------------------| |
    | S1 | |
    |<-------------------| Version sent
    | | C1 |
    | |-------------------->|
    | C2 | |
    |------------------->| S2 |
    | |<--------------------|

    Ack sent | Ack Sent
    | S2 | |
    |<-------------------| |
    | | C2 |
    | |-------------------->|

    Handshake Done | Handshake Done
    | | |

    Pictorial Representation of Handshake

    The following describes the states mentioned in the handshake
    diagram:

    Uninitialized: The protocol version is sent during this stage. Both
    the client and server are uninitialized. The The client sends the
    protocol version in packet C0. If the server supports the
    version, it sends S0 and S1 in response. If not, the server
    responds by taking the appropriate action. In RTMP, this action
    is terminating the connection.

    Version Sent: Both client and server are in the Version Sent state
    after the Uninitialized state. The client is waiting for the
    packet S1 and the server is waiting for the packet C1. On
    receiving the awaited packets, the client sends the packet C2 and

    Parmar & Thornburgh [Page 10]


    Adobe RTMP December 2012

    the server sends the packet S2. The state then becomes Ack Sent.

    Ack Sent The client and the server wait for S2 and C2 respectively.

    Handshake Done: The client and the server exchange messages.

    5.3. Chunking
    After handshaking, the connection multiplexes one or more chunk
    streams. Each chunk stream carries messages of one type from one
    message stream. Each chunk that is created has a unique ID
    associated with it called chunk stream ID. The chunks are
    transmitted over the network. While transmitting, each chunk must be
    sent in full before the next chunk. At the receiver end, the chunks
    are assembled into messages based on the chunk stream ID.

    Chunking allows large messages at the higher-level protocol to be
    broken into smaller messages, for example to prevent large lowpriority
    messages (such as video) from blocking smaller high-priority
    messages (such as audio or control).

    Chunking also allows small messages to be sent with less overhead, as
    the chunk header contains a compressed representation of information
    that would otherwise have to be included in the message itself.

    The chunk size is configurable. It can be set using a Set Chunk Size
    control message (Section 5.4.1). Larger chunk sizes reduce CPU
    usage, but also commit to larger writes that can delay other content
    on lower bandwidth connections. Smaller chunks are not good for high
    bit rate streaming. Chunk size is maintained independently for each
    direction.

    5.3.1. Chunk Format
    Each chunk consists of a header and data. The header itself has
    three parts:

    +--------------+----------------+--------------------+--------------+
    | Basic Header | Message Header | Extended Timestamp | Chunk Data |
    +--------------+----------------+--------------------+--------------+
    | |
    |<------------------- Chunk Header ----------------->|

    Chunk Format

    Parmar & Thornburgh [Page 11]


    Adobe RTMP December 2012

    Basic Header (1 to 3 bytes): This field encodes the chunk stream ID
    and the chunk type. Chunk type determines the format of the
    encoded message header. The length depends entirely on the chunk
    stream ID, which is a variable-length field.

    Message Header (0, 3, 7, or 11 bytes): This field encodes
    information about the message being sent (whether in whole or in
    part). The length can be determined using the chunk type
    specified in the chunk header.

    Extended Timestamp (0 or 4 bytes): This field is present in certain
    circumstances depending on the encoded timestamp or timestamp
    delta field in the Chunk Message header. See Section 5.3.1.3 for
    more information.

    Chunk Data (variable size): The payload of this chunk, up to the
    configured maximum chunk size.

    5.3.1.1. Chunk Basic Header
    The Chunk Basic Header encodes the chunk stream ID and the chunk type
    (represented by fmt field in the figure below). Chunk type
    determines the format of the encoded message header. Chunk Basic
    Header field may be 1, 2, or 3 bytes, depending on the chunk stream
    ID.

    An implementation SHOULD use the smallest representation that can
    hold the ID.

    The protocol supports up to 65597 streams with IDs 3-65599. The IDs
    0, 1, and 2 are reserved. Value 0 indicates the 2 byte form and an
    ID in the range of 64-319 (the second byte + 64). Value 1 indicates
    the 3 byte form and an ID in the range of 64-65599 ((the third
    byte)*256 + the second byte + 64). Values in the range of 3-63
    represent the complete stream ID. Chunk Stream ID with value 2 is
    reserved for low-level protocol control messages and commands.

    The bits 0-5 (least significant) in the chunk basic header represent
    the chunk stream ID.

    Chunk stream IDs 2-63 can be encoded in the 1-byte version of this
    field.

    Parmar & Thornburgh [Page 12]


    Adobe RTMP December 2012

    0 1 2 3 4 5 6 7
    +-+-+-+-+-+-+-+-+
    |fmt| cs id |
    +-+-+-+-+-+-+-+-+

    Chunk basic header 1

    Chunk stream IDs 64-319 can be encoded in the 2-byte form of the

    header. ID is computed as (the second byte + 64).

    0 1

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    |fmt| 0 | cs id - 64 |

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    Chunk basic header 2

    Chunk stream IDs 64-65599 can be encoded in the 3-byte version of
    this field. ID is computed as ((the third byte)*256 + (the second
    byte) + 64).

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    |fmt| 1 | cs id - 64 |

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    Chunk basic header 3

    cs id (6 bits): This field contains the chunk stream ID, for values
    from 2-63. Values 0 and 1 are used to indicate the 2- or 3-byte
    versions of this field.

    fmt (2 bits): This field identifies one of four format used by the
    ’chunk message header’. The ’chunk message header’ for each of
    the chunk types is explained in the next section.

    cs id - 64 (8 or 16 bits): This field contains the chunk stream ID
    minus 64. For example, ID 365 would be represented by a 1 in cs
    id, and a 16-bit 301 here.

    Chunk stream IDs with values 64-319 could be represented by either

    the 2-byte or 3-byte form of the header.

    5.3.1.2. Chunk Message Header
    There are four different formats for the chunk message header,
    selected by the "fmt" field in the chunk basic header.

    Parmar & Thornburgh [Page 13]


    Adobe RTMP December 2012

    An implementation SHOULD use the most compact representation possible
    for each chunk message header.

    5.3.1.2.1. Type 0

    Type 0 chunk headers are 11 bytes long. This type MUST be used at
    the start of a chunk stream, and whenever the stream timestamp goes
    backward (e.g., because of a backward seek).

    0 1 2 3

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | timestamp |message length |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | message length (cont) |message type id| msg stream id |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | message stream id (cont) |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    Chunk Message Header - Type 0

    timestamp (3 bytes): For a type-0 chunk, the absolute timestamp of
    the message is sent here. If the timestamp is greater than or
    equal to 16777215 (hexadecimal 0xFFFFFF), this field MUST be
    16777215, indicating the presence of the Extended Timestamp field

    to encode the full 32 bit timestamp. Otherwise, this field SHOULD
    be the entire timestamp.
    5.3.1.2.2. Type 1
    Type 1 chunk headers are 7 bytes long. The message stream ID is not

    included; this chunk takes the same stream ID as the preceding chunk.
    Streams with variable-sized messages (for example, many video
    formats) SHOULD use this format for the first chunk of each new
    message after the first.

    0 1 2 3

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | timestamp delta |message length |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | message length (cont) |message type id|
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    Chunk Message Header - Type 1

    Parmar & Thornburgh [Page 14]


    Adobe RTMP December 2012

    5.3.1.2.3. Type 2

    Type 2 chunk headers are 3 bytes long. Neither the stream ID nor the
    message length is included; this chunk has the same stream ID and
    message length as the preceding chunk. Streams with constant-sized
    messages (for example, some audio and data formats) SHOULD use this
    format for the first chunk of each message after the first.

    0 1 2

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    | timestamp delta |

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    Chunk Message Header - Type 2

    5.3.1.2.4. Type 3

    Type 3 chunks have no message header. The stream ID, message length
    and timestamp delta fields are not present; chunks of this type take
    values from the preceding chunk for the same Chunk Stream ID. When a
    single message is split into chunks, all chunks of a message except
    the first one SHOULD use this type. Refer to Example 2
    (Section 5.3.2.2). A stream consisting of messages of exactly the
    same size, stream ID and spacing in time SHOULD use this type for all
    chunks after a chunk of Type 2. Refer to Example 1
    (Section 5.3.2.1). If the delta between the first message and the
    second message is same as the timestamp of the first message, then a
    chunk of Type 3 could immediately follow the chunk of Type 0 as there
    is no need for a chunk of Type 2 to register the delta. If a Type 3
    chunk follows a Type 0 chunk, then the timestamp delta for this Type
    3 chunk is the same as the timestamp of the Type 0 chunk.

    5.3.1.2.5. Common Header Fields
    Description of each field in the chunk message header:

    timestamp delta (3 bytes): For a type-1 or type-2 chunk, the
    difference between the previous chunk’s timestamp and the current
    chunk’s timestamp is sent here. If the delta is greater than or
    equal to 16777215 (hexadecimal 0xFFFFFF), this field MUST be
    16777215, indicating the presence of the Extended Timestamp field
    to encode the full 32 bit delta. Otherwise, this field SHOULD be
    the actual delta.

    Parmar & Thornburgh [Page 15]


    Adobe RTMP December 2012

    message length (3 bytes): For a type-0 or type-1 chunk, the length
    of the message is sent here. Note that this is generally not the
    same as the length of the chunk payload. The chunk payload length
    is the maximum chunk size for all but the last chunk, and the
    remainder (which may be the entire length, for small messages) for
    the last chunk.

    message type id (1 byte): For a type-0 or type-1 chunk, type of the
    message is sent here.

    message stream id (4 bytes): For a type-0 chunk, the message stream
    ID is stored. Message stream ID is stored in little-endian
    format. Typically, all messages in the same chunk stream will
    come from the same message stream. While it is possible to
    multiplex separate message streams into the same chunk stream,
    this defeats the benefits of the header compression. However, if
    one message stream is closed and another one subsequently opened,
    there is no reason an existing chunk stream cannot be reused by
    sending a new type-0 chunk.

    5.3.1.3. Extended Timestamp
    The Extended Timestamp field is used to encode timestamps or
    timestamp deltas that are greater than 16777215 (0xFFFFFF); that is,
    for timestamps or timestamp deltas that don’t fit in the 24 bit
    fields of Type 0, 1, or 2 chunks. This field encodes the complete
    32-bit timestamp or timestamp delta. The presence of this field is
    indicated by setting the timestamp field of a Type 0 chunk, or the
    timestamp delta field of a Type 1 or 2 chunk, to 16777215 (0xFFFFFF).
    This field is present in Type 3 chunks when the most recent Type 0,
    1, or 2 chunk for the same chunk stream ID indicated the presence of
    an extended timestamp field.

    5.3.2. Examples
    5.3.2.1. Example 1

    This example shows a simple stream of audio messages. This example
    demonstrates the redundancy of information.

    Parmar & Thornburgh [Page 16]


    Adobe RTMP December 2012

    +---------+-----------------+-----------------+-----------------+
    | |Message Stream ID| Message TYpe ID | Time | Length |
    +---------+-----------------+-----------------+-------+---------+
    | Msg # 1 | 12345 | 8 | 1000 | 32 |
    +---------+-----------------+-----------------+-------+---------+
    | Msg # 2 | 12345 | 8 | 1020 | 32 |
    +---------+-----------------+-----------------+-------+---------+
    | Msg # 3 | 12345 | 8 | 1040 | 32 |
    +---------+-----------------+-----------------+-------+---------+
    | Msg # 4 | 12345 | 8 | 1060 | 32 |
    +---------+-----------------+-----------------+-------+---------+

    Sample audio messages to be made into chunks

    The next table shows chunks produced in this stream. From message 3
    onward, data transmission is optimized. There is only 1 byte of
    overhead per message beyond this point.

    +--------+---------+-----+------------+------- ---+------------+
    | | Chunk |Chunk|Header Data |No.of Bytes|Total No.of |
    | |Stream ID|Type | | After |Bytes in the|
    | | | | |Header |Chunk |
    +--------+---------+-----+------------+-----------+------------+
    |Chunk#1 | 3 | 0 | delta: 1000| 32 | 44 |
    | | | | length: 32,| | |
    | | | | type: 8, | | |
    | | | | stream ID: | | |
    | | | | 12345 (11 | | |
    | | | | bytes) | | |
    +--------+---------+-----+------------+-----------+------------+
    |Chunk#2 | 3 | 2 | 20 (3 | 32 | 36 |
    | | | | bytes) | | |
    +--------+---------+-----+----+-------+-----------+------------+
    |Chunk#3 | 3 | 3 | none (0 | 32 | 33 |
    | | | | bytes) | | |
    +--------+---------+-----+------------+-----------+------------+
    |Chunk#4 | 3 | 3 | none (0 | 32 | 33 |
    | | | | bytes) | | |
    +--------+---------+-----+------------+-----------+------------+

    Format of each of the chunks of audio messages

    5.3.2.2. Example 2

    This example illustrates a message that is too long to fit in a 128byte
    chunk and is broken into several chunks.

    Parmar & Thornburgh [Page 17]


    Adobe RTMP December 2012

    +-----------+-------------------+-----------------+-----------------+
    | | Message Stream ID | Message TYpe ID | Time | Length |
    +-----------+-------------------+-----------------+-----------------+
    | Msg # 1 | 12346 | 9 (video) | 1000 | 307 |
    +-----------+-------------------+-----------------+-----------------+

    Sample Message to be broken to chunks

    Here are the chunks that are produced:

    +-------+------+-----+-------------+-----------+------------+
    | |Chunk |Chunk|Header |No. of |Total No. of|
    | |Stream| Type|Data |Bytes after| bytes in |
    | | ID | | | Header | the chunk |
    +-------+------+-----+-------------+-----------+------------+
    |Chunk#1| 4 | 0 | delta: 1000 | 128 | 140 |
    | | | | length: 307 | | |
    | | | | type: 9, | | |
    | | | | stream ID: | | |
    | | | | 12346 (11 | | |
    | | | | bytes) | | |
    +-------+------+-----+-------------+-----------+------------+
    |Chunk#2| 4 | 3 | none (0 | 128 | 129 |
    | | | | bytes) | | |
    +-------+------+-----+-------------+-----------+------------+
    |Chunk#3| 4 | 3 | none (0 | 51 | 52 |
    | | | | bytes) | | |
    +-------+------+-----+-------------+-----------+------------+

    Format of each of the chunks

    The header data of chunk 1 specifies that the overall message is 307

    bytes.

    Notice from the two examples, that chunk type 3 can be used in two
    different ways. The first is to specify the continuation of a
    message. The second is to specify the beginning of a new message
    whose header can be derived from the existing state data.

    5.4. Protocol Control Messages
    RTMP Chunk Stream uses message type IDs 1, 2, 3, 5, and 6 for
    protocol control messages. These messages contain information needed
    by the RTMP Chunk Stream protocol.

    These protocol control messages MUST have message stream ID 0 (known
    as the control stream) and be sent in chunk stream ID 2. Protocol
    control messages take effect as soon as they are received; their

    Parmar & Thornburgh [Page 18]


    Adobe RTMP December 2012

    timestamps are ignored.

    5.4.1. Set Chunk Size (1)
    Protocol control message 1, Set Chunk Size, is used to notify the
    peer of a new maximum chunk size.

    The maximum chunk size defaults to 128 bytes, but the client or the
    server can change this value, and updates its peer using this
    message. For example, suppose a client wants to send 131 bytes of
    audio data and the chunk size is 128. In this case, the client can
    send this message to the server to notify it that the chunk size is
    now 131 bytes. The client can then send the audio data in a single
    chunk.

    The maximum chunk size SHOULD be at least 128 bytes, and MUST be at
    least 1 byte. The maximum chunk size is maintained independently for
    each direction.

    0 1 2 3

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |0| chunk size (31 bits) |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    Payload for the ‘Set Chunk Size’ protocol message

    0: This bit MUST be zero.
    chunk size (31 bits): This field holds the new maximum chunk size,
    in bytes, which will be used for all of the sender’s subsequent
    chunks until further notice. Valid sizes are 1 to 2147483647
    (0x7FFFFFFF) inclusive; however, all sizes greater than 16777215
    (0xFFFFFF) are equivalent since no chunk is larger than one
    message, and no message is larger than 16777215 bytes.

    5.4.2. Abort Message (2)
    Protocol control message 2, Abort Message, is used to notify the peer
    if it is waiting for chunks to complete a message, then to discard
    the partially received message over a chunk stream. The peer
    receives the chunk stream ID as this protocol message’s payload. An
    application may send this message when closing in order to indicate
    that further processing of the messages is not required.

    Parmar & Thornburgh [Page 19]


    Adobe RTMP December 2012

    0 1 2 3

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | chunk stream id (32 bits) |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    Payload for the ‘Abort Message’ protocol message

    chunk stream ID (32 bits): This field holds the chunk stream ID,
    whose current message is to be discarded.

    5.4.3. Acknowledgement (3)

    The client or the server MUST send an acknowledgment to the peer
    after receiving bytes equal to the window size. The window size is
    the maximum number of bytes that the sender sends without receiving
    acknowledgment from the receiver. This message specifies the
    sequence number, which is the number of the bytes received so far.

    0 1 2 3

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | sequence number (4 bytes) |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    Payload for the ‘Acknowledgement’ protocol message

    sequence number (32 bits): This field holds the number of bytes
    received so far.

    5.4.4. Window Acknowledgement Size (5)
    The client or the server sends this message to inform the peer of the
    window size to use between sending acknowledgments. The sender
    expects acknowledgment from its peer after the sender sends window
    size bytes. The receiving peer MUST send an Acknowledgement
    (Section 5.4.3) after receiving the indicated number of bytes since
    the last Acknowledgement was sent, or from the beginning of the
    session if no Acknowledgement has yet been sent.

    0 1 2 3

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | Acknowledgement Window size (4 bytes) |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    Payload for the ‘Window Acknowledgement Size’ protocol message

    Parmar & Thornburgh [Page 20]


    Adobe RTMP December 2012

    5.4.5. Set Peer Bandwidth (6)
    The client or the server sends this message to limit the output
    bandwidth of its peer. The peer receiving this message limits its
    output bandwidth by limiting the amount of sent but unacknowledged
    data to the window size indicated in this message. The peer
    receiving this message SHOULD respond with a Window Acknowledgement
    Size message if the window size is different from the last one sent
    to the sender of this message.

    0 1 2 3

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | Acknowledgement Window size |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | Limit Type |
    +-+-+-+-+-+-+-+-+

    Payload for the ‘Set Peer Bandwidth’ protocol message

    The Limit Type is one of the following values:

    0 - Hard: The peer SHOULD limit its output bandwidth to the
    indicated window size.

    1 - Soft: The peer SHOULD limit its output bandwidth to the the
    window indicated in this message or the limit already in effect,
    whichever is smaller.

    2 - Dynamic: If the previous Limit Type was Hard, treat this message
    as though it was marked Hard, otherwise ignore this message.

    6. RTMP Message Formats
    The section specifies the format of RTMP messages that are
    transferred between entities on a network using a lower level
    transport layer, such as RTMP Chunk Stream.

    While RTMP was designed to work with the RTMP Chunk Stream, it can
    send the messages using any other transport protocol. RTMP Chunk
    Stream and RTMP together are suitable for a wide variety of audiovideo
    applications, from one-to-one and one-to-many live broadcasting
    to video-on-demand services to interactive conferencing applications.

    Parmar & Thornburgh [Page 21]


    Adobe RTMP December 2012

    6.1. RTMP Message Format
    The server and the client send RTMP messages over the network to
    communicate with each other. The messages could include audio,
    video, data, or any other messages.

    The RTMP message has two parts, a header and its payload.

    6.1.1. Message Header
    The message header contains the following:

    Message Type: One byte field to represent the message type. A range
    of type IDs (1-6) are reserved for protocol control messages.

    Length: Three-byte field that represents the size of the payload in
    bytes. It is set in big-endian format.

    Timestamp: Four-byte field that contains a timestamp of the message.
    The 4 bytes are packed in the big-endian order.

    Message Stream Id: Three-byte field that identifies the stream of
    the message. These bytes are set in big-endian format.

    0 1 2 3

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | Message Type | Payload length |
    | (1 byte) | (3 bytes) |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | Timestamp |
    | (4 bytes) |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | Stream ID |
    | (3 bytes) |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    Message Header

    6.1.2. Message Payload
    The other part of the message is the payload, which is the actual
    data contained in the message. For example, it could be some audio
    samples or compressed video data. The payload format and
    interpretation are beyond the scope of this document.

    Parmar & Thornburgh [Page 22]


    Adobe RTMP December 2012

    6.2. User Control Messages (4)
    RTMP uses message type ID 4 for User Control messages. These
    messages contain information used by the RTMP streaming layer.
    Protocol messages with IDs 1, 2, 3, 5, and 6 are used by the RTMP
    Chunk Stream protocol (Section 5.4).

    User Control messages SHOULD use message stream ID 0 (known as the
    control stream) and, when sent over RTMP Chunk Stream, be sent on
    chunk stream ID 2. User Control messages are effective at the point
    they are received in the stream; their timestamps are ignored.

    The client or the server sends this message to notify the peer about
    the user control events. This message carries Event type and Event
    data.

    +------------------------------+------------------------|
    Event Type (16 bits) | Event Data
    +------------------------------+------------------------


    Payload for the ‘User Control’ protocol message

    The first 2 bytes of the message data are used to identify the Event
    type. Event type is followed by Event data. The size of Event Data
    field is variable. However, in cases where the message has to pass
    through the RTMP Chunk Stream layer, the maximum chunk size
    (Section 5.4.1) SHOULD be large enough to allow these messages to fit
    in a single chunk.

    Event Types are and their Event Data formats are enumerated in

    Section 7.1.7.

    7. RTMP Command Messages
    This section describes the different types of messages and commands
    that are exchanged between the server and the client to communicate
    with each other.

    The different types of messages that are exchanged between the server
    and the client include audio messages for sending the audio data,
    video messages for sending video data, data messages for sending any
    user data, shared object messages, and command messages. Shared
    object messages provide a general purpose way to manage distributed
    data among multiple clients and a server. Command messages carry the
    AMF encoded commands between the client and the server. A client or
    a server can request Remote Procedure Calls (RPC) over streams that
    are communicated using the command messages to the peer.

    Parmar & Thornburgh [Page 23]


    Adobe RTMP December 2012

    7.1. Types of Messages
    The server and the client send messages over the network to
    communicate with each other. The messages can be of any type which
    includes audio messages, video messages, command messages, shared
    object messages, data messages, and user control messages.

    7.1.1. Command Message (20, 17)

    Command messages carry the AMF-encoded commands between the client
    and the server. These messages have been assigned message type value
    of 20 for AMF0 encoding and message type value of 17 for AMF3
    encoding. These messages are sent to perform some operations like
    connect, createStream, publish, play, pause on the peer. Command
    messages like onstatus, result etc. are used to inform the sender
    about the status of the requested commands. A command message
    consists of command name, transaction ID, and command object that
    contains related parameters. A client or a server can request Remote
    Procedure Calls (RPC) over streams that are communicated using the
    command messages to the peer.

    7.1.2. Data Message (18, 15)

    The client or the server sends this message to send Metadata or any
    user data to the peer. Metadata includes details about the
    data(audio, video etc.) like creation time, duration, theme and so
    on. These messages have been assigned message type value of 18 for
    AMF0 and message type value of 15 for AMF3.

    7.1.3. Shared Object Message (19, 16)
    A shared object is a Flash object (a collection of name value pairs)
    that are in synchronization across multiple clients, instances, and
    so on. The message types 19 for AMF0 and 16 for AMF3 are reserved
    for shared object events. Each message can contain multiple events.

    +------+------+-------+-----+-----+------+-----+ +-----+------+-----+

    |Header|Shared|Current|Flags|Event|Event |Event|.|Event|Event |Event|

    | |Object|Version| |Type |data |data |.|Type |data |data |

    | |Name | | | |length| |.| |length| |

    +------+------+-------+-----+-----+------+-----+ +-----+------+-----+
    | |
    |<- - - - - - - - - - - - - - - - - - - - - - - - - - - - - >|
    | AMF Shared Object Message body |

    The shared object message format

    The following event types are supported:

    Parmar & Thornburgh [Page 24]


    Adobe RTMP December 2012

    +---------------+--------------------------------------------------+
    | Event | Description |
    +---------------+--------------------------------------------------+
    | Use(=1) | The client sends this event to inform the server |
    | | about the creation of a named shared object. |
    +---------------+--------------------------------------------------+
    | Release(=2) | The client sends this event to the server when |
    | | the shared object is deleted on the client side. |
    +---------------+--------------------------------------------------+
    | Request Change| The client sends this event to request that the |
    | (=3) | change the value associated with a named |
    | | parameter of the shared object. |
    +---------------+--------------------------------------------------+
    | Change (=4) | The server sends this event to notify all |
    | | clients, except the client originating the |
    | | request, of a change in the value of a named |
    | | parameter. |
    +---------------+--------------------------------------------------+
    | Success (=5) | The server sends this event to the requesting |
    | | client in response to RequestChange event if the |
    | | request is accepted. |
    +---------------+--------------------------------------------------+
    | SendMessage | The client sends this event to the server to |
    | (=6) | broadcast a message. On receiving this event, |
    | | the server broadcasts a message to all the |
    | | clients, including the sender. |
    +---------------+--------------------------------------------------+
    | Status (=7) | The server sends this event to notify clients |
    | | about error conditions. |
    +---------------+--------------------------------------------------+
    | Clear (=8) | The server sends this event to the client to |
    | | clear a shared object. The server also sends |
    | | this event in response to Use event that the |
    | | client sends on connect. |
    +---------------+--------------------------------------------------+
    | Remove (=9) | The server sends this event to have the client |
    | | delete a slot. |
    +---------------+--------------------------------------------------+
    | Request Remove| The client sends this event to have the client |
    | (=10) | delete a slot. |
    +---------------+--------------------------------------------------+
    | Use Success | The server sends this event to the client on a |
    | (=11) | successful connection. |
    +---------------+--------------------------------------------------+

    Parmar & Thornburgh [Page 25]


    Adobe RTMP December 2012

    7.1.4. Audio Message (8)
    The client or the server sends this message to send audio data to the
    peer. The message type value of 8 is reserved for audio messages.

    7.1.5. Video Message (9)
    The client or the server sends this message to send video data to the
    peer. The message type value of 9 is reserved for video messages.

    7.1.6. Aggregate Message (22)
    An aggregate message is a single message that contains a series of
    RTMP sub-messages using the format described in Section 6.1. Message
    type 22 is used for aggregate messages.

    +---------+-------------------------+
    | Header | Aggregate Message body |
    +---------+-------------------------+

    The Aggregate Message format

    +--------+-------+---------+--------+-------+---------+ - - - |
    Header 0|Message|Back |Header 1|Message|Back |
    | |Data 0 |Pointer 0| |Data 1 |Pointer 1|
    +--------+-------+---------+--------+-------+---------+ - - -


    The Aggregate Message body format

    The message stream ID of the aggregate message overrides the message

    stream IDs of the sub-messages inside the aggregate.

    The difference between the timestamps of the aggregate message and
    the first sub-message is the offset used to renormalize the
    timestamps of the sub-messages to the stream timescale. The offset
    is added to each sub-message’s timestamp to arrive at the normalized
    stream time. The timestamp of the first sub-message SHOULD be the
    same as the timestamp of the aggregate message, so the offset SHOULD
    be zero.

    The back pointer contains the size of the previous message including
    its header. It is included to match the format of FLV file and is
    used for backward seek.

    Using aggregate messages has several performance benefits:

    o The chunk stream can send at most a single complete message within
    a chunk. Therefore, increasing the chunk size and using the
    Parmar & Thornburgh [Page 26]


    Adobe RTMP December 2012

    aggregate message reduces the number of chunks sent.

    o The sub-messages can be stored contiguously in memory. It is more
    efficient when making system calls to send the data on the
    network.
    7.1.7. User Control Message Events
    The client or the server sends this message to notify the peer about
    the user control events. For information about the message format,
    see Section 6.2.

    The following user control event types are supported:

    +---------------+--------------------------------------------------+
    | Event | Description |
    +---------------+--------------------------------------------------+
    |Stream Begin | The server sends this event to notify the client |
    | (=0) | that a stream has become functional and can be |
    | | used for communication. By default, this event |
    | | is sent on ID 0 after the application connect |
    | | command is successfully received from the |
    | | client. The event data is 4-byte and represents |
    | | the stream ID of the stream that became |
    | | functional. |
    +---------------+--------------------------------------------------+
    | Stream EOF | The server sends this event to notify the client |
    | (=1) | that the playback of data is over as requested |
    | | on this stream. No more data is sent without |
    | | issuing additional commands. The client discards |
    | | the messages received for the stream. The |
    | | 4 bytes of event data represent the ID of the |
    | | stream on which playback has ended. |
    +---------------+--------------------------------------------------+
    | StreamDry | The server sends this event to notify the client |
    | (=2) | that there is no more data on the stream. If the |
    | | server does not detect any message for a time |
    | | period, it can notify the subscribed clients |
    | | that the stream is dry. The 4 bytes of event |
    | | data represent the stream ID of the dry stream. |
    +---------------+--------------------------------------------------+
    | SetBuffer | The client sends this event to inform the server |
    | Length (=3) | of the buffer size (in milliseconds) that is |
    | | used to buffer any data coming over a stream. |
    | | This event is sent before the server starts |
    | | processing the stream. The first 4 bytes of the |
    | | event data represent the stream ID and the next |
    | | 4 bytes represent the buffer length, in |

    Parmar & Thornburgh [Page 27]


    Adobe RTMP December 2012

    | | milliseconds. |
    +---------------+--------------------------------------------------+
    | StreamIs | The server sends this event to notify the client |
    | Recorded (=4) | that the stream is a recorded stream. The |
    | | 4 bytes event data represent the stream ID of |
    | | the recorded stream. |
    +---------------+--------------------------------------------------+
    | PingRequest | The server sends this event to test whether the |
    | (=6) | client is reachable. Event data is a 4-byte |
    | | timestamp, representing the local server time |
    | | when the server dispatched the command. The |
    | | client responds with PingResponse on receiving |
    | | MsgPingRequest. |
    +---------------+--------------------------------------------------+
    | PingResponse | The client sends this event to the server in |
    | (=7) | response to the ping request. The event data is |
    | | a 4-byte timestamp, which was received with the |
    | | PingRequest request. |
    +---------------+--------------------------------------------------+

    7.2. Types of Commands
    The client and the server exchange commands which are AMF encoded.
    The sender sends a command message that consists of command name,
    transaction ID, and command object that contains related parameters.
    For example, the connect command contains ’app’ parameter, which
    tells the server application name the client is connected to. The
    receiver processes the command and sends back the response with the
    same transaction ID. The response string is either _result, _error,
    or a method name, for example, verifyClient or contactExternalServer.

    A command string of _result or _error signals a response. The
    transaction ID indicates the outstanding command to which the
    response refers. It is identical to the tag in IMAP and many other
    protocols. The method name in the command string indicates that the
    sender is trying to run a method on the receiver end.

    The following class objects are used to send various commands:

    NetConnection An object that is a higher-level representation of
    connection between the server and the client.

    NetStream An object that represents the channel over which audio
    streams, video streams and other related data are sent. We also
    send commands like play , pause etc. which control the flow of the
    data.

    Parmar & Thornburgh [Page 28]


    Adobe RTMP December 2012

    7.2.1. NetConnection Commands
    The NetConnection manages a two-way connection between a client
    application and the server. In addition, it provides support for
    asynchronous remote method calls.

    The following commands can be sent on the NetConnection :

    o connect
    o call
    o close
    o createStream
    7.2.1.1. connect
    The client sends the connect command to the server to request
    connection to a server application instance.

    The command structure from the client to the server is as follows:

    +----------------+---------+---------------------------------------+
    | Field Name | Type | Description |
    +--------------- +---------+---------------------------------------+
    | Command Name | String | Name of the command. Set to "connect".|
    +----------------+---------+---------------------------------------+
    | Transaction ID | Number | Always set to 1. |
    +----------------+---------+---------------------------------------+
    | Command Object | Object | Command information object which has |
    | | | the name-value pairs. |
    +----------------+---------+---------------------------------------+
    | Optional User | Object | Any optional information |
    | Arguments | | |
    +----------------+---------+---------------------------------------+

    Parmar & Thornburgh [Page 29]


    Adobe RTMP December 2012

    Following is the description of the name-value pairs used in Command
    Object of the connect command.

    +-----------+--------+-----------------------------+----------------+
    | Property | Type | Description | Example Value |
    +-----------+--------+-----------------------------+----------------+
    | app | String | The Server application name | testapp |
    | | | the client is connected to. | |
    +-----------+--------+-----------------------------+----------------+
    | flashver | String | Flash Player version. It is | FMSc/1.0 |
    | | | the same string as returned | |
    | | | by the ApplicationScript | |
    | | | getversion () function. | |
    +-----------+--------+-----------------------------+----------------+
    | swfUrl | String | URL of the source SWF file | file://C:/ |
    | | | making the connection. | FlvPlayer.swf |
    +-----------+--------+-----------------------------+----------------+
    | tcUrl | String | URL of the Server. | rtmp://local |
    | | | It has the following format.| host:1935/test |
    | | | protocol://servername:port/ | app/instance1 |
    | | | appName/appInstance | |
    +-----------+--------+-----------------------------+----------------+
    | fpad | Boolean| True if proxy is being used.| true or false |
    +-----------+--------+-----------------------------+----------------+
    |audioCodecs| Number | Indicates what audio codecs | SUPPORT_SND |
    | | | the client supports. | _MP3 |
    +-----------+--------+-----------------------------+----------------+
    |videoCodecs| Number | Indicates what video codecs | SUPPORT_VID |
    | | | are supported. | _SORENSON |
    +-----------+--------+-----------------------------+----------------+
    |videoFunct-| Number | Indicates what special video| SUPPORT_VID |
    |ion | | functions are supported. | _CLIENT_SEEK |
    +-----------+--------+-----------------------------+----------------+
    | pageUrl | String | URL of the web page from | http:// |
    | | | where the SWF file was | somehost/ |
    | | | loaded. | sample.html |
    +-----------+--------+-----------------------------+----------------+
    | object | Number | AMF encoding method. | AMF3 |
    | Encoding | | | |
    +-----------+--------+-----------------------------+----------------+

    Parmar & Thornburgh [Page 30]


    Adobe RTMP December 2012

    Flag values for the audioCodecs property:

    +----------------------+----------------------------+--------------+
    | Codec Flag | Usage | Value |
    +----------------------+----------------------------+--------------+
    | SUPPORT_SND_NONE | Raw sound, no compression | 0x0001 |
    +----------------------+----------------------------+--------------+
    | SUPPORT_SND_ADPCM | ADPCM compression | 0x0002 |
    +----------------------+----------------------------+--------------+
    | SUPPORT_SND_MP3 | mp3 compression | 0x0004 |
    +----------------------+----------------------------+--------------+
    | SUPPORT_SND_INTEL | Not used | 0x0008 |
    +----------------------+----------------------------+--------------+
    | SUPPORT_SND_UNUSED | Not used | 0x0010 |
    +----------------------+----------------------------+--------------+
    | SUPPORT_SND_NELLY8 | NellyMoser at 8-kHz | 0x0020 |
    | | compression | |
    +----------------------+----------------------------+--------------+
    | SUPPORT_SND_NELLY | NellyMoser compression | 0x0040 |
    | | (5, 11, 22, and 44 kHz) | |
    +----------------------+----------------------------+--------------+
    | SUPPORT_SND_G711A | G711A sound compression | 0x0080 |
    | | (Flash Media Server only) | |
    +----------------------+----------------------------+--------------+
    | SUPPORT_SND_G711U | G711U sound compression | 0x0100 |
    | | (Flash Media Server only) | |
    +----------------------+----------------------------+--------------+
    | SUPPORT_SND_NELLY16 | NellyMouser at 16-kHz | 0x0200 |
    | | compression | |
    +----------------------+----------------------------+--------------+
    | SUPPORT_SND_AAC | Advanced audio coding | 0x0400 |
    | | (AAC) codec | |
    +----------------------+----------------------------+--------------+
    | SUPPORT_SND_SPEEX | Speex Audio | 0x0800 |
    +----------------------+----------------------------+--------------+
    | SUPPORT_SND_ALL | All RTMP-supported audio | 0x0FFF |
    | | codecs | |
    +----------------------+----------------------------+--------------+

    Parmar & Thornburgh [Page 31]


    Adobe RTMP December 2012

    Flag values for the videoCodecs Property:

    +----------------------+----------------------------+--------------+
    | Codec Flag | Usage | Value |
    +----------------------+----------------------------+--------------+
    | SUPPORT_VID_UNUSED | Obsolete value | 0x0001 |
    +----------------------+----------------------------+--------------+
    | SUPPORT_VID_JPEG | Obsolete value | 0x0002 |
    +----------------------+----------------------------+--------------+
    | SUPPORT_VID_SORENSON | Sorenson Flash video | 0x0004 |
    +----------------------+----------------------------+--------------+
    | SUPPORT_VID_HOMEBREW | V1 screen sharing | 0x0008 |
    +----------------------+----------------------------+--------------+
    | SUPPORT_VID_VP6 (On2)| On2 video (Flash 8+) | 0x0010 |
    +----------------------+----------------------------+--------------+
    | SUPPORT_VID_VP6ALPHA | On2 video with alpha | 0x0020 |
    | (On2 with alpha | channel | |
    | channel) | | |
    +----------------------+----------------------------+--------------+
    | SUPPORT_VID_HOMEBREWV| Screen sharing version 2 | 0x0040 |
    | (screensharing v2) | (Flash 8+) | |
    +----------------------+----------------------------+--------------+
    | SUPPORT_VID_H264 | H264 video | 0x0080 |
    +----------------------+----------------------------+--------------+
    | SUPPORT_VID_ALL | All RTMP-supported video | 0x00FF |
    | | codecs | |
    +----------------------+----------------------------+--------------+

    Flag values for the videoFunction property:

    +----------------------+----------------------------+--------------+
    | Function Flag | Usage | Value |
    +----------------------+----------------------------+--------------+
    | SUPPORT_VID_CLIENT | Indicates that the client | 1 |
    | _SEEK | can perform frame-accurate | |
    | | seeks. | |
    +----------------------+----------------------------+--------------+

    Parmar & Thornburgh [Page 32]


    Adobe RTMP December 2012

    Values for the object encoding property:

    +----------------------+----------------------------+--------------+
    | Encoding Type | Usage | Value |
    +----------------------+----------------------------+--------------+
    | AMF0 | AMF0 object encoding | 0 |
    | | supported by Flash 6 and | |
    | | later | |
    +----------------------+----------------------------+--------------+
    | AMF3 | AMF3 encoding from | 3 |
    | | Flash 9 (AS3) | |
    +----------------------+----------------------------+--------------+

    The command structure from server to client is as follows:

    +--------------+----------+----------------------------------------+
    | Field Name | Type | Description |
    +--------------+----------+----------------------------------------+
    | Command Name | String | _result or _error; indicates whether |
    | | | the response is result or error. |
    +--------------+----------+----------------------------------------+
    | Transaction | Number | Transaction ID is 1 for connect |
    | ID | | responses |
    | | | |
    +--------------+----------+----------------------------------------+
    | Properties | Object | Name-value pairs that describe the |
    | | | properties(fmsver etc.) of the |
    | | | connection. |
    +--------------+----------+----------------------------------------+
    | Information | Object | Name-value pairs that describe the |
    | | | response from|the server. ’code’, |
    | | | ’level’, ’description’ are names of few|
    | | | among such information. |
    +--------------+----------+----------------------------------------+

    Parmar & Thornburgh [Page 33]


    Adobe RTMP December 2012

    +--------------+ +-------------+
    | Client | | | Server |
    +------+-------+ | +------+------+
    | Handshaking done |
    | | |
    | | |
    | | |
    | | |
    |----------- Command Message(connect) ------->|
    | |
    |<------- Window Acknowledgement Size --------|
    | |
    |<----------- Set Peer Bandwidth -------------|
    | |
    |-------- Window Acknowledgement Size ------->|
    | |
    |<------ User Control Message(StreamBegin) ---|
    | |
    |<------------ Command Message ---------------|
    | (_result- connect response) |
    | |

    Message flow in the connect command

    The message flow during the execution of the command is:

    1. Client sends the connect command to the server to request to
    connect with the server application instance.
    2. After receiving the connect command, the server sends the
    protocol message ’Window Acknowledgement Size’ to the client.
    The server also connects to the application mentioned in the
    connect command.
    3. The server sends the protocol message ’Set Peer Bandwidth’ to the
    client.
    4. The client sends the protocol message ’Window Acknowledgement
    Size’ to the server after processing the protocol message ’Set
    Peer Bandwidth’.
    5. The server sends an another protocol message of type User Control
    Message(StreamBegin) to the client.
    6. The server sends the result command message informing the client
    of the connection status (success/fail). The command specifies
    the transaction ID (always equal to 1 for the connect command).
    The message also specifies the properties, such as Flash Media
    Parmar & Thornburgh [Page 34]


    Adobe RTMP December 2012

    Server version (string). In addition it specificies other
    connection response related information like level (string), code
    (string), description (string), objectencoding (number), etc.

    7.2.1.2. Call
    The call method of the NetConnection object runs remote procedure
    calls (RPC) at the receiving end. The called RPC name is passed as a
    parameter to the call command.

    The command structure from the sender to the receiver is as follows:

    +--------------+----------+----------------------------------------+
    |Field Name | Type | Description |
    +--------------+----------+----------------------------------------+
    | Procedure | String | Name of the remote procedure that is |
    | Name | | called. |
    +--------------+----------+----------------------------------------+
    | Transaction | Number | If a response is expected we give a |
    | | | transaction Id. Else we pass a value of|
    | ID | | 0 |
    +--------------+----------+----------------------------------------+
    | Command | Object | If there exists any command info this |
    | Object | | is set, else this is set to null type. |
    +--------------+----------+----------------------------------------+
    | Optional | Object | Any optional arguments to be provided |
    | Arguments | | |
    +--------------+----------+----------------------------------------+

    The command structure of the response is as follows:

    +--------------+----------+----------------------------------------+
    | Field Name | Type | Description |
    +--------------+----------+----------------------------------------+
    | Command Name | String | Name of the command. |
    | | | |
    +--------------+----------+----------------------------------------+
    | Transaction | Number | ID of the command, to which the |
    | ID | | response belongs.
    +--------------+----------+----------------------------------------+
    | Command | Object | If there exists any command info this |
    | Object | | is set, else this is set to null type. |
    +--------------+----------+----------------------------------------+
    | Response | Object | Response from the method that was |
    | | | called. |
    +------------------------------------------------------------------+

    Parmar & Thornburgh [Page 35]


    Adobe RTMP December 2012

    7.2.1.3. createStream
    The client sends this command to the server to create a logical
    channel for message communication The publishing of audio, video, and
    metadata is carried out over stream channel created using the
    createStream command.

    NetConnection is the default communication channel, which has a
    stream ID 0. Protocol and a few command messages, including
    createStream, use the default communication channel.

    The command structure from the client to the server is as follows:

    +--------------+----------+----------------------------------------+
    | Field Name | Type | Description |
    +--------------+----------+----------------------------------------+
    | Command Name | String | Name of the command. Set to |
    | | | "createStream". |
    +--------------+----------+----------------------------------------+
    | Transaction | Number | Transaction ID of the command. |
    | ID | | |
    +--------------+----------+----------------------------------------+
    | Command | Object | If there exists any command info this |
    | Object | | is set, else this is set to null type. |
    +--------------+----------+----------------------------------------+

    The command structure from server to client is as follows:

    +--------------+----------+----------------------------------------+
    | Field Name | Type | Description |
    +--------------+----------+----------------------------------------+
    | Command Name | String | _result or _error; indicates whether |
    | | | the response is result or error. |
    +--------------+----------+----------------------------------------+
    | Transaction | Number | ID of the command that response belongs|
    | ID | | to. |
    +--------------+----------+----------------------------------------+
    | Command | Object | If there exists any command info this |
    | Object | | is set, else this is set to null type. |
    +--------------+----------+----------------------------------------+
    | Stream | Number | The return value is either a stream ID |
    | ID | | or an error information object. |
    +--------------+----------+----------------------------------------+

    Parmar & Thornburgh [Page 36]


    Adobe RTMP December 2012

    7.2.2. NetStream Commands
    The NetStream defines the channel through which the streaming audio,
    video, and data messages can flow over the NetConnection that
    connects the client to the server. A NetConnection object can
    support multiple NetStreams for multiple data streams.

    The following commands can be sent on the NetStream by the client to
    the server:

    o play
    o play2
    o deleteStream
    o closeStream
    o receiveAudio
    o receiveVideo
    o publish
    o seek
    o pause
    The server sends NetStream status updates to the client using the
    "onStatus" command:

    Parmar & Thornburgh [Page 37]


    Adobe RTMP December 2012

    +--------------+----------+----------------------------------------+
    | Field Name | Type | Description |
    +--------------+----------+----------------------------------------+
    | Command Name | String | The command name "onStatus". |
    +--------------+----------+----------------------------------------+
    | Transaction | Number | Transaction ID set to 0. |
    | ID | | |
    +--------------+----------+----------------------------------------+
    | Command | Null | There is no command object for |
    | Object | | onStatus messages. |
    +--------------+----------+----------------------------------------+

    | Info Object | Object | An AMF object having at least the |
    | | | following three properties: "level" |
    | | | (String): the level for this message, |
    | | | one of "warning", "status", or "error";|
    | | | "code" (String): the message code, for |
    | | | example "NetStream.Play.Start"; and |
    | | | "description" (String): a human-|
    | | | readable description of the message. |
    | | | The Info object MAY contain other |
    | | | properties as appropriate to the code. |

    +--------------+----------+----------------------------------------+

    Format of NetStream status message commands.

    7.2.2.1. play
    The client sends this command to the server to play a stream. A

    playlist can also be created using this command multiple times.

    If you want to create a dynamic playlist that switches among
    different live or recorded streams, call play more than once and pass
    false for reset each time. Conversely, if you want to play the
    specified stream immediately, clearing any other streams that are
    queued for play, pass true for reset.

    The command structure from the client to the server is as follows:

    +--------------+----------+-----------------------------------------+
    | Field Name | Type | Description |
    +--------------+----------+-----------------------------------------+
    | Command Name | String | Name of the command. Set to "play". |
    +--------------+----------+-----------------------------------------+
    | Transaction | Number | Transaction ID set to 0. |
    | ID | | |
    +--------------+----------+-----------------------------------------+
    | Command | Null | Command information does not exist. |
    | Object | | Set to null type. |

    Parmar & Thornburgh [Page 38]


    Adobe RTMP December 2012

    +--------------+----------+-----------------------------------------+
    | Stream Name | String | Name of the stream to play. |
    | | | To play video (FLV) files, specify the |
    | | | name of the stream without a file |
    | | | extension (for example, "sample"). To |
    | | | play back MP3 or ID3 tags, you must |
    | | | precede the stream name with mp3: |
    | | | (for example, "mp3:sample". To play |
    | | | H.264/AAC files, you must precede the |
    | | | stream name with mp4: and specify the |
    | | | file extension. For example, to play the|
    | | | file sample.m4v,specify "mp4:sample.m4v"|
    | | | |
    +--------------+----------+-----------------------------------------+
    | Start | Number | An optional parameter that specifies |
    | | | the start time in seconds. The default |
    | | | value is -2, which means the subscriber |
    | | | first tries to play the live stream |
    | | | specified in the Stream Name field. If a|
    | | | live stream of that name is not found,it|
    | | | plays the recorded stream of the same |
    | | | name. If there is no recorded stream |
    | | | with that name, the subscriber waits for|
    | | | a new live stream with that name and |
    | | | plays it when available. If you pass -1 |
    | | | in the Start field, only the live stream|
    | | | specified in the Stream Name field is |
    | | | played. If you pass 0 or a positive |
    | | | number in the Start field, a recorded |
    | | | stream specified in the Stream Name |
    | | | field is played beginning from the time |
    | | | specified in the Start field. If no |
    | | | recorded stream is found, the next item |
    | | | in the playlist is played. |
    +--------------+----------+-----------------------------------------+
    | Duration | Number | An optional parameter that specifies the|
    | | | duration of playback in seconds. The |
    | | | default value is -1. The -1 value means |
    | | | a live stream is played until it is no |
    | | | longer available or a recorded stream is|
    | | | played until it ends. If you pass 0, it |
    | | | plays the single frame since the time |
    | | | specified in the Start field from the |
    | | | beginning of a recorded stream. It is |
    | | | assumed that the value specified in |
    | | | the Start field is equal to or greater |
    | | | than 0. If you pass a positive number, |
    | | | it plays a live stream for |

    Parmar & Thornburgh [Page 39]


    Adobe RTMP December 2012

    | | | the time period specified in the |
    | | | Duration field. After that it becomes |
    | | | available or plays a recorded stream |
    | | | for the time specified in the Duration |
    | | | field. (If a stream ends before the |
    | | | time specified in the Duration field, |
    | | | playback ends when the stream ends.) |
    | | | If you pass a negative number other |
    | | | than -1 in the Duration field, it |
    | | | interprets the value as if it were -1. |
    +--------------+----------+-----------------------------------------+
    | Reset | Boolean | An optional Boolean value or number |
    | | | that specifies whether to flush any |
    | | | previous playlist. |
    +--------------+----------+-----------------------------------------+

    Parmar & Thornburgh [Page 40]


    Adobe RTMP December 2012

    +-------------+ +----------+
    | Play Client | | | Server |
    +------+------+ | +-----+----+

    | Handshaking and Application |
    | connect done |
    | | |
    | | |
    | | |
    | | |
    ---+---- |------Command Message(createStream) ----->|
    Create| | |
    Stream| | |
    ---+---- |<---------- Command Message --------------|
    | (_result- createStream response) |
    | |
    ---+---- |------ Command Message (play) ----------->|
    | | |
    | |<------------SetChunkSize --------------|
    | | |
    | |<---- User Control (StreamIsRecorded) ----|
    Play | | |
    | |<---- UserControl (StreamBegin) ----------|
    | | |
    | |<--Command Message(onStatus-play reset) --|
    | | |
    | |<--Command Message(onStatus-play start) --|
    | | |
    | |<-------------Audio Message---------------|
    | | |
    | |<-------------Video Message---------------|
    | | | |

    |
    Keep receiving audio and video stream till finishes

    Message flow in the play command

    The message flow during the execution of the command is:

    1. The client sends the play command after receiving result of the
    createStream command as success from the server.
    2. On receiving the play command, the server sends a protocol
    message to set the chunk size.
    3. The server sends another protocol message (user control)
    specifying the event ’StreamIsRecorded’ and the stream ID in that
    message. The message carries the event type in the first 2 bytes
    and the stream ID in the last 4 bytes.
    Parmar & Thornburgh [Page 41]


    Adobe RTMP December 2012

    4. The server sends another protocol message (user control)
    specifying the event ’StreamBegin’, to indicate beginning of the
    streaming to the client.
    5. The server sends an onStatus command messages
    NetStream.Play.Start & NetStream.Play.Reset if the play command
    sent by the client is successful. NetStream.Play.Reset is sent
    by the server only if the play command sent by the client has set
    the reset flag. If the stream to be played is not found, the
    Server sends the onStatus message NetStream.Play.StreamNotFound.
    After this, the server sends audio and video data, which the client
    plays.

    7.2.2.2. play2

    Unlike the play command, play2 can switch to a different bit rate
    stream without changing the timeline of the content played. The
    server maintains multiple files for all supported bitrates that the
    client can request in play2.

    The command structure from the client to the server is as follows:

    +--------------+----------+----------------------------------------+
    | Field Name | Type | Description |
    +--------------+----------+----------------------------------------+
    | Command Name | String | Name of the command, set to "play2". |
    +--------------+----------+----------------------------------------+
    | Transaction | Number | Transaction ID set to 0. |
    | ID | | |
    +--------------+----------+----------------------------------------+
    | Command | Null | Command information does not exist. |
    | Object | | Set to null type. |
    +--------------+----------+----------------------------------------+
    | Parameters | Object | An AMF encoded object whose properties |
    | | | are the public properties described |
    | | | for the flash.net.NetStreamPlayOptions |
    | | | ActionScript object. |
    +--------------+----------+----------------------------------------+

    The public properties for the NetStreamPlayOptions object are
    described in the ActionScript 3 Language Reference [AS3].

    The message flow for the command is shown in the following
    illustration.

    Parmar & Thornburgh [Page 42]


    Adobe RTMP December 2012

    +--------------+ +-------------+
    | Play2 Client | | | Server |
    +--------+-----+ | +------+------+

    | Handshaking and Application |
    | connect done |
    | | |
    | | |
    | | |
    | | |
    ---+---- |---- Command Message(createStream) --->|
    Create | | |
    Stream | | |
    ---+---- |<---- Command Message (_result) -------|
    | |
    ---+---- |------ Command Message (play) -------->|
    | | |
    | |<------------ SetChunkSize ------------|
    | | |
    | |<--- UserControl (StreamIsRecorded)----|
    Play | | |
    | |<------- UserControl (StreamBegin)-----|
    | | |
    | |<--Command Message(onStatus-playstart)-|
    | | |
    | |<---------- Audio Message -------------|
    | | |
    | |<---------- Video Message -------------|
    | | |
    | |
    ---+---- |-------- Command Message(play2) ------>|
    | | |
    | |<------- Audio Message (new rate) -----|

    Play2 | | |
    | |<------- Video Message (new rate) -----|
    | | | |
    | | | |
    | Keep receiving audio and video stream till finishes

    |

    Message flow in the play2 command

    7.2.2.3. deleteStream
    NetStream sends the deleteStream command when the NetStream object is
    getting destroyed.

    Parmar & Thornburgh [Page 43]


    Adobe RTMP December 2012

    The command structure from the client to the server is as follows:

    +--------------+----------+----------------------------------------+
    | Field Name | Type | Description |
    +--------------+----------+----------------------------------------+
    | Command Name | String | Name of the command, set to |
    | | | "deleteStream". |
    +--------------+----------+----------------------------------------+
    | Transaction | Number | Transaction ID set to 0. |
    | ID | | |
    +--------------+----------+----------------------------------------+
    | Command | Null | Command information object does not |
    | Object | | exist. Set to null type. |
    +--------------+----------+----------------------------------------+
    | Stream ID | Number | The ID of the stream that is destroyed |
    | | | on the server. |
    +--------------+----------+----------------------------------------+

    The server does not send any response.

    7.2.2.4. receiveAudio
    NetStream sends the receiveAudio message to inform the server whether
    to send or not to send the audio to the client.

    The command structure from the client to the server is as follows:

    +--------------+----------+----------------------------------------+
    | Field Name | Type | Description |
    +--------------+----------+----------------------------------------+
    | Command Name | String | Name of the command, set to |
    | | | "receiveAudio". |
    +--------------+----------+----------------------------------------+
    | Transaction | Number | Transaction ID set to 0. |
    | ID | | |
    +--------------+----------+----------------------------------------+
    | Command | Null | Command information object does not |
    | Object | | exist. Set to null type. |
    +--------------+----------+----------------------------------------+
    | Bool Flag | Boolean | true or false to indicate whether to |
    | | | receive audio or not. |
    +--------------+----------+----------------------------------------+

    The server does not send any response, if the receiveAudio command is
    sent with the bool flag set as false. If this flag is set to true,
    server responds with status messages NetStream.Seek.Notify and
    NetStream.Play.Start

    Parmar & Thornburgh [Page 44]


    Adobe RTMP December 2012

    7.2.2.5. receiveVideo
    NetStream sends the receiveVideo message to inform the server whether
    to send the video to the client or not.

    The command structure from the client to the server is as follows:

    +--------------+----------+----------------------------------------+
    | Field Name | Type | Description |
    +--------------+----------+----------------------------------------+
    | Command Name | String | Name of the command, set to |
    | | | "receiveVideo". |
    +--------------+----------+----------------------------------------+
    | Transaction | Number | Transaction ID set to 0. |
    | ID | | |
    +--------------+----------+----------------------------------------+
    | Command | Null | Command information object does not |
    | Object | | exist. Set to null type. |
    +--------------+----------+----------------------------------------+
    | Bool Flag | Boolean | true or false to indicate whether to |
    | | | receive video or not. |
    +--------------+----------+----------------------------------------+

    The server does not send any response, if the receiveVideo command is
    sent with the bool flag set as false. If this flag is set to true,
    server responds with status messages NetStream.Seek.Notify and
    NetStream.Play.Start

    7.2.2.6. publish
    The client sends the publish command to publish a named stream to the
    server. Using this name, any client can play this stream and receive
    the published audio, video, and data messages.

    Parmar & Thornburgh [Page 45]


    Adobe RTMP December 2012

    The command structure from the client to the server is as follows:

    +--------------+----------+----------------------------------------+
    | Field Name | Type | Description |
    +--------------+----------+----------------------------------------+
    | Command Name | String | Name of the command, set to "publish". |
    +--------------+----------+----------------------------------------+
    | Transaction | Number | Transaction ID set to 0. |
    | ID | | |
    +--------------+----------+----------------------------------------+
    | Command | Null | Command information object does not |
    | Object | | exist. Set to null type. |
    +--------------+----------+----------------------------------------+
    | Publishing | String | Name with which the stream is |
    | Name | | published. |
    +--------------+----------+----------------------------------------+

    | Publishing | String | Type of publishing. Set to "live", |
    | Type | | "record", or "append". |
    | | | record: The stream is published and the|
    | | | data is recorded to a new file.The file|
    | | | is stored on the server in a |
    | | | subdirectory within the directory that |
    | | | contains the server application. If the|
    | | | file already exists, it is overwritten.|
    | | | append: The stream is published and the|
    | | | data is appended to a file. If no file |
    | | | is found, it is created. |
    | | | live: Live data is published without |
    | | | recording it in a file. |

    +--------------+----------+----------------------------------------+

    The server responds with the onStatus command to mark the beginning
    of publish.

    7.2.2.7. seek
    The client sends the seek command to seek the offset (in
    milliseconds) within a media file or playlist.

    Parmar & Thornburgh [Page 46]


    Adobe RTMP December 2012

    The command structure from the client to the server is as follows:

    +--------------+----------+----------------------------------------+
    | Field Name | Type | Description |
    +--------------+----------+----------------------------------------+
    | Command Name | String | Name of the command, set to "seek". |
    +--------------+----------+----------------------------------------+
    | Transaction | Number | Transaction ID set to 0. |
    | ID | | |
    +--------------+----------+----------------------------------------+
    | Command | Null | There is no command information object |
    | Object | | for this command. Set to null type. |
    +--------------+----------+----------------------------------------+
    | milliSeconds | Number | Number of milliseconds to seek into |
    | | | the playlist. |
    +--------------+----------+----------------------------------------+

    The server sends a status message NetStream.Seek.Notify when seek is
    successful. In failure, it returns an _error message.

    7.2.2.8. pause
    The client sends the pause command to tell the server to pause or
    start playing.

    Parmar & Thornburgh [Page 47]


    Adobe RTMP December 2012

    The command structure from the client to the server is as follows:

    +--------------+----------+----------------------------------------+
    | Field Name | Type | Description |
    +--------------+----------+----------------------------------------+
    | Command Name | String | Name of the command, set to "pause". |
    +--------------+----------+----------------------------------------+
    | Transaction | Number | There is no transaction ID for this |
    | ID | | command. Set to 0. |
    +--------------+----------+----------------------------------------+
    | Command | Null | Command information object does not |
    | Object | | exist. Set to null type. |
    +--------------+----------+----------------------------------------+
    |Pause/Unpause | Boolean | true or false, to indicate pausing or |
    | Flag | | resuming play |
    +--------------+----------+----------------------------------------+

    | milliSeconds | Number | Number of milliseconds at which the |
    | | | the stream is paused or play resumed. |
    | | | This is the current stream time at the |
    | | | Client when stream was paused. When the|
    | | | playback is resumed, the server will |
    | | | only send messages with timestamps |
    | | | greater than this value. |

    +--------------+----------+----------------------------------------+

    The server sends a status message NetStream.Pause.Notify when the
    stream is paused. NetStream.Unpause.Notify is sent when a stream in
    un-paused. In failure, it returns an _error message.

    7.3. Message Exchange Examples
    Here are a few examples to explain message exchange using RTMP.
    7.3.1. Publish Recorded Video
    This example illustrates how a publisher can publish a stream and
    then stream the video to the server. Other clients can subscribe to
    this published stream and play the video.

    Parmar & Thornburgh [Page 48]


    Adobe RTMP December 2012

    +--------------------+ +-----------+
    | Publisher Client | | | Server |
    +----------+---------+ | +-----+-----+

    | Handshaking Done |
    | | |
    | | |
    ---+---- |----- Command Message(connect) ----->|
    | | |
    | |<----- Window Acknowledge Size ------|
    Connect | | |
    | |<-------Set Peer BandWidth ----------|
    | | |
    | |------ Window Acknowledge Size ----->|
    | | |
    | |<------User Control(StreamBegin)-----|
    | | |
    ---+---- |<---------Command Message -----------|
    | (_result- connect response) |
    | |
    ---+---- |--- Command Message(createStream)--->|
    Create | | |
    Stream | | |
    ---+---- |<------- Command Message ------------|
    | (_result- createStream response) |
    | |
    ---+---- |---- Command Message(publish) ------>|
    | | |
    | |<------User Control(StreamBegin)-----|
    | | |
    | |-----Data Message (Metadata)-------->|
    | | |
    Publishing| |------------ Audio Data ------------>|
    Content | | |
    | |------------ SetChunkSize ---------->|
    | | |
    | |<----------Command Message ----------|
    | | (_result- publish result) |
    | | |
    | |------------- Video Data ----------->|

    | | | |
    | | | |
    | Until the stream is complete |
    | | |

    Message flow in publishing a video stream

    Parmar & Thornburgh [Page 49]


    Adobe RTMP December 2012

    7.3.2. Broadcast a Shared Object Message
    This example illustrates the messages that are exchanged during the
    creation and changing of a shared object. It also illustrates the
    process of shared object message broadcasting.

    +----------+ +----------+
    | Client | | | Server |
    +-----+----+ | +-----+----+
    | Handshaking and Application |
    | connect done |
    | | |
    | | |
    | | |
    | | |

    Create and ---+---- |---- Shared Object Event(Use)---->|
    connect | | |
    Shared Object | | |
    ---+---- |<---- Shared Object Event---------|
    | (UseSuccess,Clear) |
    | |
    ---+---- |------ Shared Object Event ------>|
    Shared object | | (RequestChange) |
    Set Property | | |
    ---+---- |<------ Shared Object Event ------|
    | (Success) |
    | |
    ---+---- |------- Shared Object Event ----->|
    Shared object| | (SendMessage) |
    Message | | |
    Broadcast ---+---- |<------- Shared Object Event -----|
    | (SendMessage) |
    | |
    | |

    Shared object message broadcast

    7.3.3. Publish Metadata from Recorded Stream
    This example describes the message exchange for publishing metadata.

    Parmar & Thornburgh [Page 50]


    Adobe RTMP December 2012

    +------------------+ +---------+
    | Publisher Client | | | FMS |
    +---------+--------+ | +----+----+

    | Handshaking and Application |
    | connect done |
    | | |
    | | |
    ---+--- |---Command Messsage(createStream) -->|
    Create | | |
    Stream | | |
    ---+--- |<---------Command Message------------|
    | (_result - command response) |
    | |
    ---+--- |---- Command Message(publish) ------>|
    Publishing | | |
    metadata | |<------ UserControl(StreamBegin)-----|
    from file | | |
    | |-----Data Message (Metadata) ------->|
    | |

    Publishing metadata

    8. References
    [RFC0791] Postel, J., "Internet Protocol", STD 5, RFC 791,
    September 1981.

    [RFC0793] Postel, J., "Transmission Control Protocol", STD 7,
    RFC 793, September 1981.

    [RFC1982] Elz, R. and R. Bush, "Serial Number Arithmetic", RFC 1982,
    August 1996.

    [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
    Requirement Levels", BCP 14, RFC 2119, March 1997.

    [AS3] Adobe Systems, Inc., "ActionScript 3.0 Reference for the
    Adobe Flash Platform", 2011, <http://www.adobe.com/devnet/
    actionscript/documentation.html>.

    [AMF0] Adobe Systems, Inc., "Action Message Format -- AMF 0",
    December 2007, <http://opensource.adobe.com/wiki/download/
    attachments/1114283/amf0_spec_121207.pdf>.

    [AMF3] Adobe Systems, Inc., "Action Message Format -- AMF 3",
    May 2008, <http://opensource.adobe.com/wiki/download/
    attachments/1114283/amf3_spec_05_05_08.pdf>.

    Parmar & Thornburgh [Page 51]


    Adobe RTMP December 2012

    Authors’ Addresses

    Hardeep Singh Parmar (editor)
    Adobe Systems Incorporated
    345 Park Ave
    San Jose, CA 95110-2704
    US

    Phone: +1 408 536 6000
    Email: hparmar@adobe.com
    URI: http://www.adobe.com/

    Michael C. Thornburgh (editor)
    Adobe Systems Incorporated
    345 Park Ave
    San Jose, CA 95110-2704
    US

    Phone: +1 408 536 6000
    Email: mthornbu@adobe.com
    URI: http://www.adobe.com/

    Parmar & Thornburgh [Page 52]

  • 相关阅读:
    TreeSet——实现Comparable接口并重写CompareTo()方法
    HashMap的四种遍历方式
    HashMap—— values() remove方法 containsKey()方法 containsValue()方法
    HashSet——add remove contains方法底层代码分析(hashCode equals 方法的重写)
    CSS——font使用方法
    css——选择器
    Eclipse怎么改变工程保存路径
    jsp其实是一个java类
    HTML——b i del a p img h1 h2 h3 h4 h5 h6 hr ol ul 标签的使用方法详解
    ACM算法练习-——ZJU1164-Software CRC
  • 原文地址:https://www.cnblogs.com/xiaokang088/p/11517056.html
Copyright © 2020-2023  润新知