RTMP协议推流交互流程


想了解下直播常见协议RTMP,可是看着网文,头疼,这里记录下RTMP协议推流播放的交互流程,细节可以再看规范,感觉会舒服一些。

RTMP(Real Time Messaging Protocol 实时消息传输协议)
RTMP是由Adobe公司提出的,在互联网TCP/IP五层体系结构中应用层,RTMP协议是基于TCP协议的······ , 吧啦吧啦的就不看了,先只了解它是基于tcp且可以用来推流的一个应用层协议就行了。

RTMP协议推流流程

然后看看它的一个推流过程

在TCP三次握手后(补个图)

用RTMP协议的流媒体推流还需要经过以下几个步骤:

握手(RTMP连接都是以握手作为开始)
建立连接 (建立客户端与服务器之间的“网络连接”)
建立流 (建立客户端与服务器之间的“网络流”)
推流&播放

RTMP握手

首先服务端与客户端需要通过3次交换报文完成握手,RTMP是由三个静态大小的块,而不是可变大小的块组成的,客户端与服务器发送相同的三个chunk,客户端发送c0,c1,c2,服务端发送s0,s1,s2。

●客户端发送 C0,C1 块,握手开始。
●客户端在发送 C2 之前客户端必须等待接收 S1 。
●客户端在发送任何数据之前客户端必须等待接收 S2。
●服务端在发送 S0 和 S1 之前必须等待接收 C0,也可以等待接收 C1。
●服务端在发送 S2 之前必须等待接收 C1。
●服务端在发送任何数据之前必须等待接收 C2。

RTMP建立连接

●客户端发送命令消息中的“连接”(connect)到服务器,请求与一个服务应用实例建立连接。
●服务器接收到连接命令消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到客户端,同时连接到连接命令中提到的应用程序。
●服务器发送设置带宽协议(Set Peer Bandwidth)消息到客户端。
●客户端处理设置带宽协议消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到服务器端。
●服务器发送用户控制消息中的“流开始”(Stream Begin)消息到客户端。
●服务器发送命令消息中的“结果”(_result),通知客户端连接的状态。

RTMP建流&Play

●客户端在收到来自服务器的建流命令(createstream)的成功结果(_result)后发送(play)命令。
●服务器在接收到play命令后,发送一个来设置块大小(SetChunkSize)消息。
●服务器发送另一个用户控制消息,指定事件“流记录”(StreamIsRecorded)和流ID。这个消息的头2字节携带事件类型,最后4字节携带流ID。
●服务器发送另一个用户控制消息,指定事件“流开始”(StreamBegin)。向客户端指示流的开始。
●如果客户端发送的播放(play)命令成功,服务器发送命令消息(onStatus),NeStream.Play.Start & NeStream.Play.Reset。
只有当客户端发送的play命令设置了reset标志时,服务器才会发送NeStream.Play.Reset。
●如果没有找到要播放的流,服务器将发送onStatus消息NeStream.Play.StreamNotFound。
●之后,客户端播放服务器发送的音频和视频数据

Wireshark抓个RTMP流

湖南卫视的RTMP流
ffplay rtmp://58.200.131.2:1935/livetv/hunantv

抛开握手不看流程如下:

Client :

connect('livetv')

Server :

Window Acknowledgement Size 5000000
Set Peer Bandwidth 5000000,Dynamic
Set Chunk Size 4096
_result('NetConnection.Connect.Success')

Client :

Window Acknowledgement Size 5000000
createStream()

Server :

_result()

Client :

getStreamLength()
play('hunantv')
Set Buffer Length 1,3000ms

Server :

Stream Begin 1
onStatus('NetStream.Play.Start')
RtmpSampleAccess()
onMetaData()

Server :

Video Data
Audio Data
...

其他关于协议细节再看看协议规范 rtmp_specification_1.0.pdf

参考 :rtmp_specification_1.0.pdf

最新文章

  1. ThinkPhp 3.2 自动验证
  2. JAVA语言搭建白盒静态代码、黑盒网站插件式自动化安全审计平台
  3. NOIP2016普及
  4. linq 多表分组查询统计
  5. SIEBEL应用概述
  6. Node.js的模块载入方式与机制
  7. struts2 拦截器的注册在strut.xml中
  8. ORACLE的表被 另一个用户锁定,如何解除..
  9. 获取屏幕分辨率(C#)
  10. Java笔记——equals和==的区别
  11. Fragment的使用简单介绍【Android】
  12. Solr自动生成ID
  13. 网页 HTML
  14. Spring Cloud官方文档中文版-Spring Cloud Config(上)
  15. 【原创】Linux基础之用户和组
  16. mongodb安装失败与解决方法(附安装教程)
  17. msvc命令行cl编译c程序问题及解决
  18. webrtc 源码结构
  19. js五星好评
  20. asterisk各种报错

热门文章

  1. P4327 彼得潘框架
  2. play framework在eclipse中自动的预编译生成precompiled文件
  3. μC/OS-II中使用软件定时器
  4. 每天学点linux命令
  5. Elasticsearch-URL查询实例解析
  6. The Pomodoro Technique
  7. HttpClient系统日志配置
  8. Mac下通过FFMpeg实现Android手机推流和播放
  9. $random 函数用法
  10. 吴裕雄--天生自然HTML学习笔记:HTML 列表