背景

当前用到的直播场景有很多, 比如视频通话, 个人直播, 赛事直播;直播的协议也有很多;

比如HTTP+FLV:流式tag+渐进式下载(理论延迟1-3s)

HLS: ts分片+索引管理(理论延时10s+,跟切片时间大小有关)

RTMP: tcp流+chunk块传输(理论延迟1-3s)

下面详细描述一下RTMP

RTMP(Real Time Messaging Protocol) 使用Flash Player作为播放器客户端; 协议有很多变种:

1.RTMP本身, 基于TCP.默认使用1935端口的明文协议;

2.RTMPS,通过TLS/SSL链接传输的RTMP

3.RTMPE,使用Adobe自有安全机制加密的RTMP

4.RTMPT,将RTMP封装在HTTP中,用于穿透防火墙,通常使用TCP的80和443端口;

5.RTMFP,基于UDP的RTMP

包格式

RTMP的逻辑处理基本单元是Message. 传输的基本单元是Chunk即消息块,多个消息块(也可能一个)拼接成一个Message; 如果一个有效的消息, 数据量超出当前ChunkSize的话, 会被拆分成多个分块来分批传输.而接收端会根据Chunk中包含的data长度, message id和message长度把chunk还原成完整的Message; 具体协议的字段就不详细描述了

步骤

  1. 握手

    1. tcp三次握手
    2. rtmp握手

      根据抓包来分析:

Client->Server, 内容是C0+C1

Server->Client,内容是S0+S1+S2

Client->Server,内容是C2

C0和S0表示的是RTMP版本号



根据抓包来分析:

Client->Server, 内容是C0+C1

Server->Client,内容是S0+S1+S2

Client->Server,内容是C2

C0和S0表示的是RTMP版本号

这里我们可以看到, 还没发流名, 但是地址有app名: “media-gb-pc5d8467db66d4889b7c59b6d5d61df25/44010300001320000024”

RTMP包头里面的StreamID,是每个消息的唯一标识, 就是我们上面讲到的message和chunk; 同一个chunk streamid是属于同一个message的;

  1. 服务端在收到connect消息, 会向客户端发送Window Acknowledgement Size和Set Peer Bandwidth;

    Window Acknowledgement Size: 通知客户端, 如果收到该大小字节的数据, 需要回复一个Acknowledgement. 设置大小是524288, 达到这个数据量的较少, 所以没有在抓包中也没看到客户端的ack回复;

    Set Peer Bandwidth: 流量控制; 所以后面客户端收到了之后, 也会给服务端回一个Window Acknowledgement Size消息;

    StreamBegin 用户控制消息

    _result(‘NetConnection.Connect.Success’): 客户端发送connect消息后, 服务端向客户端发送了_result消息; 通知了客户端连接状态是success;

    到这里, 连接就建立完毕了, 下面就是流的操作了;

  2. 建立网络流

    服务器和客户端只建立一个网络连接, 多个网络流可以复用这一个网络连接;

    createStream–创建逻辑通道;通道用于传输音视频;

    result: Stream ID,用于唯一的标示该Stream

getStreamLength: 获取’‘3402000000131000001’'流的长度. 一个完整的推流地址, 到这里也就可以推出来了. connect+getStreamLength

PLAY/PUBLISH

Play: 播放指定流,等待服务端传输音视频数据;

publish: 开始上传音视频数据

服务端回包: streamBegin: 向客户端指示流传输开始;

onStatus: NetStream.Play.Reset消息只有在客户端发送play消息设置了reset标志才会发, 如果客户的请求的播放流不存在, 服务端应返回NetStream.Play.StreamNotFound. 当然这个一般业务层都会拦截;

音视频传输

到这里, 整个RTMP的主体流程就结束了;

参考文档

https://www.adobe.com/content/dam/acom/en/devnet/rtmp/pdf/rtmp_specification_1.0.pdf

流媒体RTMP协议解析相关推荐

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

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

  2. 通过 wireshark 抓包了解直播流媒体 RTMP 协议基本过程

    作者:Elias Zhang 声网资深工程师,拥有从Iaas层的基础信息存储服务到paas层的云服务的职业经历,喜欢python语言,习惯使用C#,熟悉基于和结合CDN的业务产品架构,点播.直播.云导 ...

  3. RTMP协议解析(一) —— 基本了解

    版本记录 版本号 时间 V1.0 2017.09.04 前言 大家都知道很多视频应用的app中都是使用RTMP格式的协议,这个是国际上共同使用的协议,我自己虽然做过了直播类型的app,但是从没时间深入 ...

  4. RTMP协议深度解析:从原理到实践,掌握实时流媒体传输技术

    目录标题 1. 引言 1.1 流媒体传输技术的重要性 1.2 为什么选择RTMP协议 1.3 RTMP协议的发展与应用 2. RTMP协议基础 2.1 RTMP协议简介 2.2 RTMP协议与其他流媒 ...

  5. nginx搭建rtmp协议流媒体服务器总结

    最近在 ubuntu12.04+wdlinux(centos)上搭建了一个rtmp服务器,感觉还挺麻烦的,所以记录下. 大部分都是参考网络上的资料. 前提: 在linux下某个目录中新建一个nginx ...

  6. RTMP 流媒体系统协议 简介

    什么是RTMP协议 RTMP(Real-Time Messaging Protocol实时消息传送协议)的缩写,它是Adobe Systems公司为Flash播放器和服务器之间音频.视频和数据传输开发 ...

  7. 利用nginx搭建http和rtmp协议的流媒体服务器

    利用nginx搭建http和rtmp协议的流媒体服务器 一.准备工作 1.安装依赖包: yum install gcc glibc glibc-devel libtool make openssl-d ...

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

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

  9. 基于RTMP协议的Flash流媒体网页直播播放器

    本文记录一些基于Flash技术的网页播放器.基于Flash的网页播放器相比于其他网页播放器来说最大的优势就是"免插件安装"了,这一点可以很大的提高用户的体验质量. 主要是几种常用的 ...

  10. 流媒体-H264协议-编码-x264学习-相关概念x264编译及文件解析(一)

    流媒体-H264协议-编码-x264学习-相关概念x264编译及文件解析(一) 流媒体-H264协议-编码-x264学习-主要结构体(二) 流媒体-H264协议-编码-x264学习-主要函数(三) 流 ...

最新文章

  1. pandas统计缺失值的个数
  2. Mac安装Open CC进行繁简转化
  3. Self Crossing
  4. 开启 ASA 5505 snmp协议
  5. PHP 5.3.0以上推荐使用mysqlnd驱动
  6. cpp存储类型说明符(storage class specifier)
  7. 虚拟打印机 android版,Doro PDF Writer
  8. 【机器人技术基础】第1章选择题
  9. xshell连不上阿里云服务器Connection closed by foreign host.解决办法
  10. TikTok(国际版抖音)时间线
  11. JavaScript案例:页面自动跳转到首页
  12. 如何防止QT程序未响应
  13. java 读取word页码
  14. winrar主要参数
  15. 超融合和服务器关系_超融合服务器是什么?和超融合一体机有什么区别?
  16. 枕上诗书-初入红尘,不知人间疾苦,
  17. Java 8计算一年前或一年后的日期
  18. OpenCV C++案例实战十九《制作电子相册查看器》
  19. 谷歌浏览器实现多开,单独cookie
  20. 3. 自然语言处理NLP:具体用途(近义词类比词;情感分类;机器翻译)

热门文章

  1. mybatis查询出现索引越界异常
  2. php页面能加音乐吗,网页背景音乐的设置方法,兼容所有浏览器
  3. 计算机键盘快速指南,菜鸟必看 Windows键盘快捷键入门指南
  4. python微积分求面积_用Python学微积分(微积分应用)
  5. NB-IoT独立式烟感在出租屋的防火安全应用
  6. FabFilter Pro-R 混响效果器
  7. 【数字逻辑设计】电路原理图
  8. 万能采集网站php源码,PHP采集系统UZCMS万能最新版
  9. 数据库系统概念 第五章 习题答案
  10. vue设置右边距_数控CNC雕刻机使用系列之二: 维宏软件的参数设置