一、协议分层

  RTMP包是以Message的结构封装的,结构如下所示:

  

  

  1)Message Type ID在1-7的消息用于协议控制,这些消息一般是RTMP协议自身管理要使用的消息,用户一般情况下无需操作其中的数据。

    Message Type ID为8,9的消息分别用于传输音频和视频数据。Message Type ID为15-20的消息用于发送AMF编码的命令,负责用户与服务器之间的交互,比如播放,暂停等等。

  2)StreamID是音视频流的唯一ID, 一路流如果既有音频包又有视频包,那么这路流音频包的StreamID和他视频包的StreamID相同。

  

  一个Message大小不一,音频视频的Message往往差异较大,为了充分利用网络,需要将一个大的Message中的Body部分拆分到一个或者多个Chunk中

  Chunk结构:

  

  在拆分到多个Chunk中的时候,第一个Chunk携带完整的Message Header信息

  因为一个流当中可以传输多个Chunk,那么多个Chunk怎么标记同属于一个Message的呢?

  是通过Chunk Stream ID区分的,同一个Chunk Stream ID必然属于同一个Message

  

  SRS中的Chunk接收和拼接成Message的代码可以证明:

  

int SrsProtocol::recv_interlaced_message(SrsCommonMessage** pmsg)
{int ret = ERROR_SUCCESS;// chunk stream basic header.char fmt = 0;int cid = 0;if ((ret = read_basic_header(fmt, cid)) != ERROR_SUCCESS) {if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) {srs_error("read basic header failed. ret=%d", ret);}return ret;}srs_verbose("read basic header success. fmt=%d, cid=%d", fmt, cid);// the cid must not negative.srs_assert(cid >= 0);// get the cached chunk stream.SrsChunkStream* chunk = NULL;// use chunk stream cache to get the chunk info.// @see https://github.com/ossrs/srs/issues/249if (cid < SRS_PERF_CHUNK_STREAM_CACHE) {// chunk stream cache hit.srs_verbose("cs-cache hit, cid=%d", cid);// already init, use it direcltychunk = cs_cache[cid];srs_verbose("cached chunk stream: fmt=%d, cid=%d, size=%d, message(type=%d, size=%d, time=%"PRId64", sid=%d)",chunk->fmt, chunk->cid, (chunk->msg? chunk->msg->size : 0), chunk->header.message_type, chunk->header.payload_length,chunk->header.timestamp, chunk->header.stream_id);} else {// chunk stream cache miss, use map.if (chunk_streams.find(cid) == chunk_streams.end()) {    chunk = chunk_streams[cid] = new SrsChunkStream(cid);// set the perfer cid of chunk,// which will copy to the message received.chunk->header.perfer_cid = cid;srs_verbose("cache new chunk stream: fmt=%d, cid=%d", fmt, cid);} else {chunk = chunk_streams[cid];srs_verbose("cached chunk stream: fmt=%d, cid=%d, size=%d, message(type=%d, size=%d, time=%"PRId64", sid=%d)",chunk->fmt, chunk->cid, (chunk->msg? chunk->msg->size : 0), chunk->header.message_type, chunk->header.payload_length,chunk->header.timestamp, chunk->header.stream_id);}}

  

红色的是以CID为key的一个Map,每次的第一个Chunk过来的时候,都缓存起来,下一个Chunk来了之后进行追加。

因为TCP的有序,所以同一个Message中不同的Chunk会先后抵达。

转载于:https://www.cnblogs.com/doudouyoutang/p/9299704.html

RTMP协议中的Chunk Stream ID (CID)的作用相关推荐

  1. rtmp Chunk stream ID 说明

    2019独角兽企业重金招聘Python工程师标准>>> Chunk basic header: chunk basic head的长度为1~3个字节,具体长度主要是依赖chunk s ...

  2. RTMP协议中的AMF数据

    这里有一个连接,amf0和amf3的库,我下了看了下,还是自己写吧,哎. http://wooce.iteye.com/blog/1396278 参考crtmpserver的代码写的,其中有amf.h ...

  3. 05 RTMP Chunk Stream

    RTMP块流 本节指定实时消息传递协议区块流(RTMP区块流).它为更高级的多媒体流协议提供多路复用和分组服务. 虽然RTMP区块流设计用于与实时消息协议(第6节)配合使用,但它可以处理发送消息流的任 ...

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

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

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

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

  6. 直播推流实现RTMP协议的一些注意事项

    018年8月4日第三次更新,详细介绍了RTMP协议与遇到的坑,另外纯Java重写了RTMP协议,做了个Android 推流项目,包含安卓相机采集,编码和RTMP推流,上传到github了. 项目地址: ...

  7. RTMP协议从入门到放弃

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

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

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

  9. rtmp协议分析(三次握手)

    RTMP详细分析(Message 消息,Chunk分块) librtmp分析(发送数据包处理) librtmp分析(接收数据包处理) RTMP协议是Real Time Message Protocol ...

最新文章

  1. 使用Windows7上的VS Code打开远程机Ubuntu上的文件操作步骤
  2. python关键字as_python 之 import、from、as 关键字的 白话 解释与例子
  3. 实现SQL SERVER 下的PadLeft函数
  4. js特效 在服务器显示变形,使一行文字变形产生弯曲弧度特效的jQuery插件 - Arctext.js...
  5. Eclipse 4.9 正式发布,支持 Java 11
  6. php使用pdo操作mysql数据库实例_php使用PDO操作MySQL数据库实例_PHP
  7. C++ 不能重载的运算符
  8. 零基础学python还是c语言-为什么大一先学C语言,而不是Python,你知道为什么吗?...
  9. 三星emcp型号详解_三星emcp型号详解_eMCP终将成为过去式?解析:三星、美光所推出的uMCP为何物?......
  10. webstorm 2018 激活破解方法大全
  11. 服务器应该选哪家好?
  12. 全国社会组织信用信息公式平台(试运行)爬虫记录
  13. 栈(LIFO:后进先出)
  14. [人工智能-深度学习-46]:FineTuning(微调)、Transfer Trainning(迁移学习)的理论基础与深度解析
  15. Unity3D使用经验总结 优点篇
  16. 《深入理解JAVA虚拟机》周志明 第三版 - 第二章 JAVA内存区域与内存溢出异常
  17. 机器人项目研发笔记(一)
  18. 大学计算机手写笔记,法国大学教师发电脑禁令,研究显示:手写记笔记成绩更佳...
  19. sina微博api:获取24小时内前20条用户的微博信息
  20. 算法设计与分析第一章课后作业

热门文章

  1. DataGrid和GridView单击背景变色双击颜色还原
  2. 《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测
  3. 怎么在html中写当前时间,当前时间(Javascript)在HTML
  4. 对于数据库进行设计在PHP,关于数据库表的设计
  5. 计算机设计原则,CISSP备考系列之计算机设计原则[10-39]
  6. /xiaolei.php|martin_十步解决Php Utf-8编码(转贴)
  7. i5 10400f相当于几代i7_十代酷睿i9/i7/i5差异惊人!功耗/温度放飞自我
  8. oracle valueerror,Oracle VALUE_ERROR异常(挑战题编号000005)
  9. android 创建隐藏文件夹吗,Android创建隐藏文件可能文件夹
  10. html更改灰色按钮可用,点击提交按钮后按钮变灰色不可用状态的三种方法