RTMP协议中的Chunk Stream ID (CID)的作用
一、协议分层
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)的作用相关推荐
- rtmp Chunk stream ID 说明
2019独角兽企业重金招聘Python工程师标准>>> Chunk basic header: chunk basic head的长度为1~3个字节,具体长度主要是依赖chunk s ...
- RTMP协议中的AMF数据
这里有一个连接,amf0和amf3的库,我下了看了下,还是自己写吧,哎. http://wooce.iteye.com/blog/1396278 参考crtmpserver的代码写的,其中有amf.h ...
- 05 RTMP Chunk Stream
RTMP块流 本节指定实时消息传递协议区块流(RTMP区块流).它为更高级的多媒体流协议提供多路复用和分组服务. 虽然RTMP区块流设计用于与实时消息协议(第6节)配合使用,但它可以处理发送消息流的任 ...
- (转)RTMP协议从入门到放弃
转载自: http://blog.csdn.net/shangmingyang/article/details/50837852 RTMP协议是Real Time Message Protocol( ...
- (转)rtmp协议简单解析以及用其发送h264的flv文件
Adobe公司太坑人了,官方文档公布的信息根本就不全,如果只按照他上面的写的话,是没法用的.按照文档上面的流程,server和client连接之后首先要进行握手,握手成功之后进行一些交互,其实就是交互 ...
- 直播推流实现RTMP协议的一些注意事项
018年8月4日第三次更新,详细介绍了RTMP协议与遇到的坑,另外纯Java重写了RTMP协议,做了个Android 推流项目,包含安卓相机采集,编码和RTMP推流,上传到github了. 项目地址: ...
- RTMP协议从入门到放弃
RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing) ...
- RTMP协议中文翻译(首发)(转)
Adobe公司的实时消息传输协议 摘要 此备忘录描述了 Adobe公司的实时消息传输协议(RTMP),此协议从属于应用层,被设计用来在适合的传输协议(如TCP)上复用和打包多媒体传输流(如音频.视频和 ...
- rtmp协议分析(三次握手)
RTMP详细分析(Message 消息,Chunk分块) librtmp分析(发送数据包处理) librtmp分析(接收数据包处理) RTMP协议是Real Time Message Protocol ...
最新文章
- 使用Windows7上的VS Code打开远程机Ubuntu上的文件操作步骤
- python关键字as_python 之 import、from、as 关键字的 白话 解释与例子
- 实现SQL SERVER 下的PadLeft函数
- js特效 在服务器显示变形,使一行文字变形产生弯曲弧度特效的jQuery插件 - Arctext.js...
- Eclipse 4.9 正式发布,支持 Java 11
- php使用pdo操作mysql数据库实例_php使用PDO操作MySQL数据库实例_PHP
- C++ 不能重载的运算符
- 零基础学python还是c语言-为什么大一先学C语言,而不是Python,你知道为什么吗?...
- 三星emcp型号详解_三星emcp型号详解_eMCP终将成为过去式?解析:三星、美光所推出的uMCP为何物?......
- webstorm 2018 激活破解方法大全
- 服务器应该选哪家好?
- 全国社会组织信用信息公式平台(试运行)爬虫记录
- 栈(LIFO:后进先出)
- [人工智能-深度学习-46]:FineTuning(微调)、Transfer Trainning(迁移学习)的理论基础与深度解析
- Unity3D使用经验总结 优点篇
- 《深入理解JAVA虚拟机》周志明 第三版 - 第二章 JAVA内存区域与内存溢出异常
- 机器人项目研发笔记(一)
- 大学计算机手写笔记,法国大学教师发电脑禁令,研究显示:手写记笔记成绩更佳...
- sina微博api:获取24小时内前20条用户的微博信息
- 算法设计与分析第一章课后作业
热门文章
- DataGrid和GridView单击背景变色双击颜色还原
- 《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测
- 怎么在html中写当前时间,当前时间(Javascript)在HTML
- 对于数据库进行设计在PHP,关于数据库表的设计
- 计算机设计原则,CISSP备考系列之计算机设计原则[10-39]
- /xiaolei.php|martin_十步解决Php Utf-8编码(转贴)
- i5 10400f相当于几代i7_十代酷睿i9/i7/i5差异惊人!功耗/温度放飞自我
- oracle valueerror,Oracle VALUE_ERROR异常(挑战题编号000005)
- android 创建隐藏文件夹吗,Android创建隐藏文件可能文件夹
- html更改灰色按钮可用,点击提交按钮后按钮变灰色不可用状态的三种方法