2019独角兽企业重金招聘Python工程师标准>>>

1 握手

adobe修改了握手部分的协议,但是没有公开。根据rtmp specification 1.0里面的握手过程,flash player是播不了h264编码的视频。修正后的握手协议可以参照:http://blog.csdn.net/winlinvip/article/details/7714493

2 rtmp 包格式

rtmp 使用块(chunk)的概念来发送数据,默认的块大小是128(不包括头部数据大小),如果要发送的数据超过了设定的块大小,就要分为多块进行发送。rtmp chunk的总体格式如下所示,rtmp
chunk头部信息包括三部分:基本头,消息头,扩展时间戳。

+----------------+--------------------+-------------------------+----------------+

| Basic Header | Message Header | Extended Timestamp |  Chunk Data  |

+----------------+--------------------+-------------------------+----------------+

|                                                                                   |

|<------------------- Chunk Header ------------------------->|

2.1 rtmp chunk basic header

rtmp 块的基本头包手两个信息:块格式(chunk format) 和 块流ID(chuck stream id)

0  1 2  3   4  5  6  7

+-+-+-+-+-+-+-+-+

| fmt |   cs id           |

+-+-+-+-+-+-+-+-+

fmt: rtmp块头的格式,有4种类型

cs_id:

cs_id 块流ID 基本头的长度(字节)
>=2 cs_id 1
0 【第二字节的值】 + 64 2
1 【第三字节的值】*256+【第二字节的值】+64 3

2.2 rtmp message header

rtmp 消息头一般包括:时间戳(3Bytes),消息长度(3Bytes),消息类型(1Byte),消息流Id(4Bytes)。

但是并不总是会包含这些信息。但是可以根据块基本头的fmt,来判断消息头中包含了哪些信息(如表格所示)。

0                          1                            2                          3

0  1  2  3 4  5  6 7  8 9 0  1  2  3  4 5  6 7  8  9 0  1 2  3 4 5  6  7  8 9  0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|                   timestamp                                                   |   message length      |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|     message length (cont)                  |  message type id |  msg stream id         |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

|           message stream id (cont)                                    |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

fmt timestamp message length message type id msg stream id 消息头长度
0 Y Y Y Y 11
1 Y Y Y x 7
2 Y x x x 3
3 x x x x 0

注意:a.发包的原则是同一个块流ID,第一个包一般使用fmt0,然后再根据情况选择使用fmt1,fmt2,fmt3.

b.timestamp,只有当是fmt0时,才表示一个绝对时间戳,其它格式都是一个时间差值,即相对于上一个包的时间增量。

c.对于fmt1,fmt2,fmt3;缺失的信息,使用最近收到的的同一个块流id的fmt0格式的包。

d.所以有信息使用大端编码,除了消息流id是使用小端编码。

2.3 extended timestamp

扩展时间戳,4字节,当timestamp > 0xffffff,使用扩展时间戳,否则不使用

2.4 example

a. 发送alaw音频包,编码器的打包大小为320字节,时间间隔为40ms,假设块大小设定为1000,几个音频包的时间戳依次为1000、1040、1080、1120.....,则可能的发送格式如下所示:

rtmp packet format timestamp message length packet size
#1 fmt0 1000 320 320+1+11
#2 fmt2 40 x 320+1+3
#3 fmt3 x x 320+1
#4 fmt3 x x 320+1

注:上例我们也可以每个包都用fmt0来发送,这样的话,每个包都要指定准确的时间戳和长度。

b. 发送视频包,时间间隔为40ms,假设块大小设定为1000,几个视频包的时间戳依次为1000、1040.....,大小依次为2500,1600,....则可能的发送格式如下所示:

rtmp packet format timestamp message length packet size
#1 fmt0 1000 2500 1000+1+11
#2 fmt3 x x 1000+1
#3 fmt3 x x 500+1
#4 fmt0 1040 1500 1000+1+11
#5 fmt3 x x 600+1

注:上例中如果每帧的音频间隔是相等,第二帧的第一个包(#4),我们也可以用fmt1来发送,将消息头中的timestamp指定为时间差。并指定帧长。

3 rtmp control message

rtmp中各类消息的区分是通过消息头中的消息类型id(message type id)来区分。控制消息(control message)包括设置块大小(1),中止消息(2),应答消息(3),设定窗口应答大小(5),设置对方带宽(6),用户控制消息(4)。

控制消息发送时,消息流id(message stream id)必须为0,块Id必须为2.

3.1 set chunk size(消息类型:1)

设置块大小,默认块大小为128字节。直接在包头部后面跟4字节的要设定的块大小。

3.2 abort message(消息类型:2)

用于中止消息。接在包头部后面跟4字节的要中止的块流大小。

3.3 Acknowledge(消息类型:3)

应答消息,用于接收端(flash player)报告,总共接收到的字节数。直接在包头部后面跟4字节的收到的字节数。

3.4 window acknowledgement size(消息类型:5)

指定应答的间隔,即距离上一次应答后收到的字节数。

3. 5 set peer bandwidth(消息类型:6)

用于限定对方发送带宽

4 rtmp command message (命令消息)

命令消息包括音频消息(8),视频消息(9),集成控制(22),共享对象消息(19【amf0】,16【amf3】),数据消息(18【amf0】,15【amf3】),命令(远程调用)消息(20【amf0】,17【amf3】)。以后会针对性讲解三类主要的消息(远程调用 ,音频,视频消息)。

4.1 command message (命令/远程调用消息)

远程调用消息,这类消息在我看来就是flash player的一个远程方法调用。故称之为远程调用消息。flash 的实现的两个基本类:NetConnection和NetStream,分别负责创建连接和进行网络流的点播控制。远程调用消息主要是这两个类的公有方法在服务端的远程调用。这两个类的具体介绍参见adobe的官网。其中有详细的介绍有哪些公有方法,以及相关的参数和可能的返回值。所有的参数和返回值都是通过AMF0或AMF3来表示。

http://livedocs.adobe.com/flash/9.0_cn/ActionScriptLangRefV3/flash/net/NetConnection.html

http://livedocs.adobe.com/flash/9.0_cn/ActionScriptLangRefV3/flash/net/NetStream.html

4.1.1 NetConnection.connect

连接请求:

返回连接失败:

连接可用的返回值如下表所示,详见:http://livedocs.adobe.com/flash/9.0_cn/ActionScriptLangRefV3/flash/events/NetStatusEvent.html#info

"NetConnection.Connect.Failed" "error" 连接尝试失败。
"NetConnection.Connect.Success" "status" 连接尝试成功。
"NetConnection.Connect.Rejected" "error" 连接尝试没有访问应用程序的权限。
"NetConnection.Connect.InvalidApp" "error" 连接时指定的应用程序名无效。

4.1.2 NetConnection.close (略)

4.1.3 NetStream.receiveVideo

告知对方是否需要视频数据。由boolean类型的参数指定是否需要视频数据。该命令无需返回(应答)。

4.1.4 NetStream.receiveAudio

告知对方是否需要音频数据。由boolean类型的参数指定是否需要音频数据。该命令无需返回(应答)。格式类似NetStream.receiveVideo。

4.1.5 NetStream.play

告知对方需要点播的文件。请求格式见下图:

返回消息:

可用的返回值见下表:

"NetStream.Play.Start" "status" 播放已开始。
"NetStream.Play.Failed" "error" 出于此表中列出的原因之外的某一原因(例如订阅者没有读取权限),播放发生了错误。
"NetStream.Play.StreamNotFound" "error" 无法找到传递给 play() 方法的 FLV。
"NetStream.Play.Reset" "status" 由播放列表重置导致。
"NetStream.Play.InsufficientBW" "warning" 仅限 Flash Media Server。 客户端没有足够的带宽,无法以正常速度播放数据。

在正式播放之前,必须发送stream begin(event type为0)的用户控制消息告知flash player为播放做好准备。

4.2 Video message

视频消息,消息id为9。h264基本的封装格式如下所示(关于flv的格式详见adobe flash video file format specification version 10.1):

| rtmp header | FLV video tag header | nalu size | nalu data(不包含start code)  |

如果nalu的大小超出了设定的chunk大小,就要进行分块发送。分块的方式见2.4例子

4.3 Audio message

音频消息,消息id为8。基本的封装格式如下所示(关于flv的格式详见adobe flash video file format specification version 10.1):

| rtmp header | FLV audio tag header | audio data  |

4.4 User control message

用户控制消息。可用的用户控制事件包括:stream begin(0),stream EOF(1),stream dry(2),SetBufferLength(3),StreamIsRecorded(4),PingRequest(6),PingResponse(7)

5. 基本的服务端播放流程:

基本的播放流程:收到连接请求-》应答连接成功-》收到播放请求-》检测点播的流是否存在-》发送stream begin消息-》发送paly.start消息—-》连续发送音视数据-》。。。-》直接收到关闭连接请求或播放到文件末尾。

【client】   |                                                                                                   |   【server】

|-----------1: connect------------------------------------------------>|

|<-----2: NetConnection.Connect.Success ------------|

|---------3: play------------------------------------------------------->|

|<-------4: stream begin -------------------------------------------|

|<-------5: NetStream.Play.Start---------------------------|

|<-------6: SetChunksize-------------------------------------------|

|<--------------video message-------------------------------------|

|<-------------audio message-------------------------------------|

|                         ...                                                                      |

转载于:https://my.oschina.net/u/1983790/blog/686521

rtmp 封包及消息相关推荐

  1. 初接触RTMP流媒体实时消息传输协议

    由于公司目前的一个项目涉及到直播那一方面,在这之前我完全没有接触过这么高大上的东西,但是交给我了我就想办法完成.临近周末的星期五,折磨了一天,环境搭建了一天,终于把rtmp的推流服务器给搭建好了,IO ...

  2. 直播协议的选择:RTMP vs. HLS

    直播协议的选择:RTMP vs. HLS SamirChen2016-07-1761 阅读 前言 随着直播业务的兴起,越来越多的直播平台开始涌现,这火热的程度好像一个应用不带上直播业务出来都不好意思跟 ...

  3. (转)rtmp协议简单解析以及用其发送h264的flv文件

    Adobe公司太坑人了,官方文档公布的信息根本就不全,如果只按照他上面的写的话,是没法用的.按照文档上面的流程,server和client连接之后首先要进行握手,握手成功之后进行一些交互,其实就是交互 ...

  4. rtmp协议规范详解

    转载请注明出处:http://blog.csdn.net/handsomehong 本篇文章大部分是rtmp协议1.0版本的翻译,翻译参考了网上的版本,加了一些抓包分析. Adobe公司的实时消息传输 ...

  5. HLS,HTTP,RTSP,RTMP协议的区别

    HLS,HTTP,RTSP,RTMP协议的区别: 用HTTP方式: 先通过服务器将FLV下载到本地缓存,然后再通过NetConnection的本地连接来播放这个FLV,这种方法是播放本地的视频,并不是 ...

  6. RTMP之后,SRT与QUIC

    RTMP协议存在累计延迟与加密方面的问题,为适应互联网视频低延时,高质量的要求,以UDP为核心,具有创造性的SRT,QUIC等流媒体视频方式将成为新的选择.本文来自NGCodec官方博客,由LiveV ...

  7. Nginx Rtmp Module - HLS切片和级联播放

    #Nginx Rtmp Module - HLS切片和播放 1.名词解释 媒体片段文件(.ts): 媒体片段是由源站生成的,基于编码后的媒体源,并且是由一系列的 .ts 格式的文件组成,其中包含了你想 ...

  8. RTMP协议中文翻译(首发)(转)

    Adobe公司的实时消息传输协议 摘要 此备忘录描述了 Adobe公司的实时消息传输协议(RTMP),此协议从属于应用层,被设计用来在适合的传输协议(如TCP)上复用和打包多媒体传输流(如音频.视频和 ...

  9. RTMP代理的协议规范(RtmpProxy)

    RtmpProxy 关于RTMP代理的协议规范.RTMP是字节协议,第一个包是c0,1个字节,一般是03表示是明文的RTMP.所以如果需要做RTMP代理,如果直接转发RTMP客户端的消息,是没法传递额 ...

最新文章

  1. Ubuntu 18.04时间同步
  2. Oracle11G_逻辑备份
  3. oracle中treat函数,Oracle 函数概览
  4. S3C2440的内存情况在NAND FLASH或者NOR FLASH启动的情况下
  5. 面试题整理10 最小的k个数
  6. sox+linux查录音格式,linux-使用SOX和sox FAIL格式混合音频:无法打开输入文件`audio_recorded.wav’:WAVE:找不到RIFF标头...
  7. 试用c51语言采样连续5次异常_学会这些自闭症儿童语言训练技巧,孩子开口说话不再困难...
  8. 南安职业中专学校计算机专业,南安职专:国家级重点职业中专学校
  9. 2020 年 3 月全国程序员工资排名!
  10. jsp点选框_Jsp单选框
  11. SQL BASELINE修改固定执行计划
  12. VS2017 控件添加关联变量
  13. TSS ESS RSS
  14. android 图片素描算法
  15. shell脚本批量创建用户
  16. Selenium3 Java自动化测试完整教程
  17. cat环境搭建及springboot项目接入
  18. 实验:IP 与 ICMP 分析
  19. C#计算一年有多少周
  20. 阳历日期转阴历工具类

热门文章

  1. PrintWriter用法简析
  2. 计算机在识字教学中的应用,【多媒体技术论文】多媒体技术在小学识字教学中的应用(共3090字)...
  3. vue component动态组件_vue-component组件
  4. 字节跳动小程序接入支付功能
  5. 信号与系统2021年期末考试命题
  6. 2021年春季学期-信号与系统-第十四次作业参考答案-第七小题参考答案
  7. 第十五届全国大学生智能车竞赛浙江赛区隆重开幕
  8. mysql大表修改表名原理_MySQL修改大表工具pt-online-schema-change原理
  9. python csv库,Python 中导入csv数据的三种方法
  10. 无法进入一个空框_win10电脑开机进入不了系统如何解决?