RTMP协议是一个互联网TCP/IP五层体系结构中应用层的协议。RTMP协议中基本的数据单元称为消息(Message)。当RTMP协议在互联网中传输数据的时候,消息会被拆分成更小的单元,称为消息块(Chunk)。

1 消息

消息是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。消息的报文结构如下图所示。

2 消息块
在网络上传输数据时,消息需要被拆分成较小的数据块,才适合在相应的网络环境上传输。RTMP协议中规定,消息在网络上传输时被拆分成消息块(Chunk)。消息块首部(Chunk Header)有三部分组成:用于标识本块的Chunk Basic Header,用于标识本块负载所属消息的Chunk Message Header,以及当时间戳溢出时才出现的Extended Timestamp。消息块的报文结构如下图所示。

3 消息分块

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

RTMP传输媒体数据的过程中,发送端首先把媒体数据封装成消息,然后把消息分割成消息块,最后将分割后的消息块通过TCP协议发送出去。接收端在通过TCP协议收到数据后,首先把消息块重新组合成消息,然后通过对消息进行解封装处理就可以恢复出媒体数据。

2.1 Chunk Basic Header [1-3字节]
HeaderType+ChannelID组成,其中ChannelID的大小决定了整个Chunk Basic Header的大小
2.1.1

这个字段编码了消息块流的

ID

和消息块的类型,消息块类型决定了消息包头的编码格式,长度完全

取决于可变长的消息块流

HeaderType(fmt):决定了Chunk Message Header的编码方式和大小,在第一个字节的高两位
Bits  Chunk Message Header Length
00   12 bytes
01   8 bytes
10   4 bytes
11   1 byte
2.1.2 ChannelID:
ChannelID 用途
02              Ping 和ByteRead通道
03              Invoke通道 我们的connect() publish()和自字写的NetConnection.Call() 数据都是在这个通道的
04              Audio和Vidio通道
05 06 07     服务器保留,经观察FMS2用这些Channel也用来发送音频或视频数据
2.2  Chunk Message Header
以最大fmt =00 length( Chunk Message Header ) == 12  为例
Chunk Message Header的结构是:timestamp,message_length,message_type,msg_stream_id
其中 message_type是一个枚举变量:
type为1,2,3,5,6的时候是协议控制消息
type为4的时候表示 User Control Messages [Event_type + Event_Data] Event_type有Stream Begin ,Stream End...
type为8,音频数据
type为9,视频数据
type为18 元数据消息[AMF0]
type为20 命令消息 Command Message(RPC Message)
These messages are sent to perform some operations like connect, createStream, publish, play, pause on the peer.

命令消息主要分成两种NetConnection和NetStream。
connect,call,close,createStream命令可以在NetConnection中发送。
coonect(name,TranscationID,Command Object pair)

play,publish,seek,pause等命令可以在NetStream中发送。

2.3 Ext Time Stamp
2.4数据
3  RTMP流媒体播放过程
RTMP协议规定,播放一个流媒体有两个前提步骤:第一步,建立一个网络连接(NetConnection);第二步,建立一个网络流(NetStream)。其中,网络连接代表服务器端应用程序和客户端之间基础的连通关系。网络流代表了发送多媒体数据的通道。服务器和客户端之间只能建立一个网络连接,但是基于该连接可以创建很多网络流。

播放一个RTMP协议的流媒体需要经过以下几个步骤:握手,建立连接,建立流,播放。RTMP连接都是以握手作为开始的。建立连接阶段用于建立客户端与服务器之间的“网络连接”;建立流阶段用于建立客户端与服务器之间的“网络流”;播放阶段用于传输视音频数据。
参考:http://blog.csdn.net/leixiaohua1020/article/category/1362941
RTMP协议中文版
http://wenku.baidu.com/link?url=Lc4gR-FLeCkHCMM1NL-FcAUtKFTRaFn0tcdoqcid6Dtvu_Q2wlSQ-GMY711Ptc_TdeG2KU0E9e-aHddFVZJSMwt2CujY2p7AdHg8Vr15HuG
RTMP协议英文版http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/rtmp/pdf/rtmp_specification_1.0.pdf
开源项目 RTMP Dump
http://rtmpdump.mplayerhq.hu/

RTMP 协议学习总结相关推荐

  1. RTMP协议学习笔记

    2019独角兽企业重金招聘Python工程师标准>>> RTMP协议学习总结 转载于:https://my.oschina.net/u/2374678/blog/746464

  2. 视频播放压缩的相关知识点:I帧、P帧、B帧、RTMP协议、RTSP协议、GB28181协议等学习记录

    I帧.P帧.B帧.RTMP协议.RTSP协议.GB28181协议等学习记录 引言 1. I帧.P帧.B帧 1.1 P帧 1.2 B帧 1.3 I帧 2.ONVIF协议与GB28181协议,RTMP与R ...

  3. RTMP推流及协议学习

    前期准备 了解RTMP定义 准备RTMPDump中的librtmp 使用openssl中的libssllibcrypto 推流工作 整体框架图 使用libtrmp提供的API 将streaming封装 ...

  4. (转)RTMP协议从入门到放弃

    转载自:  http://blog.csdn.net/shangmingyang/article/details/50837852 RTMP协议是Real Time Message Protocol( ...

  5. RTMP协议从入门到放弃

    RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing) ...

  6. 网络协议学习笔记 · 22

    IPv6 · 流媒体 · 即时通讯 · 缓存 · 网络爬虫 VPN 作用 VPN与代理的区别 实现原理(隧道协议) 网络爬虫 简易实例 robots.txt 无线网络 缓存(Cache) 响应头 请求 ...

  7. 流媒体-RTMP协议-rtmpdump-flv封装解析(一)

    流媒体-RTMP协议-rtmpdump-flv封装解析(一) 流媒体-RTMP协议-librtmp库学习(二) 流媒体-RTMP协议-librtmp库学习-c++多线程实现rtmp推流flv文件(三) ...

  8. rtmplib rtmp协议过程分析

    转自:http://chenzhenianqing.cn/articles/1009.html 写的很好,收藏如下,向作者致敬! 没事碰到了librtmp库,这个库是ffmpeg的依赖库,用来接收,发 ...

  9. 直播技术——Rtmp协议

    转载自:https://blog.csdn.net/qq_34447388/article/details/78995606 RTMP协议是Real Time Message Protocol(实时信 ...

  10. 音视频 RTMP协议分析

    理解字节序 大小端模式 理解字节序 Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端:Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的 ...

最新文章

  1. js进阶 10-8 伪类选择器有哪几类(自己不用,永远不是自己的)
  2. 远程桌面连接由于网络错误而丢失
  3. json知识中的数据契约
  4. Opengl-阴影(分为定向光的和点光源的)
  5. 如何给APK文件签名
  6. Java transient关键字(序列化避免被反序列化获取敏感信息)
  7. 万物联网IoE与物联网IOT有何差别?
  8. 创业宝典:未来企业家之路(第5版)
  9. 机架式服务器可以安装win7系统,Win7 32位系统怎么安装电音
  10. eclipse下载以及下载web插件速度慢的解决方法
  11. 如何进行EMC Symmetrix (DMX或者VMAX)的系统健康检查
  12. haproxy配置timeout
  13. html5迷宫小游戏,JS实现的走迷宫小游戏完整实例
  14. python day8
  15. CentOS7.9安装Nextcloud+ocDownloader+aria2使用Nextcloud网盘做离线下载服务器
  16. matlab函数anova,MATLAB进行单因素方差分析——ANOVA
  17. allegro如何删除没有网络的走线,查还没有连的网络线
  18. vue出生日期转年龄
  19. 最简单的http文件服务器
  20. 【三维目标检测】Second 模型 (一)

热门文章

  1. Buffer Pool--锁定内存页
  2. Mysql之左连接右连接内连接——示例
  3. python实现卷积神经网络_【455】Python 徒手实现 卷积神经网络 CNN
  4. (原創) 如何Real Time產生灰階影像? (SOC) (DE2-70) (TRDB-D5M)
  5. Tomcat6升级到Tomcat9
  6. sqlite3 命令行操作
  7. 将log4j重定向到指定函数
  8. JavaScript技巧写法
  9. no SSL-C headers found
  10. Hibernate HQL基础