当前位置: 首页 > 编程日记 > 正文

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

相关文章:

fceux源码解析_fceux源码解析_从源代码制作deb包的两种方法以及修改已有deb包(转载)...

1. 原理1) deb包通常包含两部分&#xff1a;控制信息(DEBIAN目录)、安装内容(模拟"/"目录)2) 通过解开已有的deb包看其中内容i. 释放安装内容到dirname目录中$ dpkg-X xxx.deb dirnameii. 释放控制信息到当前目录下的DEBIAN子目录中$ dpkg-e xxx.deb2. 准备1) 安装相…

Centos 7 意外断电如何处理

拔U盘的时候&#xff0c;不小心碰到了主机上的开机键…… 还好默认的响应动作是睡眠…… 还不知道 CentOS 怎么样应对意外断电呢&#xff1f;&#xff01; 转载于:https://www.cnblogs.com/liaozt/p/6232189.html

静茹docker容器的几种方法_Docker介绍及使用

什么是容器&#xff1f;容器就是在隔离的环境运行的一个进程&#xff0c;如果进程停止&#xff0c;容器就会销毁。隔离的环境拥有自己的系统文件&#xff0c;ip地址&#xff0c;主机名等&#xff0c;kvm虚拟机&#xff0c;linux&#xff0c;系统文件程序&#xff1a;代码&#…

Elasticsearch 6.3.1、Head插件 安装及配置

安装Elasticsearch Elasticsearch下载地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch 也可以直接使用wget下载到某目录下, 本文所有下载的包都放在 /home/tools 中&#xff0c; 解压后移到 /home/apps目录下  wget https://artifacts.elastic.co/downloa…

Android中的eventBus传值

第一步&#xff1a;在build.gradle中添加依赖dependencies { compile org.greenrobot:eventbus:3.0.0} 第二步&#xff1a;创建一个 Event类&#xff1a; 注意&#xff1a;enum 不是classpublic enum Event {//消息名&#xff0c;可以根据这个名字判断是哪个消息 IMAGE_LOA…

mysql 优化器算法_SQL 查询优化器底层原理解析【MySQL 篇】

前言SQL 执行流程中有一个模块叫做查询优化器&#xff0c;这个模块的功能主要是对 SQL 语法树进行逻辑优化和物理优化&#xff0c;最终生成执行计划交给执行引擎执行 SQL。查询优化器主要分为两部分&#xff1a;一部分是逻辑优化&#xff0c;一部分是物理优化。逻辑优化会将 SQ…

gprs发送信号对方如何接收_和接收缓冲区比较:Netty发送缓冲区是如何设计的,why?...

点击上方蓝字关注我吧&#xff01;本篇文章大概3300字&#xff0c;阅读时间大约10分钟前面文章&#xff0c;透彻分析了Netty的接收缓冲区优化的套路和实现细节&#xff0c;以及写数据和刷新数据的宏观流程和细节&#xff1a;从源码出发&#xff1a;在宏观上把握Netty写数据到应…

原 史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)

转载请标明出处&#xff1a; 原文首发于&#xff1a;https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f8-bus/ 本文出自方志朋的博客 转载请标明出处&#xff1a; Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来。它可以用于广播配置文件的更改或者服务之间…

python读取数据校验数据_Python通过Schema实现数据验证方式

Schema是什么&#xff1f;不管我们做什么应用&#xff0c;只要和用户输入打交道&#xff0c;就有一个原则--永远不要相信用户的输入数据。意味着我们要对用户输入进行严格的验证&#xff0c;web开发时一般输入数据都以JSON形式发送到后端API&#xff0c;API要对输入数据做验证。…

String,StringBuffer

String类代表不可变的字符序列。 String s1 "hello"; String s2 "hello"; s1 s2 > true "hello"是字符串常量&#xff0c;存在data seg中&#xff0c;编译器对data seg有优化&#xff0c;对于已经有的数据&#xff0c;不是重新分配空间&a…

蒙特卡洛粒子滤波定位算法_粒子滤波——来自哈佛的详细的粒子滤波器教程【1】...

本文原版链接&#xff1a;https://www.seas.harvard.edu/courses/cs281/papers/doucet-johansen.pdf本文是哈佛大学相关研究人员于2008年发表的一篇关于粒子滤波的详细教程&#xff0c;至今已被引用1687次。目录&#xff1a;介绍Introduction1.1 序言Preliminary remarks1.2 教…

人脸识别的一些资源

人脸识别的全部源代码(在Visual C6.0下可以运行识别)http://www.61ic.com/Download/DaVinci/Code/201304/121592.html 智能分析接口&#xff08;支持车牌识别&#xff0c;人脸识别等智能类型&#xff09;提供DEMO和源码&#xff0c;供参考&#xff01;http://www.61ic.com/Down…

mysql where关键字_MySQL WHERE 子句

我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据。如需有条件地从表中选取数据&#xff0c;可将 WHERE 子句添加到 SELECT 语句中。语法以下是 SQL SELECT 语句使用 WHERE 子句从数据表中读取数据的通用语法&#xff1a;SELECT field1, field2,...fieldN FROM table_name…

mac远程连接windows工具_Windows远程MAC系统

第一步、在 Mac 上设置好屏幕共享1. 1先请在苹果 Mac 电脑上的“系统偏好设置”窗口中打开“共享”功能&#xff0c;如图所示接着在共享窗口中的左侧点击启用“屏幕共享”选项&#xff0c;如图所示当屏幕共享功能打开以后&#xff0c;请点击“电脑设置”按钮&#xff0c;如图所…

Tomcat虚拟目录设置

ssh $host "rm -fr /var/www/$tomcat_name/webapps/*" 远程分发war包部署tomcat项目时&#xff0c;需要先清除项目目录。 --------------------------------------------------------------------------------------- <context path"" docBase"&qu…

30005 rust_Steam三连冠老游戏《腐蚀(RUST)》为什么突然火起来了?

Steam新一周(1月18日-1月24日)销量榜公开&#xff0c;《赛博朋克2077》跌落至第五&#xff0c;《荒野大镖客2》前进到第六&#xff0c;而第一人称僵尸生存网络游戏《Rust》已经三连冠了&#xff0c;腐蚀是2013年的老游戏了&#xff0c;很多人问这个游戏值不值得购买&#xff0c…

(6)解构赋值的用途

解构赋值的用途1.交换变量的值 var a 100; var b 200; var t; t a; a b; b t; //解构赋值的写法完成【ES6交换变量的值】 var x 100; var y 200; [x, y] [y, x]; console.log(x); console.log(y); 优点1:直观 优点2:一一对应 优点3:节省内存空间(不用多申请变量) 2.从函…

python lstm_python-Keras中LSTM的补充

好的,所以您的问题让我开始思考,我想我已经解决了,但是什么都没有.这是我为获取LSTM实现背后的一些见识而编写的代码段.from keras.layers import LSTMfrom keras.models import Sequentialmodel Sequential()model.add(LSTM(10, input_shape(20, 30), return_sequencesTrue))…

Jtabbedpane设置透明、Jpanel设置透明

摘自https://zhidao.baidu.com/question/983204331427010139.htmljava中如何设置Jtabbedpane为透明 20在Jtabbedpane下有背景图片&#xff0c;如何设置让他透明呢&#xff1f;0oo宝贝xxX |浏览 1147 次 |举报我有更好的答案2014-12-30最佳答案你好&#xff0c;你可以增加以下代…

mysql 按日期删除数据库_DAY11 - MySQL入门(数据库的增、删、改、查 基本操作)...

一、 数据库的介绍二、 MySQL的基本语法l 注释&#xff1a;单行注释&#xff1a; #注释内容单行注释&#xff1a; -- 注释内容(注意&#xff0c;两个“--”之后有一个空格)多行注释&#xff1a; /*注释内容*/l 语句行&#xff1a;一条语句也称为一条命令&#xff0c;通常用一个…

LeetCode之461. Hamming Distance

------------------------------------------------------------------ AC代码&#xff1a; public class Solution {public int hammingDistance(int x, int y) {return Integer.toString(x^y,2).replaceAll("0","").length();} } 题目来源&#xff1a; h…

机器学习模型 知乎_机器学习:模型评估之评估方法

​机器学习已经成为了人工智能的核心研究领域之一&#xff0c;它的研究动机就是为了让计算机系统具有人的学习能力以便实现人工智能。目前&#xff0c;关于机器学习定义的说法比较多&#xff0c;而被广泛采用的定义是“利用经验来改善计算机系统自身的性能”​。由于“经验”的…

NSDate NSCalendar NSString之间的故事以及转换

1.NSDate 和 NSString 之间的转换 这之间的转换主要依靠NSDateFormatterNSDate <------> NSStringNSDateFormatter *formatter [[NSDateFormatter alloc]init];formatter.dateFormat "yyyy-MM-dd HH:mm:ss";NSString *strDate [formatter stringFrom:date];…

bzoj 4695: 最假女选手

……一道丧病线段树膜板题…… 被常数卡的死去活来……QAQ 学到了些奇技淫巧&#xff1a;把取min标记 和 区间最小值 合并 可以快很多…… #include <bits/stdc.h> #define lc(t) ((t) << 1) #define rc(t) (((t) << 1) | 1) #define N 2000010 #define INF …

python 打包 .app 运行 控制台窗口_Python打包工具

1 Python打包工具目前在windows平台上将Python程序打包成exe文件主要有三个工具。今天将一个Tkinter写的界面程序打包成exe文件&#xff0c;三个工具都试了一遍&#xff0c;感觉PyInstaller会比较好用一些。2 py2exe2.1 下载安装2.2 启动脚本写一个setup_py2exe.py文件from dis…

地址池命令 思科理由_思科互联网络操作系统 ——路由器接口

点击蓝字关注我们路由器接口接口配置是最重要的路由器配置之一&#xff0c;因为若没有接口,路由器几乎就毫无用处。另外&#xff0c;要与其他设备通信&#xff0c;接口配置必须绝对精确。配置接口时&#xff0c;我们需要指定网络层地址、介质类型和带宽,还需使用其他管理命令。…

mysql数据去重语句_数据库 mysql 语句

LAMP: Linux系统 A阿帕奇服务器 Mysql数据库 Php语言mysql:常用代码create table CeShi1(Uid varchar(50) primary key,Pwd varchar(50),Name varchar(50),Nation varchar(50),foreign key(Nation) references Nation(Code))写查询语句需要注意&#xff1a;1.创建表的时候&…

mysql中utf8_bin、utf8_general_ci、utf8_general_cs编码区别

转载地址: https://www.cnblogs.com/exmyth/p/3616672.html在mysql中存在着各种utf8编码格式&#xff0c;如下表&#xff1a;1&#xff09;utf8_bin2&#xff09;utf8_general_ci3&#xff09;utf8_general_csutf8_bin将字符串中的每一个字符用二进制数据存储&#xff0c;区分大…

利用闭包实现多次ajax请求只执行最后一次

点一个按钮&#xff0c;则向服务器请求资源&#xff0c;不作处理时&#xff0c;多次点击后会有很多个请求在等待。我们知道一般我们用ajax是异步请求&#xff0c;那么我们快速重复点击一个按钮得到的结果其实我们并不知道是哪次点击的结果可能是第一次可能是最后一次也可能是第…

3dmax批量导出fbx_推荐一款超实用的3DMAX插件——模法师

模法师集成于3DMAX上&#xff0c;到老子云平台下载插件后&#xff0c;直接双击运行安装就能使用了。有多好用呢&#xff1f;好比游戏开了挂&#xff0c;效率瞬间翻几番。主要提供三大功能&#xff1a;1、批量格式转换简单地说&#xff0c;你可以把大量模型文件&#xff0c;同时…