参考文章:视频传输协议详解(RTMP、RTSP、HLS)

RTMP——Real Time Messaging Protocol(实时消息传输协议)

RTMP 是由 Adobe 公司提出的,在互联网 TCP/IP 五层体系结构中应用层,RTMP 协议是基于 TCP 协议的,也就是说 RTMP 实际上是使用 TCP 作为传输协议。TCP 协议在处在传输层,是面向连接的协议,能够为数据的传输提供可靠保障,因此数据在网络上传输不会出现丢包的情况。不过这种可靠的保障也会造成一些问题,也就是说前面的数据包没有交付到目的地,后面的数据也无法进行传输。幸运的是,目前的网络带宽基本上可以满足RTMP协议传输普通质量视频的要求。

RTMP 传输的数据的基本单元为 Message,但是实际上传输的最小单元是 Chunk(消息块),因为 RTMP 协议为了提升传输速度,在传输数据的时候,会把 Message 拆分开来,形成更小的块,这些块就是 Chunk。

消息(Message)的结构

Message结构分析

1.Message Type:它是一个消息类型的ID,通过该ID接收方可以判断接收到的数据的类型,从而做相应的处理。Message Type ID 在 1-7 的消息用于协议控制,这些消息一般是 RTMP 协议自身管理要使用的消息,用户一般情况下无需操作其中的数据。Message Type ID 为8,9的消息分别用于传输音频和视频数据。Message Type ID 为 15-20 的消息用于发送 AMF 编码的命令,负责用户与服务器之间的交互,比如播放,暂停等。

2.Playload Length: 消息负载的长度,即音视频相关信息的的数据长度,4 个字节

3.TimeStamp:时间戳,3 个字节。

4.Stream ID:消息的唯一标识。拆分消息成 Chunk 时添加该 ID,从而在还原时根据该 ID 识别 Chunk 属于哪个消息。

5.Message Body:消息体,承载了音视频等信息。

消息块(Chunk)

消息块结构

通过上图可以看出,消息块在结构上与与消息类似,有 Header 和 Body。

1.Basic Header:基本的头部信息,在头部信息里面包含了chunk stream ID(流通道 Id,用来标识指定的通道)和 chunk type(chunk的类型)。

2.Message Header:消息的头部信息,包含了要发送的实际信息(可能是完整的,也可能是一部分)的描述信息。Message Header 的格式和长度取决于 Basic Header 的 chunk type。

3.Extended TimeStamp:扩展时间戳。

4.Chunk Data:块数据。

RTMP 在传输数据的时候,发送端会把需要传输的媒体数据封装成消息,然后把消息拆分成消息块,再一个一个进行传输。接收端收到消息块后,根据 Message Stream ID 重新将消息块进行组装、组合成消息,再解除该消息的封装处理就可以还原出媒体数据。由此可以看出,RTMP 收发数据是以 Chunk 为单位,而不是以 Message 为单位。需要注意的是,RTMP 发送 Chunk 必须是一个一个发送,后面的 Chunk 必须等前面的 Chunk 发送完成。


拓展:

Rtmp 开发学习的更多相关文章

  1. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  2. web前端开发学习内容

    应该 具备的 知识技能 :懂web标准,熟练手写 xhtml css3 并符合 符合w3c标准                       代码能 兼容主流浏览器.ie6.7.8.9 ff 等.    ...

  3. Android开发学习路线图

    Android开发学习方法: Android是一个比较庞大的体系,从底层的Linux内核到上层的应用层,各部分的内容跨度也比较大.因此,一个好的学习方法对我们学习Android开发很重要. 在此建议, ...

  4. NET开发学习项目资源(2)

    NET开发学习项目资源 击标题链接即可下载. 目录: 1.征婚交友网站 前台交友信息和后台会员管理两大部分组成. 前台功能模块 该模块主要包括查询交友信息.显示交友信息.会员登录.会员信息管理.修改会 ...

  5. Civil 3D API二次开发学习指南

    Civil 3D构建于AutoCAD 和 Map 3D之上,在学习Civil 3D API二次开发之前,您至少需要了解AutoCAD API的二次开发,你可以参考AutoCAD .NET API二次开 ...

  6. 【前端】移动端Web开发学习笔记【2】 & flex布局

    上一篇:移动端Web开发学习笔记[1] meta标签 width设置的是layout viewport 的宽度 initial-scale=1.0 自带 width=device-width 最佳实践 ...

  7. 【前端】移动端Web开发学习笔记【1】

    下一篇:移动端Web开发学习笔记[2] Part 1: 两篇重要的博客 有两篇翻译过来的博客值得一看: 两个viewport的故事(第一部分) 两个viewport的故事(第二部分) 这两篇博客探讨了 ...

  8. .net 网站开发学习资源

    慕课网 前端基础学习 http://www.imooc.com/course/list?c=fe 了解需求 例子之一 http://wenku.it168.com/d_000517899.shtml ...

  9. 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址

    驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...

  10. android开发学习笔记000

    使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...

随机推荐

  1. [转帖](1.2)sql server for linux 开启代理服务(SQL AGENT),使用T-SQL新建作业

    https://www.cnblogs.com/gered/p/12518090.html 回到顶部 [1]启用SQL Server代理 sudo /opt/mssql/bin/mssql-conf ...

  2. [转帖]linux设置page cache大小,Linux Page Cache调优在Kafka中的应用

    本文首发于 vivo互联网技术 微信公众号 链接: 作者:Yang Yijun 本文主要描述Linux Page Cache优化的背景.Page Cache的基本概念.列举之前针对Kafka的 IO ...

  3. [转帖]k8s之PV、PVC、StorageClass详解

    https://zhuanlan.zhihu.com/p/128552232 导读 上一篇写了共享存储的概述以及一个简单的案例演示.这一篇就写一下PV和PVC. PV是对底层网络共享存储的抽象,将共享 ...

  4. [转帖]《Linux性能优化实战》笔记(二)—— CPU 上下文切换(上)

    上一篇的最后一个例子,在多个进程竞争CPU时,我们看到每个进程实际上%usr部分只有20%多,70%多是在wait,但是load远远高于单个进程使用CPU达到100%. 这让我想到之前看的RWP公开课 ...

  5. 【转帖】Mysql一张表可以存储多少数据

    https://www.cnblogs.com/wenbochang/p/16723537.html Mysql一张表可以存储多少数据 在操作系统中,我们知道为了跟磁盘交互,内存也是分页的,一页大小4 ...

  6. [转帖]linux下/proc/sysrq-trigger详解

    /proc/sysrq-trigger详解 这是一组"魔术组合键",只要内核没有被完全锁住,不管内核在做什么事情,使用这些组合键能即时打印出内核的信息. 使用SysRq组合键是了解 ...

  7. MYSQL 简单验证

    建立测试表 create table test001 (a varchar(2000),b varchar(2000),c varchar(2000),d varchar(2000),e varcha ...

  8. AI五子棋 C++ 借助图形库raylib和raygui 设计模式思考过程和实现思路总结

    转载请注明 原文链接 :https://www.cnblogs.com/Multya/p/17988499 repo: https://github.com/Satar07/AI_GoBang_Pub ...

  9. 手写promise实现自定义封装多个回调函数的执行

    自定义封装多个回调函数的执行 <script src="./Promise.js"></script> let p = new Promise((resol ...

  10. ABP-VNext 用户权限管理系统实战05----扩展授权类型(单点登录)

    一.适合场景: 1.我方系统在集成到别人的集成本台时一般是拿别的平台的用户名,在我方系统进行登录 2.我方系统是前后端分离,前端要拿到token 二.解决方案:自定义授权类型 我们知道Identity ...