RTMP specification

Does anyone know how or where to find a specification of the RTMP protocol?

I’m attempting to implement an RTMP server. I’m mostly interested in having clients able to connect and publish streams.

Currently using this document: Adobe RTMP Specification · RTMP for the RTMP spec, but it seems incomplete?

I’m using a Gstreamer pipeline like this this as my test client:

gst-launch-1.0 videotestsrc is-live=true \
  ! x264enc ! h264parse  \
  ! flvmux ! rtmpsink location='rtmp://localhost:1935/live/test.stream'

Testing with both rtmpsink and rtmp2sink. rtmpsink sends commands that are not mentioned in the linked spec (e.g. releaseStream and FCPublish) and rtmp2sink seems to expect items in the _result response to the initial connect command that are not detailed in the linked spec (they’re referred to but not really detailed).

Anyone know where to find all the details written down? (Google is failing me…) Or is it a case of reverse engineering it from open-source code and wireshark?

This web site since to host a valid version, derived from the original PDF which links on Adobe’s site seems dead.

https://rtmp.veriskope.com/docs/spec/

1 Like

Thanks, yeah the issue I’m struggling with is that it doesn’t seem entirely complete, e.g. required properties and information needed in the the _result response to the first connect message is not given. I’m coming to the conclusion that studying other implementations is going to be the way to go :person_shrugging:

That’s because this is an implementation, RTMP is an IPC protocol, so what you do with it is media server specific.

Ah ok, I see thanks, so RTMP is deliberately generic, you are free to send what you like as long as the client and server agree.

I guess what I’m looking for now is the spec for that higher-level implementation that rtmpsink and rtmp2sink (and all interoperable media servers) are using? Searching for ActionScript and Flash Media Server documentation has some helpful info, but maybe the full details were always proprietary and not written down in any Adobe documentation…