·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]RTMP协议的分析与研究(3)

时间:2012-03-15 09:26CuPlayer.com
3.4 客户端和服务器的连接过程 3.4.1客户和服务器的握手 Flash Player 以系统时间作为种子通过某种算法生成的数字签名,大小是 1537 字节向服务器发起第一次握手,服务器根据客户端的数字签名产生一个 3073 字节的

  3.4 客户端和服务器的连接过程
  3.4.1客户和服务器的握手

  Flash Player 以系统时间作为种子通过某种算法生成的数字签名,大小是 1537 字节向服务器发起第一次握手,服务器根据客户端的数字签名产生一个 3073 字节的验证包,给客户端,客户端在接受到服务器的回应以后会发送一个 1536 字节的回复。

具体的流程:

  发送第一次握手包 handshark1
  接收第二次握手包 handshark2
  发送的三次握手包 handshark3
  第一个握手包 handshark1 和服务器的回复握手包 handshark2 都是以 0X03 开头。这三次握手不是 RTMP 协议本身的内容,所以在这并没有包含 RTMP 的协议头。是服务器的厂家自己产品做验证用的,严格的说就是你必须用 Adobe 的客户端和服务器才能使用我的协议。

3.4.2客户和服务器通信
具体连接和请求视频的过程

发送 rtmp_connect 命令
. 发送本地带宽消息 . 默认是 125000
服务器返回服务器带宽信息
服务器返回本地带宽信息
服务器返回连接成功消息 "NetConnection.Connect.Success"
客户端发送创建流请求 encodeCreateStreamPacket
服务器返回创建流成功消息
客户端发送播放文件消息 Rtmp_Play
服务器返回 TYPE_CHUNK_SIZE 消息
服务器返回开始播放消息 "NetStream.Play.Start"
服务器返回视频信息 (TYPE_STREAM_METADATA) ,包括大小,宽高,速率等等信息--文件长度可以在这里推算出来
RTMP 的净核决定了内容服务, adobe 的服务器采用的 AMF 格式的字串命令来控制视频的传输和播放,具体的字串命令信息如下:(注:字串的定义有厂家( adobe )自己定义,只要满足 AMF 的格式就可以)

NetConnection.Call.Failed
NetConnection.Call.BadVersion
NetConnection.Connect.AppShutdown
NetConnection.Connect.Closed
NetConnection.Connect.Rejected
NetConnection.Connect.Success
NetStream.Clear.Success
NetStream.Clear.Failed
NetStream.Publish.Start
NetStream.Publish.BadName
NetStream.Failed
NetStream.Unpublish.Success
NetStream.Record.Start
NetStream.Record.NoAccess
NetStream.Record.Stop
NetStream.Record.Failed
NetStream.Play.InsufficientBW
NetStream.Play.Start
NetStream.Play.StreamNotFound
NetStream.Play.Stop
NetStream.Play.Failed
NetStream.Play.Reset
NetStream.Play.PublishNotify
NetStream.Play.UnpublishNotify
NetStream.Data.Start
Application.Script.Error
Application.Script.Warning
Application.Resource.LowMemory
Application.Shutdown
Application.GC
Play
Pause
demoService.getListOfAvailableFLVs
getStreamLength
connect
app
flashVer
swfUrl
tcUrl
fpad
capabilities
audioCodecs
audioCodecs
videoCodecs
videoFunction
pageUrl
createStream
deleteStream
duration
framerate
audiocodecid
audiodatarate
videocodecid
videodatarate
height
width
3.4.2数据的萃取
在服务器返回开始播放消息 "NetStream.Play.Start" 之后,服务器就会开始给客户端传输数据了,一般数据的萃取都是先解析协议的头,然后根据协议头中数据类型和净核长度就可以把数据部分取出, RTMP 协议也是这样。

struct RTMP_HEAD
{
char cChannelid : 6;// 第一个字节的后 6 位
char cCheadsize ; // 第一个字节的头两位
char cTimer[3]; // 三个字节表示的时间信息
char cLength[3]; // 三个字节表示的长度
char cDatatype; // 数据类型
char sStreamid[4]; // 流标识
}

首先判断 cDatatype 是那种类型,然后根据不同的类型进行萃取数据部分,进行不同的处理,获取视频的数据的方式先看是否是一下的类型:

0×08 Audio Data packet containing audio
0×09 Video Data packet containing video data

根据净核的长度读取出内存中的音视频数据,这里的音视频数据是有一定编码格式的数据,这个取决于应用的具体配置, Flash play 使用的是 FLV 的格式。要对这部分数据进行存取,还有做一部分工作,对 FLV 的视频数据进行去壳,取出数据保存文件就可以了。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chenyanxu/archive/2009/09/02/4511087.aspx

相关链接:

[AS3]AS3.0与Red5之间的参数传递(rtmp流媒体)
[AS3]RTMP播放器运用实例
[AS3]RTMP流媒体协议在视频系统中应用的优势
[AS3]RTMP协议的分析与研究
[AS3]as3服务端FMS常用方法属性参考 
[AS3]FMS播放器连接fms的几种返回状态
RTMP协议与RTMP视频播放器的应用
flex播放器代码支持rtmp协议
关于RTMP,RTMPT,RTMPS,RTMPE,RTMPTE,RTMFP,AMF协议的介绍
[AS3]rtmp协议MP4(f4v)格式视频VOD点播实现过程
[AS3]极酷阳光V2版RTMP流媒体播放器实例演示与介绍

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器