写这篇文章的目的:AMF真的很奇葩,rtmp大概样子,rtmpdump库可实现 rtmps推流
一)理论
1)搞清楚rtmp(Real Time Messaging Protocol)是哪家公司发明的?
adobe公司。
2)rtmp协议是怎么宏观上怎么组织工作的?
client 1 + server + client 2,服务器提供基本的服务,例如连接,推流(client to server),拉流(server to client),record等服务,客户端呢,根据自己的需求去找服务器索要服务。如何想要特殊服务,那必须得多花钱,充个vip。
rtmp与rtsp的工作组织方式是一样的吗?留一个疑问。
3)rtmp是应用层协议,传输层都走的是tcp。那么在这个协议客户端怎么和服务器疯狂的互动交流的呢(控制信息)?
使用的是AMF(Action Message Format),它有着和xml和json的一样的使命,就是传递交流数据。AMF是一个把空间做到极限的一种东西。编码方式是 len key type len value全是二进制的,就这么任性。也是adobe公司开发的。
typedef enum
{ AMF_NUMBER = 0, AMF_BOOLEAN, AMF_STRING, AMF_OBJECT,
AMF_MOVIECLIP, /* reserved, not used */
AMF_NULL, AMF_UNDEFINED, AMF_REFERENCE, AMF_ECMA_ARRAY, AMF_OBJECT_END,
AMF_STRICT_ARRAY, AMF_DATE, AMF_LONG_STRING, AMF_UNSUPPORTED,
AMF_RECORDSET, /* reserved, not used */
AMF_XML_DOC, AMF_TYPED_OBJECT,
AMF_AVMPLUS, /* switch to AMF3 */
AMF_INVALID = 0xff
} AMFDataType;
4)client最开始是怎么搞上的?
a)tcp连接,sync ack sync ack三下握手就建立了tcp连接
b)rtmp应用程序握手 c0 c1 c2 (c client) , s0 s1 s2(server)
怎么握手的百度一下,rtmp有简单握手和复杂握手两种 https://segmentfault.com/a/1190000018582522?utm_source=tag-newest
c)然后就快搞上了,使用AMF,发信息"connect" 把其他附加信息带上 app=live flashVer=WIN 15,0,0,235 tcUrl rtmp://192.168.99.144/live等进行连接app
d)然后在拿AMF格式给服务器发送public命令,成功后,client就可以将流推上服务器了。
5)rtmp的分包传输,懒得看
一)实操
1)搭建一个本地的rtmp服务器
我之前是使用srsrtmp的开源项目源码,编译后,在ubuntu上搭建一个普通的rtmp服务器,然后使用srs的工具推一波流。
如果成功了,那么你已经开启的rtmp探索之路了。
2)熟悉sample就可以掌握各个库的使用。
3)拿wireshark抓包,看一下client和server之间的交流过程。
三)有个项目是推流到facebook,facebook全部使用的是rtmps,然后就使用rtmpdump来实现。
rtmp 是最基础的应用层协议,直接通过tcp进行通信。
rtmpt 是将rtmp协议,放到http协议里面。这样我想起了ip协议放到ip协议里面,形成隧道。
rtmps 是将rtmp协议,放到https协议里面,这样安全。
到这里就结束了,我使用rtmpdump库实现了rtmps facebook的推流。