rtmp协议详解

来源:互联网 发布:如何设置网络打印机 编辑:程序博客网 时间:2024/05/21 10:51

rtmp协议详解

(2011-07-05 18:10:31)
rtmp协议详解转载
 分类: 音视频

Real Time Messaging Protocol(实时消息传送协议协议)是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的私有协议。

具体使用RTMP的AS代码大概如下:

  var videoInstance:Video = your_video_instance;

  var nc:NetConnection = new NetConnection();

  var connected:Boolean = nc.connect("rtmp://localhost/myapp");

  var ns:NetStream = new NetStream(nc);

  videoInstance.attachVideo(ns);

ns.play("flvName");

Adobe也在官方网站已经提供了RTMP协议的官方文档说明,为什么要写这个系列文章最大的原因只是对前一段工作的一个总结和回顾,最近两个月,实现了一个RTMP Server的c++版本,把公司的流媒体服务和flash无缝对接起来。希望我的文字能给后来研究这个协议的同学有一定的帮助。

RTMP协议是一个基于TCP的高层协议族,当然这个玩意据说还有UDP协议版本的,不过现在还没有出来,好像Adobe下一版本的FMS会提供支持。下文将要描述的是TCP协议版本的协议。

   RTMP协议的概要理解:

RTMP协议是为了和flash之间交换信令以及媒体数据。为了提高使用效率信令和媒体数据都是使用相同的机制。因为是相同的机制Adobe就整出来了一些比较搞人的概念,当然每个协议第一次接触都是比较难理解的。

   在RTMP协议中信令和媒体数据都称之为Message,在网络中传输这些Message,为了区分它们肯定是要加一个Message  head的,所以RTMP协议也有一个Message head,还有一个问题因为RTMP协议是基于TCP的,由于TCP的包长度是有限制的(一般来说不超过1500个字节),而RTMP的Message长 度是有可能很大的,像一个视频帧的包可能会有几十甚至几千K,这个问题就必然有一个分片的问题,在RTMP协议中对应的说法就是chunk,每一个 Message + head都是由一个和多个chunk组成的。到这里对RTMP协议的概要理解就算完了。

 

 

 
RTMP协议封包
RTMP协议封包 由一个包头和一个包体组成,包头可以是4种长度的任意一种:12, 8, 4,  1 byte(s).完整的RTMP包头应该是12bytes,包含了时间戳,AMFSize,AMFType,StreamID信息, 8字节的包头只纪录了时间戳,AMFSize,AMFType,其他字节的包头纪录信息依次类推 。包体最大长度默认为128字节,通过chunkSize可改变包体最大长度,通常当一段AFM数据超过128字节后,超过128的部分就放到了其他的RTMP封包中,包头为一个字节.
完整的12字节RTMP包头每个字节的含义:
用途大小(Byte)含义Head_Type1包头TIMER3时间戳AMFSize3数据大小AMFType1数据类型StreamID4流ID

一、Head_Type
第一个字节Head_Type的前两个Bit决定了包头的长度.它可以用掩码0xC0进行"与"计算:
Head_Type的前两个Bit和长度对应关系:
BitsHeader Length0012 bytes018 bytes104 bytes111 byte

Head_Type的后面6个Bit和StreamID决定了ChannelID。  StreamID和ChannelID对应关系:StreamID=(ChannelID-4)/5+1 参考red5
ChannelIDUse02Ping 和ByteRead通道03Invoke通道 我们的connect() publish()和自字写的NetConnection.Call() 数据都是在这个通道的04Audio和Vidio通道05 06 07服务器保留,经观察FMS2用这些Channel也用来发送音频或视频数据

例如在rtmp包里面经常看到的0xC2, 就表示一字节的包头,channel=2.

二、TiMMER

TiMMER占3个字节纪录的是时间戳,音视频流的时间戳是统一排的。可分为绝对时间戳和相对时间戳。
fms对于同一个流,发布的时间戳接受的时间戳是有区别的
publish时间戳,采用相对时间戳,时间戳值等于当前媒体包的绝对时间戳与上个媒体包的绝对时间戳之间的差距,也就是说音视频时间戳在一个时间轴上面.单位毫秒。
play时间戳,相对时间戳,时间戳值等于当前媒体包的绝对时间戳与上个同类型媒体包的绝对时间戳之间的差距, 也就是说音视频时间戳分别为单独的时间轴,单位毫秒。
flv格式文件时间戳,绝对时间戳,时间戳长度3个字节。超过0xFFFFFF后时间戳值等于TimeStamp & 0xFFFFFF。
flv格式文件影片总时间长度保存在onMetaData的duration属性里面,长度为8个字节,是一个翻转的double类型。


三、AMFSize
AMFSize占三个字节,这个长度是AMF长度,可超过RTMP包的最大长度128字节。如果超过了128字节,那么由多个后续RTMP封包组合,每个后续RTMP封包的头只占一个字节。一般就是以0xC?开头。

四、AMFType
AMFSize占三个字节,这个长度是AMF长度,可超过RTMP包的最大长度128字节。
AMFType是包的类型

0×01Chunk Sizechanges the chunk size for packets0×02Unknown 0×03Bytes Readsend every x bytes read by both sides0×04Pingping is a stream control message, has subtypes0×05Server BWthe servers downstream bw0×06Client BWthe clients upstream bw0×07Unknown 0×08Audio Datapacket containing audio0×09Video Datapacket containing video data0x0A-0x0EUnknown 0x0FFLEX_STREAM_SENDTYPE_FLEX_STREAM_SEND0x10FLEX_SHARED_OBJECTTYPE_FLEX_SHARED_OBJECT0x11FLEX_MESSAGE TYPE_FLEX_MESSAGE 0×12Notifyan invoke which does not expect a reply0×13Shared Objecthas subtypes0×14Invokelike remoting call, used for stream actions too.0×16StreamData这是FMS3出来后新增的数据类型,这种类型数据中包含AudioData和VideoData


五、StreamID
StreamID是音视频流的ID,如果AMFType!=0x08 或!=0x09那么 StreamID为0。
ChannelID 和StreamID之间的计算公式:StreamID=(ChannelID-4)/5+1 参考red5
例如当ChannelID为2、3、4时StreamID都为1 当ChannelID为9的时候StreamID为2

六、封包分析
例如有一个RTMP封包的数据

03 00 00 00 00 01 30 14 00 00 00 00 02 00 07 63 6F 6E 6E 65 63 74 00 3F F0 00 00 00 00 00 00 03 00 03 61 70 70 02 00 08 72 6F 6F 6D 2F 30 30 31 00 08 66 6C 61 73 68 56 65 72 02 00 0E 57 49 4E 20 31 30 2C 30 2C 31 32 2C 33 36 00 06 73 77 66 55 72 6C 06 00 05 74 63 55 72 6C 02 00 1C 72 74 6D 70 3A 2F 2F 31 39 32 2E 31 36 38 2E 31 2E 31 38 2F 72 6F 6F 6D 2F 30 30 31 00 04 66 70 61 64 01 00 00 0C 63 61 70 61 62 69 6C 69 C3 74 69 65 73 00 40 2E 00 00 00 00 00 00 00 0B 61 75 64 69 6F 43 6F 64 65 63 73 00 40 A8 EE 00 00 00 00 00 00 0B 76 69 64 65 6F 43 6F 64 65 63 73 00 40 6F 80 00 00 00 00 00 00 0D 76 69 64 65 6F 46 75 6E 63 74 69 6F 6E 00 3F F0 00 00 00 00 00 00 00 07 70 61 67 65 55 72 6C 06 00 0E 6F 62 6A 65 63 74 45 6E 63 6F 64 69 6E 67 00 40 08 00 00 00 00 00 00 00 00 09 02 00 0F 30 38 31 32 31 31 C3 30 39 32 30 32 32 32 32 32 02 00 02 33 34 02 00 0D 31 39 35 2E 31 36 38 2E 31 34 2E 32 32 02 00 03 30 30 31 02 00 01 30 02 00 01 38 02 00 01 30

 

数据依次解析的含义
03表示12字节头,channelid=3
000000表示时间戳 Timer=0
000102表示AMFSize=18
14表示AMFType=Invoke 方法调用
 00 00 00 00 表示StreamID = 0
//到此,12字节RTMP头结束
02表示String
0007表示String长度7
63 6F 6E 6E 65 63 74 是String的Ascall值"connect"
00表示Double
3F F0 00 00 00 00 00 00 表示double的0.0
03表示Map数据开始


Real Time Messaging Protocol(实时消息传送协议协议)Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的私有协议。

具体使用RTMPAS代码大概如下:

  var videoInstance:Video = your_video_instance;

  var nc:NetConnection = new NetConnection();

  var connected:Boolean = nc.connect("rtmp://localhost/myapp");

  var ns:NetStream = new NetStream(nc);

  videoInstance.attachVideo(ns);

ns.play("flvName");

Adobe也在官方网站已经提供了RTMP协议的官方文档说明,为什么要写这个系列文章最大的原因只是对前一段工作的一个总结和回顾,最近两个月,实现了一个RTMP Serverc++版本,把公司的流媒体服务和flash无缝对接起来。希望我的文字能给后来研究这个协议的同学有一定的帮助。

RTMP协议是一个基于TCP的高层协议族,当然这个玩意据说还有UDP协议版本的,不过现在还没有出来,好像Adobe下一版本的FMS会提供支持。下文将要描述的是TCP协议版本的协议。

   RTMP协议的概要理解:

RTMP协议是为了和flash之间交换信令以及媒体数据。为了提高使用效率信令和媒体数据都是使用相同的机制。因为是相同的机制Adobe就整出来了一些比较搞人的概念,当然每个协议第一次接触都是比较难理解的。

        RTMP协议中信令和媒体数据都称之为Message,在网络中传输这些Message,为了区分它们肯定是要加一个Message  head的,所以RTMP协议也有一个Message head,还有一个问题因为RTMP协议是基于TCP的,由于TCP的包长度是有限制的(一般来说不超过1500个字节),而RTMPMessage长度是有可能很大的,像一个视频帧的包可能会有几十甚至几千K,这个问题就必然有一个分片的问题,在RTMP协议中对应的说法就是chunk,每一个Message + head都是由一个和多个chunk组成的。到这里对RTMP协议的概要理解就算完了。



用Wowza Media Server转播视频

rtmp协议详解 (2011-08-11 12:40:10)
rtmp协议详解转载
标签:

杂谈

分类: 音视频

用Wowza Media Server转播视频

http://sunky045.iteye.com/blog/538295

  • 博客分类:
  • 视频服务器
FlashAdobeLinuxXMLWindows
  用Wowza转播视频主要有两种,一种为转播服务器上已经存在的视频进行视频点播,一种为接收视频流进行实时直播。
支持格式: Flash media content (.flv), H.264/ACC media content (.f4v, .mp4, .m4a, .mov, .mp4v, .3gp, .3g2), MP3 content (.mp3)

实时直播

进行实时直播需要接收视频流,此处用Adobe Flash Media Encoder + 摄像头模拟视频流.

1. 安装Adobe Flash Media Encoder (可在其官网下载,需简单的进行注册http://www.adobe.com/products/flashmediaserver/flashmediaencoder/)

2. 在Wowza Media Server 安装目录(以下用[install-dir]简称,Windows为C:\Program Files\Wowza Media Systems\Wowza Media Server Pro;Linux 为/usr/local/WowzaMediaServerPro)的applications下创建文件夹live

3. 创建文件夹[install-dir]/conf/live

4. 复制文件[install-dir]/conf/Application.xml到[install-dir]/conf/live

5. 编辑[install-dir]/conf/live文件夹下刚刚复制的Application.xml,将Streams/StreamType设置为 live,如果要录制此视频流可设为live-record,默认保存在[install-dir]/content/文件夹下

6. 启动Wowza Media Server(如何启动见:http://sunky045.iteye.com/blog/538288)

7. 用Adobe Flash Media Encoder进行视频编码模拟视频流,具体设置见下图

(转)用Wowza <wbr><wbr>Media <wbr><wbr>Server转播视频

注:
  • 勾选video后,在Device选项中选择摄像头(USB Video Device),图象才能出现
  • FMS URL为Wowza Media Server服务器IP,live为[install-dir]/applications/下文件夹的名字
  • Stream:用于客户端定位,录制视频流时默认的格式为.flv,若要保存为mp4格式需要加前缀 mp4: ;如不需要保存直接为live即可
  • 其它设置可自行调整,例如若有音频可勾选Audio选项
  • 设置完成后点Connect,再点Start开始编码,出现上图界面

8. 打开[install-dir]/examples/LiveVideoStreaming/client/live.html或live.swf进行视频直播

(转)用Wowza <wbr><wbr>Media <wbr><wbr>Server转播视频 

注:
  • Server 与步骤7中的FMS URL一致
  • Stream为步骤7中的Stream

视频点播

  进行视频点播相对来说就简单多了,只需在[install-dir]/applications/下新建一个文件夹(如[install-dir] /applications/testVideo),然后将要点播的视频(如Extremists.m4v)复制到[install-dir] /content下然后就可以进行播放了,如下图:

(转)用Wowza <wbr><wbr>Media <wbr><wbr>Server转播视频 

注:
  • Server 为 rtmp://[server-ip-address]/testVideo 其中testVideo为[install-dir]/applications/下新建文件夹的名字
  • Server为视频的名字,如果为mp4需加上前缀mp4: