Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7893825
  • 博文数量: 701
  • 博客积分: 2150
  • 博客等级: 上尉
  • 技术积分: 13233
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-29 16:28
个人简介

天行健,君子以自强不息!

文章分类

全部博文(701)

文章存档

2019年(2)

2018年(12)

2017年(76)

2016年(120)

2015年(178)

2014年(129)

2013年(123)

2012年(61)

分类: 云计算

2017-08-28 21:47:23

一、RTMP是什么

RTMP是由Adobe开发的基于TCP的应用层协议,
应用于音/视频流数据在Flash PlayerMedia Server 之间的传输。

 

二、RTMP能做什么

直播 : RTMP+FLVH.264 & AAC

点播 : RTMP+MP4H.264 & AAC

 

三、数据封装方式

RTMP协议中基本的数据单元称为消息(Message)。

当RTMP协议在互联网中传输数据的时候,消息会被拆分成更小的单元,称为消息块(Chunk)。

 

1 消息 (Message)

消息是RTMP协议中基本的数据单元。

不同种类的消息包含不同的Message Type ID,代表不同的功能。

RTMP协议中一共规定了十多种消息类型,分别发挥着不同的作用。

 

例如,

Message Type ID在1-7的消息用于协议控制,这些消息一般是RTMP协议自身管理要使用的消息,用户一般情况下无需操作其中的数据。

Message Type ID为8,9的消息分别用于传输音频和视频数据。

Message Type ID为15-20的消息用于发送AMF编码的命令,负责用户与服务器之间的交互,比如播放,暂停等等。

 

消息首部(Message Header)有四部分组成:

标志消息类型的Message Type ID,

标志消息长度的Payload Length,

标识时间戳的Timestamp,

标识消息所属媒体流的Stream ID。

 

消息的报文结构如图3所示。

2 消息块 (chunk)

在网络上传输数据时,消息需要被拆分成较小的数据块,才适合在相应的网络环境上传输。

RTMP协议中规定,消息在网络上传输时被拆分成消息块(Chunk)。

消息块首部(Chunk Header)有三部分组成:

用于标识本块的Chunk Basic Header,

用于标识本块负载所属消息的Chunk Message Header,

以及当时间戳溢出时才出现的Extended Timestamp。

 

消息块的报文结构如图4所示。

消息块

 

3 消息分块

在消息被分割成几个消息块的过程中,消息负载部分(Message Body)被分割成大小固定的数据块(默认是128字节,最后一个数据块可以小于该固定长度),并在其首部加上消息块首部(Chunk Header),就组成了相应的消息块。

 

消息分块过程如图5所示,

一个大小为307字节的消息被分割成128字节的消息块(除了最后一个)。

即两个128字节的消息块 和 一个51字节的消息块

RTMP分块

 

 

RTMP传输媒体数据的过程中,

发送端:

首先把媒体数据封装成消息(Message),

然后把消息分割成消息块(Chunk),

最后将分割后的消息块通过TCP协议发送出去。


接收端:

在通过TCP协议收到数据后,首先把消息块重新组合成消息

然后通过对消息进行解封装处理就可以恢复出媒体数据


媒体数据>消息>消息块-------------------------TCP-------------à消息块>消息>媒体数据

 

四、数据传输流程

主要分成四步:

Step1: 握手 , 即基于TCP三次握手;

一个RTMP连接以握手开始,双方分别发送大小固定的三个数据块

a)握手开始于客户端发送C0C1块。服务器收到C0C1后发送S0S1

b)当客户端收齐S0S1后,开始发送C2。当服务器收齐C0C1后,开始发送S2

c)当客户端和服务器分别收到S2C2后,握手完成。

Step2: 建立网络连接(NetConnection)

a)客户端发送命令消息中的连接”(connect)到服务器,请求与一个服务应用实例建立连接。

b)服务器接收到连接命令消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到客户端,同时连接到连接命令中提到的应用程序。

c)服务器发送设置带宽()协议消息到客户端。

d)客户端处理设置带宽协议消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到服务器端。

e)服务器发送用户控制消息中的流开始”(Stream Begin)消息到客户端。

f) 服务器发送命令消息中的结果”(_result),通知客户端连接的状态。

Step3: 建立网络流(NetStream)

a) 客户端发送命令消息中的创建流createStream)命令到服务器端。

b)服务器端接收到创建流命令后,发送命令消息中的结果”(_result),通知客户端流的状态。


Step4: 播放,即音视频数据传输

a)  客户端发送命令消息中的播放play)命令到服务器。

b)  接收到播放命令后,服务器发送设置块大小(ChunkSize)协议消息。

c)   服务器发送用户控制消息中的“streambegin”,告知客户端流ID

d)   播放命令成功的话,服务器发送命令消息中的响应状态” NetStream.Play.Start & NetStream.Play.reset,告知客户端播放命令执行成功。

e)   在此之后服务器发送客户端要播放的音频和视频数据。


阅读(1441) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~