再然后flash就想着在浏览器里面实现视频会议的功能,所以2002年就开发了FMS(Flash Media Server),然后被Adobe收购后才改为AMS(Adobe Media Server),AMS需要被Flash所调用,所以就有了RTMP+AMF,我们看下flash是如何发布本地摄像头和声音的代码你就明白RTMP协议之根本:
nc = new NetConnection();
nc.connect("rtmp://localhost/aaaa");
nsOut = new NetStream(nc);
nsOut.attachVideo(Camera.get());
nsOut.attachAudio(Microphone.get());
nsOut.publish("1", "live");
从Adobe的Fideo File Format Specification中可以看到,flv很大程度上就是前置了rtmp,
Starting with SWF files published for Flash Player 6, Flash Player can exchange audio, video, and data over RTMP connections with the Adobe Flash Media ServerTM. One way to feed data to Flash Media Server (and thus on to Flash Player clients) is from files in the FLV file format. Starting with SWF files published for Flash Player 7, Flash Player can also play FLV files directly with MIME type video/x-flv.
很多同学,包括网上大量文章,在非农rtmp的时候都是直接拿起wireshark和spec一顿操作,我倒是有个建议不妨站远点去理解rtmp,会有一个非常不同的视角。
其中最主要的几个概念:
最早flash只是一个带交互的video clip,然后通过as扩展了交互性,也不仅局限在browser local的限制,于是有了AMF0和AMF3,其实对标的就是Web Service/SOAP以及RMI,通过这个去访问外部或者后台数据。
再然后flash就想着在浏览器里面实现视频会议的功能,所以2002年就开发了FMS(Flash Media Server),然后被Adobe收购后才改为AMS(Adobe Media Server),AMS需要被Flash所调用,所以就有了RTMP+AMF,我们看下flash是如何发布本地摄像头和声音的代码你就明白RTMP协议之根本:
推流的API非常直白,和RTMP的协议纹丝合缝,所以这里就有了几个概念:
最早逆向破解RTMP是为了跳开flash来实现流媒体服务,而后再是有了srs, red5, nginx-rtmp实现了rtmp server取代AMS。
我们再来看看RTMP和FLV之间密不可分的关系,
从Adobe的Fideo File Format Specification中可以看到,flv很大程度上就是前置了rtmp,
回顾一下FLV的结构:
我开始就好奇为什么是8,9,18,而不是1, 2, 3,其实这里就和RTMP的Message Type对上了:
所以,
最后通过rtmpdump验证如下:
参考阅读