Hubbry Logo
Real-Time Messaging ProtocolReal-Time Messaging ProtocolMain
Open search
Real-Time Messaging Protocol
Community hub
Real-Time Messaging Protocol
logo
7 pages, 0 posts
0 subscribers
Be the first to start a discussion here.
Be the first to start a discussion here.
Real-Time Messaging Protocol
Real-Time Messaging Protocol
from Wikipedia

Real-Time Messaging Protocol
Communication protocol
AbbreviationRTMP
PurposeStreaming
Developer(s)Macromedia
Introduction ()
Based onTCP
OSI layerApplication layer (7)
Port(s)tcp/1935

Real-Time Messaging Protocol (RTMP) is a communication protocol for streaming audio, video, and data over the Internet. Originally developed as a proprietary protocol by Macromedia for streaming between Flash Player and the Flash Communication Server, Adobe (which acquired Macromedia) has released an incomplete version of the specification of the protocol for public use.

The RTMP protocol has multiple variations:

  1. RTMP proper, the "plain" protocol which works on top of Transmission Control Protocol (TCP) and uses port number 1935 by default.
  2. RTMPS, which is RTMP over a Transport Layer Security (TLS/SSL) connection.
  3. RTMPE, which is RTMP encrypted using Adobe's own security mechanism. While the details of the implementation are proprietary, the mechanism uses industry standard cryptographic primitives.[1]
  4. RTMPT, which is encapsulated within HTTP requests to traverse firewalls. RTMPT is frequently found utilizing cleartext requests on TCP ports 80 and 443 to bypass most corporate traffic filtering. The encapsulated session may carry plain RTMP, RTMPS, or RTMPE packets within.
  5. RTMFP, which is RTMP over User Datagram Protocol (UDP) instead of TCP, replacing RTMP Chunk Stream. The Secure Real-Time Media Flow Protocol suite has been developed by Adobe Systems and enables end‐users to connect and communicate directly with each other (P2P).
  6. E-RTMP, or Enhanced RTMP, is an enhancement to the RTMP and FLV specifications designed to improve streaming capabilities while maintaining compatibility with existing RTMP infrastructure.[2] E-RTMP enhances RTMP by adding features such as advanced timestamp precision, multitrack capabilities, expanded codec support, FourCC signaling, and a reconnect request feature.

While the primary motivation for RTMP was to be a protocol for playing Flash Video, it is also used in some other applications, such as the Adobe LiveCycle Data Services ES.

Basic operation

[edit]

RTMP is a TCP-based protocol which maintains persistent connections and allows low-latency communication. To deliver streams smoothly and transmit as much information as possible, it splits streams into fragments, and their size is negotiated dynamically between the client and server. Sometimes, it is kept unchanged; the default fragment sizes are 64 bytes for audio data, and 128 bytes for video data and most other data types. Fragments from different streams may then be interleaved, and multiplexed over a single connection. With longer data chunks, the protocol thus carries only a one-byte header per fragment, so incurring very little overhead. However, in practice, individual fragments are not typically interleaved. Instead, the interleaving and multiplexing is done at the packet level, with RTMP packets across several different active channels being interleaved in such a way as to ensure that each channel meets its bandwidth, latency, and other quality-of-service requirements. Packets interleaved in this fashion are treated as indivisible, and are not interleaved on the fragment level.

The RTMP defines several virtual channels on which packets may be sent and received, and which operate independently of each other. For example, there is a channel for handling RPC requests and responses, a channel for video stream data, a channel for audio stream data, a channel for out-of-band control messages (fragment size negotiation, etc.), and so on. During a typical RTMP session, several channels may be active simultaneously at any given time. When RTMP data is encoded, a packet header is generated. The packet header specifies, amongst other matters, the ID of the channel on which it is to be sent, a timestamp of when it was generated (if necessary), and the size of the packet's payload. This header is then followed by the actual payload content of the packet, which is fragmented according to the currently agreed-upon fragment size before it is sent over the connection. The packet header itself is never fragmented, and its size does not count towards the data in the packet's first fragment. In other words, only the actual packet payload (the media data) is subject to fragmentation.

At a higher level, the RTMP encapsulates MP3 or AAC audio and FLV1 video multimedia streams, and can make remote procedure calls (RPCs) using the Action Message Format. Any RPC services required are made asynchronously, using a single client/server request/response model, such that real-time communication is not required.[clarification needed][3][4]

Encryption

[edit]

RTMP sessions may be encrypted using either of two methods:

  • Using industry standard TLS/SSL mechanisms. The underlying RTMP session is simply wrapped inside a normal TLS/SSL session.
  • Using RTMPE, which wraps the RTMP session in a lighter-weight encryption layer.

HTTP tunneling

[edit]

In RTMP Tunneled (RTMPT), RTMP data is encapsulated and exchanged via HTTP, and messages from the client (the media player, in this case) are addressed to port 80 (the default for HTTP) on the server.

While the messages in RTMPT are larger than the equivalent non-tunneled RTMP messages due to HTTP headers, RTMPT may facilitate the use of RTMP in scenarios where the use of non-tunneled RTMP would otherwise not be possible, such as when the client is behind a firewall that blocks non-HTTP and non-HTTPS outbound traffic.

The protocol works by sending commands through the POST URL, and AMF messages through the POST body. An example is

POST /open/1 HTTP/1.1

for a connection to be opened.

Specification document and patent license

[edit]

Adobe has released a specification for version 1.0 of the protocol, dated 21 December 2012.[5] The web landing page leading to that specification notes that "To benefit customers who want to protect their content, the open RTMP specification does not include Adobe's unique secure RTMP measures".[6]

A document accompanying the Adobe specification grants "non-exclusive, royalty-free, nontransferable, non-sublicensable, personal, worldwide" patent license to all implementations of the protocol, with two restrictions: one forbids use for intercepting streaming data ("any technology that intercepts streaming video, audio and/or data content for storage in any device or medium"), and another prohibits circumvention of "technological measures for the protection of audio, video and/or data content, including any of Adobe’s secure RTMP measures".[7]

[edit]

Stefan Richter, author of some books on Flash, noted in 2008 that while Adobe is vague as to which patents apply to RTMP, U.S. patent 7,246,356 appears to be one of them.[3]

In 2011, Adobe did sue Wowza Media Systems claiming, among other things, infringement of their RTMP patents.[8][9][10] In 2015, Adobe and Wowza announced that the lawsuits have been settled and dismissed with prejudice.[11]

Packet structure

[edit]
RTMP Packet Diagram

Packets are sent over a TCP connection, which is established first between client and server. They contain a header and a body which, in the case of connection and control commands, is encoded using the Action Message Format (AMF). The header is split into the Basic Header (shown as detached from the rest, in the diagram) and Chunk Message Header. The Basic Header is the only constant part of the packet and is usually composed of a single composite byte, where the two most significant bits are the Chunk Type (fmt in the specification) and the rest form the Stream ID. Depending on the value of the former, some fields of the Message Header can be omitted, and their value derived from previous packets while depending on the value of the latter, the Basic Header can be extended with one or two extra bytes (as in the case of the diagramme that has three bytes in total (c)). If the value of the remaining six bits of the Basic Header (BH) (least significant) is 0 then the BH is two bytes and represents from Stream ID 64 to 319 (64+255); if the value is 1, then the BH is three bytes (with last two bytes encoded as 16bit Little Endian) and represents from Stream ID 64 to 65599 (64+65535); if the value is 2, then BH is one byte and is reserved for low-level protocol control messages and commands. The Chunk Message Header contains meta-data information such as the message size (measured in bytes), the Timestamp Delta and Message Type. This last value is a single byte and defines whether the packet is an audio, video, command or "low level" RTMP packet such as an RTMP Ping.

An example is shown below as captured when a flash client executes the following code:

var stream:NetStream = new NetStream(connectionObject);

this will generate the following Chunk:

Hex Code ASCII
03 00 0B 68 00 00 19 14 00 00 00 00 02 00 0C 63 72 65 61 74 65 53 74 72 65 61 6D 00 40 00 00 00 00 00 00 00 05 ␀ @ I ␀ ␀ ␙ ␀ ␀ ␀ ␀ ␀ ␌ c r e a t e S t r e a m ␀ @ ␀ ␀ ␀ ␀ ␀ ␀ ␀ ␅

The packet starts with a Basic Header of a single byte (0x03) where the two most significant bits (b00000011) define a chunk header type of 0 while the rest (b00000011) define a Chunk Stream ID of 3. The four possible values of the header type and their significance are:

  • b00 = 12 byte header (full header).
  • b01 = 8 bytes - like type b00, not including message ID (4 last bytes).
  • b10 = 4 bytes - Basic Header and timestamp (3 bytes) are included.
  • b11 = 1 byte - only the Basic Header is included.

The last type (b11) is always used in the case of aggregate messages where, in the example above, the second message will start with an id of 0xC3 (b11000011) and would mean that all Message Header fields should be derived from the message with a stream Id of 3 (which would be the message right above it). The six least significant bits that form the Stream ID can take values between 3 and 63. Some values have special meaning, like 1 that stands for an extended ID format, in which case there will be two bytes following that. A value of two is for low level messages such as Ping and Set Client Bandwidth.

The next bytes of the RTMP Header (including the values in the example packet above) are decoded as follows:

  • byte #1 (0x03) = Chunk Header Type.
  • byte #2–4 (0x000b68) = Timestamp delta.
  • byte #5–7 (0x000019) = Packet Length - in this case it is 0x000019 = 25 bytes.
  • byte #8 (0x14) = Message Type ID - 0x14 (20) defines an AMF0 encoded command message.
  • byte #9–12 (0x00000000) = Message Stream ID. This is in little-endian order.

The Message Type ID byte defines whether the packet contains audio/video data, a remote object or a command. Some possible values for are:

  • 0x01 = Set Packet Size Message.
  • 0x02 = Abort.
  • 0x03 = Acknowledge.
  • 0x04 = Control Message.
  • 0x05 = Server Bandwidth
  • 0x06 = Client Bandwidth.
  • 0x07 = Virtual Control.
  • 0x08 = Audio Packet.
  • 0x09 = Video Packet.
  • 0x0F = Data Extended.
  • 0x10 = Container Extended.
  • 0x11 = Command Extended (An AMF3 type command).
  • 0x12 = Data (Invoke (onMetaData info is sent as such)).
  • 0x13 = Container.
  • 0x14 = Command (An AMF0 type command).
  • 0x15 = UDP
  • 0x16 = Aggregate
  • 0x17 = Present

Following the header, 0x02 denotes a string of size 0x000C and values 0x63 0x72 ... 0x6D ("createStream" command). Following that we have a 0x00 (number) which is the transaction id of value 2.0. The last byte is 0x05 (null) which means there are no arguments.

Invoke Message Structure (0x14, 0x11)

[edit]

Some of the message types shown above, such as Ping and Set Client/Server Bandwidth, are considered low level RTMP protocol messages which do not use the AMF encoding format. Command messages on the other hand, whether AMF0 (Message Type of 0x14) or AMF3 (0x11), use the format and have the general form shown below:

(String) <Command Name>
(Number) <Transaction Id>
(Mixed)  <Argument> ex. Null, String, Object: {key1:value1, key2:value2 ... }

The transaction id is used for commands that can have a reply. The value can be either a string like in the example above or one or more objects, each composed of a set of key/value pairs where the keys are always encoded as strings while the values can be any AMF data type, including complex types like arrays.

Control Message Structure (0x04)

[edit]

Control messages are not AMF encoded. They start with a stream Id of 0x02 which implies a full (type 0) header and have a message type of 0x04. The header is followed by six bytes, which are interpreted as such:

  • #0–1 - Control Type.
  • #2–3 - Second Parameter (this has meaning in specific Control Types)
  • #4–5 - Third Parameter (same)

The first two bytes of the message body define the Ping Type, which can apparently[12] take six possible values.

  • Type 0 - Clear Stream: Sent when the connection is established and carries no further data
  • Type 1 - Clear the Buffer.
  • Type 2 - Stream Dry.
  • Type 3 - The client's buffer time. The third parameter holds the value in millisecond.
  • Type 4 - Reset a stream.
  • Type 6 - Ping the client from server. The second parameter is the current time.
  • Type 7 - Pong reply from client. The second parameter is the time when the client receives the Ping.
  • Type 8 - UDP Request.
  • Type 9 - UDP Response.
  • Type 10 - Bandwidth Limit.
  • Type 11 - Bandwidth.
  • Type 12 - Throttle Bandwidth.
  • Type 13 - Stream Created.
  • Type 14 - Stream Deleted.
  • Type 15 - Set Read Access.
  • Type 16 - Set Write Access.
  • Type 17 - Stream Meta Request.
  • Type 18 - Stream Meta Response.
  • Type 19 - Get Segment Boundary.
  • Type 20 - Set Segment Boundary.
  • Type 21 - On Disconnect.
  • Type 22 - Set Critical Link.
  • Type 23 - Disconnect.
  • Type 24 - Hash Update.
  • Type 25 - Hash Timeout.
  • Type 26 - Hash Request.
  • Type 27 - Hash Response.
  • Type 28 - Check Bandwidth.
  • Type 29 - Set Audio Sample Access.
  • Type 30 - Set Video Sample Access.
  • Type 31 - Throttle Begin.
  • Type 32 - Throttle End.
  • Type 33 - DRM Notify.
  • Type 34 - RTMFP Sync.
  • Type 35 - Query IHello.
  • Type 36 - Forward IHello.
  • Type 37 - Redirect IHello.
  • Type 38 - Notify EOF.
  • Type 39 - Proxy Continue.
  • Type 40 - Proxy Remove Upstream.
  • Type 41 - RTMFP Set Keepalives.
  • Type 46 - Segment Not Found.

Pong is the name for a reply to a Ping, with the values used as seen above.

ServerBw/ClientBw Message Structure (0x05, 0x06)

[edit]

This relates to messages that have to do with the client up-stream and server down-stream bit-rate. The body is composed of four bytes showing the bandwidth value, with a possible extension of one byte which sets the Limit Type. This can have one of three possible values which can be: hard, soft or dynamic (either soft or hard).

Set Chunk Size (0x01)

[edit]

The value received in the four bytes of the body. A default value of 128 bytes exists, and the message is sent only when a change is wanted.

Protocol

[edit]
RTMP Handshake Diagram

Handshake

[edit]

After establishing a TCP connection, an RTMP connection is established first, performing a handshake through the exchange of three packets from each side (also referred to as Chunks in the official documentation). These are referred in the official spec as C0-2 for the client sent packets and S0-2 for the server side respectively and are not to be confused with RTMP packets that can be exchanged only after the handshake is complete. These packets have a structure of their own and C1 contains a field setting the "epoch" timestamp, but since this can be set to zero, as is done in third party implementations, the packet can be simplified. The client initialises the connection by sending the C0 packet with a constant value of 0x03 representing the current protocol version. It follows straight with C1 without waiting for S0 to be received first which contains 1536 bytes, with the first four representing the epoch timestamp, the second four all being 0, and the rest being random (and which can be set to 0 in third party implementations). C2 and S2 are an echo of S1 and C1 respectively, except with the second four bytes being the time the respective message was received (instead of 0). After C2 and S2 are received, the handshake is considered complete.

Connect

[edit]

At this point, the client, and server can negotiate a connection by exchanging AMF encoded messages. These include key value pairs which relate to variables that are needed for a connection to be established. An example message from the client is:

(Invoke) "connect"
(Transaction ID) 1.0
(Object1) { app: "sample", flashVer: "MAC 10,2,153,2", swfUrl: null,
              tcUrl: "rtmpt://127.0.0.1/sample ", fpad: false,
              capabilities: 9947.75 , audioCodecs: 3191, videoCodecs: 252,
              videoFunction: 1 , pageUrl: null, objectEncoding: 3.0 }

The Flash Media Server and other implementations uses the concept of an "app" to conceptually define a container for audio/video and other content, implemented as a folder on the server root which contains the media files to be streamed. The first variable contains the name of this app as "sample" which is the name provided by the Wowza Server for their testing. The flashVer string is the same as returned by the Action-script getversion() function. The audioCodec and videoCodec are encoded as doubles and their meaning can be found in the original spec. The same is true for the videoFunction variable, which in this case is the self-explanatory SUPPORT_VID_CLIENT_SEEK constant. Of special interest is the objectEncoding which will define whether the rest of the communication will make use of the extended AMF3 format or not. As version 3 is the current default, the flash client has to be told explicitly in Action-script code to use AMF0 if that is requested. The server then replies with a ServerBW, a ClientBW and a SetPacketSize message sequence, finally followed by an Invoke, with an example message.

(Invoke) "_result"
(transaction ID) 1.0
(Object1) { fmsVer: "FMS/3,5,5,2004", capabilities: 31.0, mode: 1.0 }
(Object2) { level: "status", code: "NetConnection.Connect.Success",
                   description: "Connection succeeded",
                   data: (array) { version: "3,5,5,2004" },
                   clientId: 1728724019, objectEncoding: 3.0 }

Some values above are serialised into properties of a generic Action-script Object, which is then passed to the NetConnection event listener. The clientId will establish a number for the session to be started by the connection. Object encoding must match the value previously set.

Play video

[edit]

To start a video stream, the client sends a "createStream" invocation followed by a ping message, followed by a "play" invocation with the file name as argument. The server will then reply with a series of "onStatus" commands followed by the video data as encapsulated within RTMP messages.

After a connection is established, media is sent by encapsulating the content of FLV tags into RTMP messages of type 8 and 9 for audio and video, respectively.

Layered-on protocols

[edit]

HTTP tunneling (RTMPT)

[edit]

This refers to the HTTP tunneled version of the protocol. It communicates over port 80 and passes the AMF data inside HTTP POST request and responses. The sequence for connection is as follows:

POST /fcs/ident2 HTTP/1.1
Content-Type: application/x-fcs\r\n

HTTP/1.0 404 Not Found
POST /open/1 HTTP/1.1
Content-Type: application/x-fcs\r\n

HTTP/1.1 200 OK
Content-Type: application/x-fcs\r\n
    1728724019

The first request has an /fcs/ident2 path, and the correct reply is a 404 Not Found error. The client then sends an /open/1 request where the server must reply with a 200 ok appending a random number that will be used as the session identifier for the said communication. In this example, 1728724019 is returned in the response body.

POST /idle/1728724019/0 HTTP/1.1
HTTP/1.1 200 OK
   0x01

From now on, the /idle/<session id>/<sequence #> is a polling request where the session id has been generated and returned from the server and the sequence is just a number that increments by one for every request. The appropriate response is a 200 OK, with an integer returned in the body signifying the interval time. AMF data is sent through /send/<session id>/<sequence #>

Software implementations

[edit]

RTMP is implemented at these three stages:

  • Live video encoder
  • Live and on-demand media streaming server
  • Live and on-demand client

rtmpdump

[edit]

The open-source RTMP client command-line tool rtmpdump is designed to play back or save to disk the full RTMP stream, including the RTMPE protocol Adobe uses for encryption. RTMPdump runs on Linux, Android, Solaris, Mac OS X, and most other Unix-derived operating systems, as well as Microsoft Windows. Originally supporting all versions of 32-bit Windows including Windows 98, from version 2.2 the software will run only on Windows XP and above (although earlier versions remain fully functional).

Packages of the rtmpdump suite of software are available in the major open-source repositories (Linux distributions). These include the front-end apps "rtmpdump", "rtmpsrv" and "rtmpsuck."

Development of RTMPdump was restarted in October 2009, outside the United States, at the MPlayer site.[13] The current version features greatly improved functionality, and has been rewritten to take advantage of the benefits of the C programming language. In particular, the main functionality was built into a library (librtmp) which can easily be used by other applications. The RTMPdump developers have also written support for librtmp for MPlayer, FFmpeg, XBMC, cURL, VLC and a number of other open source software projects. Use of librtmp provides these projects with full support of RTMP in all its variants without any additional development effort.

FLVstreamer

[edit]

FLVstreamer is a fork of RTMPdump, without the code, which Adobe claims violates the DMCA in the USA. This was developed as a response to Adobe's attempt in 2008 to suppress RTMPdump. FLVstreamer is an RTMP client that will save a stream of audio or video content from any RTMP server to disk, if encryption (RTMPE) is not enabled on the stream.

Extensions

[edit]

The above variants are additions made on top of RTMP. However, the limited codec selections of FLV and RTMP has necessitated the industry to add things to the format and the protocol directly.

Ad hoc extension

[edit]

RTMP interally uses its own four-bit "codec ID" instead of standard FourCC to identify the set of codecs it supports. Audio and video codec IDs are considered to be in different namespaces, so using the same value does not cause any conflict: for example, in Adobe's baseline standard, audio codec 7 is G.711A and video codec 7 is H.264.

In China, Kingsoft Cloud assigned H.265 to video codec "12" in 2018, a practice soon accepted by other industry players such as Bilibili. In 2020, Xia Chu of ZLMediaKit assigned Opus to audio codec 13.[14]

All ad hoc additions to the coded ID field have been made obsolete by E-RTMP. E-RTMP does not reuse the IDs 12 and 13, making it compatible with the Chinese ad hoc extensions.

Enhanced RTMP

[edit]

Enhanced RTMP (E-RTMP) is an enhancement to the Real-Time Messaging Protocol (RTMP) and FLV specifications, modernizing streaming workflows while maintaining compatibility with existing RTMP infrastructure.[2] Developed as an open specification, E-RTMP was published by the Veovera Software Organization, with contributions from Adobe, Google, Twitch, and others.

Enhancements introduced in E-RTMP include:

  • New FLV audio and video header formats, which is signaled using reserved parts of the original header formats.
    • The old headers used four-bit integers to identify codec types, which limited extensibility. The new format uses FourCC numbers to identify new codecs. Standard choices include AC-3, E-AC-3, Opus, FLAC for audio and VP8, VP9, HEVC, and AV1 with HDR capabilities for video, though any codec with an agreed-upon FourCC identifier can be used.
    • The new headers include nanosecond-level timestamps for better synchronization with modern media formats.
    • The new headers include the ability to describe a multitrack configuration, allowing simultaneous audio, video, and metadata processing within a single stream.
    • The new audio header can describe multichannel audio configurations, which is more flexible.
    • The new video header uses packet-types instead of frame-types. One of these types, VideoPacketType.Metadata, allows writing any video-metadata in Action Message Format (AMF). (AMF is used in the original RTMP on the protocol-messaging layer, not as part of the FLV video stream.)
  • Advertisement of new codecs capabilities in FourCC format.
  • New fields for onMetaData, an existing metadata mechanism in RTMP (the existing use of AMF).
  • A reconnect request feature to improve connection stability and resilience in streaming workflows.

E-RTMP enhances RTMP’s capabilities while ensuring interoperability with existing RTMP implementations. For example, a legacy decoder would not know how to decode frames containing reserved ("new") headers, but it would still be able to forward it properly.

Because many changes in E-RTMP are made to the FLV format layer, E-RTMP also includes an extension to the FLV file format that can be used independently of E-RTMP. ffmpeg calls this format "enhanced FLV".[15]

Implementations

[edit]

Producers:

Ingesters:

Ingesters, Enhanced-FLV only:

  • e-flv-js, Veovera's fork of flv-js (originally from Bilibili). The author of flv-js also has his own fork mpegts.js with some Enhanced-FLV support.[19]

See also

[edit]

References

[edit]
[edit]
Revisions and contributorsEdit on WikipediaRead on Wikipedia
from Grokipedia
The Real-Time Messaging Protocol (RTMP) is a TCP-based application-layer protocol designed for low-latency, bidirectional transmission of audio, video, and data over the , primarily to enable real-time streaming between clients and servers. Developed by in the early as part of its Flash ecosystem, RTMP facilitates the delivery of live and on-demand content by breaking streams into small chunks and multiplexing messages for efficient transport. RTMP's development began with Macromedia's introduction of the Flash Player in 1996, but the protocol itself emerged around 2002 to support streaming via the Flash Communication Server (later renamed Flash Media Server). After Adobe acquired Macromedia in 2005, the company continued enhancing RTMP, integrating it deeply with Adobe Flash Platform technologies for applications like video conferencing, live broadcasts, and interactive media. In 2009, Adobe announced plans to open the RTMP specification, culminating in the public release of version 1.0 on December 21, 2012, which formalized its structure for broader adoption beyond proprietary use. This specification outlines RTMP's core mechanics, including a three-way handshake for connection establishment, Action Message Format (AMF) encoding for metadata and commands, and chunking to divide larger messages into smaller fragments with a configurable maximum size (default 128 bytes) for reduced latency. At its core, RTMP operates over TCP port 1935 by default, using a client-server model where publishers send streams to an RTMP server, which then distributes them to viewers. Key commands like "publish," "play," and "connect" manage session control, while support for absolute and relative timestamps ensures synchronization in real-time scenarios. Variants such as RTMPS (secured with TLS/SSL), RTMPE (encrypted for enhanced ), and RTMPT (tunneled over HTTP to bypass firewalls) address deployment challenges in varied network environments. These features made RTMP a foundational technology for early , powering platforms for live events and on-demand playback during the Flash era. Although Adobe deprecated Flash Player support in December 2020, RTMP's enduring strengths—low latency (typically under 5 seconds), compatibility with encoding tools like and FFmpeg, and seamless integration with content delivery networks—have sustained its role in modern workflows. Today, it is predominantly used for stream ingestion and egress on major platforms including , Twitch, and Facebook Live, often as a bridge to adaptive bitrate protocols like HLS or for final delivery to browsers and mobile devices. Despite competition from newer, web-native alternatives, RTMP's reliability and widespread encoder support ensure its continued relevance in professional broadcasting and real-time communication systems as of 2025.

Introduction

Definition and Purpose

The Real-Time Messaging Protocol (RTMP) is an application-level, TCP-based binary protocol designed for and packetizing multimedia transport streams, including audio, video, and data, over the . Originally developed for real-time delivery to , it enables the efficient transmission of live and interactive content from sources to receivers. The primary purpose of RTMP is to facilitate low-latency streaming in real-time applications, such as live , video-on-demand, and interactive conferencing, by establishing persistent connections that support continuous data flow between encoders, servers, and playback devices. This protocol ensures timestamp-ordered delivery for synchronized playback, making it suitable for high-performance multimedia scenarios. RTMP's key advantages stem from its use of TCP for reliable, ordered delivery, chunked transmission to adapt to fluctuating bandwidth, and capabilities that allow multiple channels of audio, video, and to share a single connection efficiently. As of 2025, RTMP endures as a foundational standard for live stream ingestion in professional workflows, frequently paired with HTTP-based delivery protocols like HLS to bridge legacy and modern distribution needs post-Flash era. Its proven stability and low latency (typically 2–5 seconds) continue to underpin reliable ingest for platforms handling global live events.

Development History

The Real-Time Messaging Protocol (RTMP) was initially developed by in 2002 as a to enable low-latency streaming of audio, video, and data between the Flash Player and the newly released Flash Communication Server MX. This server software, launched in July 2002, marked RTMP's official debut, supporting real-time communication features in Flash MX applications. Following Adobe's acquisition of Macromedia in December 2005, the protocol was integrated into 's ecosystem, with the server rebranded as Flash Media Server. In 2007, Adobe released Flash Media Server 3.0, enhancing RTMP support for broader capabilities, including tools like the Flash Media Live Encoder for easier content ingestion. A key milestone came in 2008 with the introduction of RTMFP, an extension of RTMP designed for communication, debuting in Flash Player 10 to enable direct client connections and reduce server load. To promote wider adoption, Adobe announced the open specification of RTMP in January 2009 under a patent license as part of the Open Screen Project, with the full specification released on December 21, 2012. After discontinued Flash Player support at the end of 2020, RTMP persisted as a backend ingest protocol in non-browser environments, decoupled from Flash dependencies. By 2025, it remains a standard for ingestion in professional tools like and platforms such as Twitch and , valued for its reliability despite the shift toward web-based alternatives. However, as of 2025, newer protocols like SRT are gaining ground, with adoption rates reaching 77% in broadcast workflows, supplementing RTMP's role. Amid growing cybersecurity concerns, adoption of secure variants like RTMPS—incorporating TLS —has increased to protect streams from interception on public networks. This evolution positions RTMP as a legacy yet enduring foundation for real-time media delivery.

Core Operation

Handshake Mechanism

The Real-Time Messaging Protocol (RTMP) initiates connections through a three-phase that establishes protocol compatibility, synchronizes timestamps between client and server, and facilitates mutual verification. This mechanism prevents unauthorized or incompatible connections while preparing the session for low-latency data exchange. The random data exchanged during the process also supports key derivation for in secure variants, such as RTMPE. The commences with the client transmitting the C0 packet, a single octet containing the RTMP version number—typically 3 for RTMP 1.0 implementations, as versions 0–2 are deprecated and higher values are reserved or disallowed. Immediately thereafter, the client sends the C1 packet, comprising 1536 octets: the initial 4 bytes encode the client's current (Unix epoch time), the following 4 bytes are set to zero, and the remaining 1528 bytes consist of random to uniquely identify the . The server, upon receiving C0, responds with its S0 packet (mirroring the version byte) and S1 packet (structured analogously to C1 but with the server's and random ). The client is required to await of S1 before advancing. In the second phase, after processing S1, the client transmits C2—a 1536-octet packet consisting of the server's timestamp from S1 in the first 4 bytes, the timestamp of when S1 was received by the client in the next 4 bytes, and echoing the random data from S1 in the remaining 1528 bytes. Concurrently, the server, having received C1, sends S2, which echoes C1's random data with the client's timestamp from C1 in the first 4 bytes, the time when C1 was received by the server in the next 4 bytes, and the random data from C1 in the remaining 1528 bytes. Completion occurs once both endpoints have exchanged C2 and S2, confirming and authenticity. This echo-based verification ensures the peers can reliably timestamp subsequent messages relative to a shared . Error conditions during the handshake trigger immediate rejection to maintain and compatibility. A version mismatch in C0 or S0, such as an unsupported value beyond 3, results in connection termination by the receiving party. Likewise, discrepancies in echoed random data or timestamps indicate potential tampering or errors, prompting disconnection. The design emphasizes rapid completion to minimize setup latency in real-time scenarios, aligning with RTMP's focus on low-delay streaming. As of 2025, contemporary RTMP servers preserve with legacy Flash handshakes, enabling seamless integration of older clients despite the of Flash Player.

Basic Message Flow

Following the initial , the RTMP session proceeds with a sequence of application control messages to establish and manage the connection. The client initiates by sending a Connect command to the server, specifying parameters such as the application name, flash version, and connection details like bandwidth limits, which the server acknowledges to confirm session setup. Once connected, the client issues a CreateStream command to allocate a logical channel for media , receiving a stream ID in response from the server. For playback, the client sends a Play command with the name and optional start time, prompting the server to begin delivering media; conversely, for publishing, the client uses a Publish command to start sending media to the server under the specified name. The session concludes with a deleteStream command to delete the and free resources, followed by a final Disconnect if needed. Throughout the session, protocol control messages facilitate adjustments to optimize the flow. Bandwidth negotiation occurs via ServerBw and ClientBw messages, where the server sets the maximum bandwidth window and the client acknowledges its limit, enabling flow control to prevent congestion. Chunk size can be dynamically adjusted using the Set Chunk Size message, starting from a default of 128 bytes and increasing up to 65536 bytes to reduce overhead for larger payloads during active streaming. Media data flows bidirectionally through multiplexed chunks, where audio, video, and metadata are packetized into smaller units for transmission over the underlying TCP connection. These chunks include headers identifying the stream, message type, and , allowing interleaved delivery of different media types while maintaining order within . Reliability is ensured through an acknowledgment mechanism using the Window Acknowledgement Size message, which sets a byte threshold for periodic ACKs from the receiver to confirm data receipt and trigger retransmissions if gaps occur. In typical workflows, live publishing involves an encoder software sending compressed audio and video chunks to the server via the Publish command, enabling real-time distribution to multiple clients with minimal buffering. For playback, the server pushes the stream to the client upon a Play command, reconstructing the media for display, often achieving end-to-end latency under 5 seconds to support interactive applications like live events.

Protocol Specification

Packet and Chunk Structure

The Real-Time Messaging Protocol (RTMP) organizes data into packets, each consisting of a header followed by a variable-length payload. The header ranges from 3 to 18 bytes in total, comprising a basic header (1-3 bytes), a message header (0-11 bytes), and an optional extended timestamp (0-4 bytes). The basic header identifies the chunk stream (also called channel) and the format type, while the message header provides details such as timestamp, message length, and type identifier. Payloads are encoded in binary format, with command and data messages using Action Message Format (AMF) version 0 or 3 for serializing ActionScript objects. The basic header is the fixed portion of every chunk, encoded in 1, 2, or 3 bytes depending on the chunk stream ID (ranging from 2 to 65599, where ID 2 is reserved for protocol control messages). It uses the first 2 bits to indicate the format type (0-3), which determines the message header's structure, followed by bits for the stream ID. For stream IDs 2-63, the header is 1 byte (fmt in bits 7-6, ID-2 in bits 5-0); for 64-319, 2 bytes (fmt, 0, ID-64); and for 64-65599, 3 bytes (fmt, 1, 24-bit ID-64). This compact encoding supports multiple streams over a single TCP connection. The message header varies by format type to minimize overhead for subsequent chunks in the same stream:
Format TypeBytesContents
011Timestamp (3 bytes, 0-16777215 ms), message length (3 bytes), message type ID (1 byte, e.g., 0x08 for audio data), stream ID (4 bytes, little-endian)
17Timestamp delta (3 bytes), message length (3 bytes), message type ID (1 byte); stream ID inherited from previous type 0 chunk
23Timestamp delta (3 bytes); length, type ID, and stream ID inherited from previous type 0 or 1 chunk
30All fields inherited from previous chunk in the stream
If a or delta exceeds 0xFFFFFF (16777215 ms), it is set to 0xFFFFFF, and a 4-byte extended field follows, providing the full 32-bit value. represent milliseconds relative to an arbitrary and may roll over after approximately 49.7 days. The delta for a chunk is calculated as Δt=tcurrenttprevious\Delta t = t_{\text{current}} - t_{\text{previous}}, where tt is the absolute for the message, ensuring ordered reassembly. To handle large messages efficiently, RTMP divides packets into smaller chunks, with a default maximum size of 128 bytes per chunk (excluding header). The sender transmits chunks sequentially for a given until the full is sent, identified by the chunk ID. The recipient reassembles the by summing the payload sizes across all chunks for that until the total equals the specified in the type 0 or 1 header: total L=piL = \sum p_i, where pip_i is the payload size of each chunk ii in the . The chunk size can be adjusted dynamically using the Set Chunk Size control , allowing values from 1 to 2^31-1 bytes independently in each direction, optimizing for network conditions without affecting ongoing streams. This chunking mechanism, applied after the initial , enables low-latency transmission of audio, video, and data.

Message Types

RTMP messages are categorized into several semantic types, each serving distinct roles in protocol control, session , streaming operations, and transmission. These messages are identified by specific type IDs and may use (AMF) for serialization of command objects and parameters, enabling structured exchange over the protocol. The AMF encoding supports both strict and loose modes: strict mode adheres precisely to AMF0 or AMF3 specifications for type enforcement, while loose mode permits flexible interpretation of types to accommodate variations in client implementations. Protocol control messages handle low-level transport adjustments and reliability. The SetChunkSize message (type ID 0x01) notifies the peer of a new maximum chunk size, specified in a 4-byte unsigned payload, to optimize data transmission efficiency without AMF serialization. The AbortMessage (type ID 0x02) instructs the receiver to discard any incomplete message on the specified chunk stream ID, using a 4-byte payload, also without AMF. Acknowledgment (type ID 0x03) confirms receipt of a byte sequence up to the acknowledged window size, with a 4-byte sequence number payload, ensuring reliable delivery in non-handshake contexts. Management messages, serialized via AMF (type ID 0x14 for AMF0 or 0x11 for AMF3), facilitate session and stream lifecycle operations. The Connect message requests establishment of a connection to a server application instance, with AMF payload including the command name "connect", a transaction ID (typically 1), and a command object containing parameters such as application name (e.g., "app": "myapp") and Flash version. CreateStream invokes creation of a logical channel for subsequent messaging, using AMF with command name "createStream", a transaction ID, and a null object; the server responds with the assigned stream ID. DeleteStream terminates an existing , serialized in AMF as command name "deleteStream", transaction ID 0, null object, and the target stream ID as a double. Streaming messages enable playback and of media s, also using AMF (type ID 0x14 for AMF0 or 0x11 for AMF3). The Play message initiates playback of a named , with AMF payload comprising command name "play", transaction ID 0, null object, name (string), optional start time (-2 for live s), duration (-1 for unlimited), and a reset flag (, default false). Publish starts a for remote consumption, serialized as command name "publish", transaction ID 0, null object, and name; an optional type (e.g., "live", "record", or "") may follow to specify behavior. Data and media messages transmit content and auxiliary information, with some relying on AMF for structured payloads. Audio data (type ID 0x08) carries raw audio packets without AMF, prefixed by a 1-byte header indicating format and sampling details. Video data (type ID 0x09) similarly conveys raw video frames, with a 1-byte header for and frame type information, no AMF involved. The Metadata message (type ID 0x12 for AMF0 or 0x0F for AMF3), often called Data Message or @setDataFrame, delivers stream metadata or user-defined as AMF-serialized key-value pairs, such as creation time, duration, or custom properties in an ECMA array (e.g., {type: "ecma-array", value: {duration: 123.45, width: 640}}). Shared Object messages (type ID 0x13 for AMF0 or 0x10 for AMF3) support real-time synchronization of persistent across clients, using AMF to encode the object name, version, persistence flags, and events like "change" or "update" with modified properties in an format.
Message TypeID (AMF0/AMF3)Primary RoleAMF Serialization Example
SetChunkSize0x01Adjust chunk sizeN/A (4-byte integer)
AbortMessage0x02Abort incomplete messageN/A (4-byte stream ID)
Acknowledgment0x03Confirm bytes receivedN/A (4-byte sequence)
Connect0x14 / 0x11Establish session"connect", 1, {app: "myapp"}
CreateStream0x14 / 0x11Create stream channel"createStream", txnId, null
DeleteStream0x14 / 0x11Terminate stream"deleteStream", 0, null, streamId
Play0x14 / 0x11Start playback"play", 0, null, "stream", -2, -1, false
Publish0x14 / 0x11Start broadcasting"publish", 0, null, "stream", "live"
Audio0x08Transmit audioN/A (raw with 1-byte header)
Video0x09Transmit videoN/A (raw with 1-byte header)
Metadata0x12 / 0x0FSend stream data@setDataFrame, "onMetadata", {duration: 120}
Shared Object0x13 / 0x10Sync shared dataObjectName, 0, flags, "change", {prop: value}
This table summarizes the key message types, highlighting their IDs, roles, and representative AMF structures where applicable.

Variants and Extensions

HTTP Tunneling (RTMPT)

RTMPT, or Real-Time Messaging Protocol Tunneled, is a variant of RTMP that encapsulates RTMP packets within HTTP or GET requests to enable communication over standard web ports, typically 80 for HTTP and 443 for , thereby facilitating traversal of firewalls that block the native RTMP port 1935. This tunneling approach allows bidirectional data flow in environments where direct TCP connections are restricted, such as corporate or educational networks, by leveraging HTTP's ubiquity. The connection process begins with an initial HTTP request from the client to initiate the RTMP , mirroring the standard RTMP mechanism with C0-C2 (client) and S0-S2 (server) chunks exchanged within the HTTP body. Subsequent communication relies on polling: the client sends periodic HTTP requests (e.g., using paths like /rtmpt or /rtmpte) to check for server responses, while the server responds with RTMP data encapsulated in HTTP. To optimize efficiency, RTMPT employs HTTP/1.1 , which streams data in variable-sized chunks without requiring a predefined content length, allowing continuous transmission over persistent connections. A primary advantage of RTMPT is its ability to bypass network firewalls and proxies that prohibit non-HTTP traffic, making it suitable for streaming in restricted settings like enterprise environments. However, the polling mechanism introduces higher latency compared to native RTMP, as clients must wait for response intervals—often set by the server to around 0.5 seconds—resulting in added delays from repeated HTTP round trips and protocol overhead. This overhead also increases bandwidth usage due to HTTP headers wrapping each RTMP packet. As of 2025, RTMPT remains relevant in corporate networks with stringent firewall policies, where it supports legacy Flash-based applications and integrates with modern streaming proxies for compatibility in hybrid environments. Its use persists for scenarios requiring RTMP functionality without direct access, though adoption has declined with the shift to browser-native protocols.

Secure RTMP (RTMPS) and Enhancements

Secure RTMP, commonly referred to as RTMPS, encapsulates the Real-Time Messaging Protocol within a (TLS) or Secure Sockets Layer (SSL) connection to provide encrypted communication between clients and servers. This variant typically operates on port 1935, the default for RTMP, but can also utilize port 443 to facilitate traversal through firewalls that block non-standard ports. The TLS handshake establishes the secure session, involving to derive symmetric encryption keys for the entire RTMP stream, ensuring confidentiality and integrity of transmitted data. In RTMPS, encryption is handled at the transport layer via TLS, which commonly employs AES () ciphers for payload protection following the , while older implementations may have supported before its deprecation due to vulnerabilities. Certificate validation during the TLS verifies the server's identity against trusted certificate authorities, thereby preventing man-in-the-middle (MITM) attacks by rejecting invalid or self-signed certificates. This mechanism ensures that intermediaries cannot intercept or tamper with the stream without detection, a critical feature for protecting live media content from unauthorized access. Another secure variant, RTMPE (Real-Time Messaging Protocol Encrypted), uses Adobe's encryption mechanism, such as a 128-bit encrypted channel based on techniques like XOR key streams derived from Diffie-Hellman exchanges, to protect streams without relying on TLS certificate management. Developed for enhanced security in the Flash era, RTMPE provides an alternative to RTMPS but has seen limited adoption in modern deployments due to its nature and the deprecation of Flash Player. Enhancements to the RTMP ecosystem include the Secure Real-Time Media Flow Protocol (RTMFP), introduced by in 2008 as a UDP-based extension designed for (P2P) multimedia streaming. RTMFP reduces server load by enabling direct client-to-client connections for video and audio flows, supporting features such as relay connections for fallback when direct P2P fails and UDP hole-punching for (NAT) traversal in firewalled environments. These capabilities allow for efficient, low-overhead distribution of real-time content, particularly in multi-user scenarios like video conferencing or live broadcasts. By 2025, enhancements in RTMP implementations have evolved to mandate TLS in new deployments, reflecting industry standards for secure streaming ingestion. Additionally, hybrid architectures integrating RTMP with have gained traction, where RTMP serves as a reliable input for encoding and to WebRTC outputs, achieving sub-second latency in interactive applications while leveraging RTMP's stability for professional-grade feeds.

Implementations

Server Software

Server software for the Real-Time Messaging Protocol (RTMP) encompasses both commercial and open-source solutions designed to handle live video , distribution, and . Commercial options include the legacy Media Server, originally developed by Systems for RTMP-based streaming of audio and video, which supported features like live publishing and on-demand playback but has been largely phased out with core support ending in 2018 in favor of cloud services. A prominent active commercial implementation is , which in 2025 continues to support RTMP for live stream while enabling transcoding to adaptive bitrate formats like HLS for broader device compatibility and delivery. Open-source alternatives provide flexible, cost-effective options for RTMP deployment. The Nginx RTMP module, integrated into the high-performance , enables efficient handling of RTMP streams alongside protocols such as HLS and , making it suitable for scalable live broadcasting environments. Another key open-source server is Red5, a Java-based platform offering a comprehensive RTMP suite that supports streaming of FLV, MP4, and other formats, with capabilities for both live and recorded media delivery. Additional popular open-source options include SRS (Simple Realtime Server), which focuses on low-latency RTMP streaming and integration with modern protocols, and Ant Media Server, supporting ultra-low latency alongside RTMP. Common features across these servers include support for multiple streaming protocols to facilitate hybrid workflows, load balancing to distribute traffic across instances for high availability, and recording functionalities to capture streams for later playback or archiving. For instance, Nginx's RTMP module allows configuration for session recording and relay to upstream servers, enhancing reliability in production setups. In 2025, trends emphasize hybrid servers that integrate RTMP ingestion with modern protocols like SRT for secure, low-latency contribution and for real-time playback, allowing seamless transitions in multi-protocol environments. Deployment of these servers often involves straightforward configuration files. A basic example for the Nginx RTMP module listens on the standard RTMP port and defines an application for live streaming:

rtmp { server { listen 1935; chunk_size 4000; application live { live on; # Additional directives for recording, access control, etc. } } }

rtmp { server { listen 1935; chunk_size 4000; application live { live on; # Additional directives for recording, access control, etc. } } }

This setup, placed in the nginx.conf file, allows RTMP streams to be published and pulled from the server, with extensions for HLS output or load balancing as needed.

Client and Encoder Tools

OBS Studio is a free, for video recording and that supports RTMP output, allowing users to encode and push streams to RTMP servers with customizable plugins for enhanced functionality. It integrates FFmpeg encoders for handling various codecs, enabling seamless RTMP transmission from sources like webcams or screen captures. FFmpeg, a command-line framework, provides robust support for RTMP through its rtmp:// protocol, facilitating muxing, encoding, and streaming of audio and video data to RTMP endpoints. Users can configure FFmpeg to process inputs in formats like FLV and output them directly over RTMP, making it a versatile tool for professional and automated workflows. For legacy stream dumping and playback, rtmpdump serves as a command-line utility to capture RTMP streams into FLV files, often paired with FFmpeg for further processing or conversion. Modern clients like , version 1.1 and later, include an RTMP playback module that allows direct ingestion of RTMP via the "Open Network Stream" feature, supporting playback on Windows and macOS without additional plugins. Post-2020, following the deprecation of Flash, RTMP tools have evolved toward browser integration through experimental libraries such as webrtmp, which enable HTML5-based RTMP client functionality without native Flash support. In 2025, professional encoders like Wirecast offer advanced multi-stream RTMP capabilities, allowing simultaneous pushes to multiple destinations with built-in presets for platforms like and . A typical FFmpeg command for RTMP streaming is ffmpeg -i input.flv -f flv rtmp://server/app/stream, which encodes an input FLV file and sends it to the specified RTMP server application and stream key. This approach supports low-latency delivery while maintaining compatibility with H.264 video and AAC audio standards commonly used in RTMP workflows.

Specification and Licensing

In January 2009, Adobe announced plans to publicly release the Real-Time Messaging Protocol (RTMP) specification, culminating in the release of version 1.0 on December 21, 2012, providing a detailed description of the protocol for high-performance streaming of audio, video, and data between Flash Platform applications and servers. This document, titled "RTMP Specification," outlines the protocol's structure, including chunk streaming, message formats, and handshake processes, establishing it as the authoritative reference for RTMP version 1.0 implementations. Although efforts to formalize RTMP through IETF drafts did not succeed, the protocol has become a de facto standard through widespread adoption in open-source projects. Under the terms of the 2012 specification, Adobe granted implementers a non-exclusive, royalty-free, non-transferable, and non-sublicensable worldwide patent license covering its Essential Claims, allowing the creation, use, sale, and distribution of compliant implementations. This license requires strict adherence to the published specification to qualify as a "Compliant Implementation," with no provisions for reverse-engineering or modifications that deviate from the defined protocol behaviors. The agreement includes defensive suspension clauses, whereby the license may terminate if the implementer asserts patent claims against Adobe or its products related to compliant RTMP usage, and it disclaims all warranties, providing the specification "AS IS." The original specification document is available for download from Adobe's archived developer resources, with preserved copies hosted on reputable open-source repositories. As of 2025, community-driven initiatives have introduced clarifications and extensions to the original spec, including the Enhanced RTMP V2 specification, which builds on Adobe's document with backward-compatible updates for modern streaming needs while maintaining core compliance. RTMP compliance encompasses specific serialization rules for (AMF) versions 0 and 3, which are integral to message encoding and decoding within the protocol. provided dedicated specifications for AMF0 (December 2007) and AMF3 (May 2008), detailing binary formats for object graphs, type markers, and data types to ensure interoperability in RTMP communications. These AMF rules mandate precise handling of structures like strings, numbers, and arrays to avoid deserialization errors in compliant systems.

Patents and Litigation

Adobe holds several patents related to the Real-Time Messaging Protocol (RTMP), with key examples covering aspects of client-server communications for streaming. One prominent patent is U.S. Patent No. 7,246,356, issued on , 2007, to Systems Incorporated, which describes methods for facilitating interactive communications between clients and servers, including references to RTMP for connection establishment. This patent, filed in 2003, expired in 2023 after its 20-year term, aligning with standard U.S. durations. 's broader portfolio encompasses elements like the RTMP handshake process and chunking mechanisms for efficient data transmission, though the company has historically been nonspecific about exact coverage in public disclosures. Litigation involving RTMP patents primarily occurred between 2011 and 2015, centered on allegations of infringement by third-party server implementations. In 2011, filed suit against Wowza Media Systems in the U.S. District Court for the Northern District of , claiming that Wowza's infringed Adobe's patents related to RTMP and enhanced RTMP (RTMPe) features, including unauthorized use in versions supporting the protocol's and streaming capabilities. The case involved multiple amendments and motions, with Adobe asserting infringement in Wowza's commercial products that competed with Adobe's Flash . No major suits directly targeted open-source projects during 2009-2012, though community discussions in forums like the Gnash development highlighted concerns over potential patent risks for RTMP implementations in . The disputes concluded with settlements that facilitated wider adoption of RTMP. In March 2015, Adobe and Wowza reached an agreement dismissing all claims, allowing Wowza to continue offering RTMP-compatible servers under licensed terms without further legal challenges. These outcomes included license grants outlined in Adobe's 2012 RTMP specification release, which provided permissions for compliant implementations, promoting while protecting Adobe's . Such resolutions encouraged broad industry use, particularly in streaming services, without protracted court battles. By 2025, RTMP-related patents are largely non-enforced due to expirations and the protocol's diminished prominence following Adobe Flash's end-of-life in 2020. With core patents like 7,246,356 no longer active, free implementation of RTMP has become standard, though communities have shifted toward patent-free alternatives such as (SRT). SRT, an open-source protocol developed by Haivision, emerged as a low-latency successor, avoiding proprietary encumbrances and enabling robust streaming over unreliable networks. No significant RTMP patent litigation has been reported since 2015, reflecting the protocol's transition to legacy status in modern video workflows.

References

Add your contribution
Related Hubs
User Avatar
No comments yet.