视频封装格式

FLV(Flash Video)

FLV封装格式

Tag Data分为Audio,Video,Script三种

TS(Transport Stream)传输流

TS文件分为三层,(倒叙更好理解)

  • TS层:在PES层基础上加入了数据流识别信息和传输信息
  • PES层:在ES层基础上加入了时间戳(PTS/DTS)等信息
  • ES层:压缩编码之后的音视频数据

◆ ts包大小固定为188字节,ts层分为三个部分:ts header、adaptation field、payload。

◆ ts header固定4个字节;

◆ adaptation field可能存在也可能不存在,主要作用是给不足188字节的数据做填充。

◆ payload是 PES 数据,或者PAT,PMT等。

◆ ts Header + adaptation field 格式如下:

TS Header

◆ TS Header格式如下:

 pid 决定了负载内容的类型,主要包括:PAT表,PMT表,视频流,音频流。常用的PID值:

调整字段

PAT表结构(指明PMT表的PID值)

typedef struct TS_PAT{unsigned table_id                 :8  //固定位0x00,表示该表是PATunsigned section_syntax_indicator :1  //段语法标志,固定为1unsigned zero                     :1  //固定为0unsigned reserved_1               :2  //第一个保留位unsigned section_length           :12 //表示这个字节之后有用的字节数,包括CRC_32unsigned transport_stream_id      :16 //传输流的ID,区别于一个网络中其他多路复用的流unsigned reserved_2               :2  //第二个保留位unsigned version_number           :5  //表示PAT的版本号unsigned current_next_indicator   :1  //表示发送的PAT是当前有效还是下一个有效,为1时代表当前有效unsigned section_number           :8  //如果PAT分段传输,那么此值每次递增1unsigned last_section_number      :8  //最后一个分段的号码for(int i=0;i<N;i++){unsigned Program_number           :16 //节目号unsigned Reversed_3               :3  //保留位if(Program_number == 0)Network_id                    :13 //网络信息表(NIT)的PIDelseProgram_MAP_PID               :13 //节目映射表的PID,每个节目都有一个}unsigned CRC_32                   :32 //CRC32校检码
}TS_PAT

PMT表(指明音视频流的PID值)


typedef struct TS_program_map_section{unsigned Table_id                    :8  //标志PSI分段的内容,对于PMT,此值为0x02unsigned Section_syntax_indicator    :1  //置为1unsigned '0'                         :1unsigned Reserved                    :2  //保留位unsigned Section_length              :12 //指明了自此到最后CRC_32的字节数unsigned Program_number              :16 //指出该节目的节目号,与PAT表对应unsigned Reserved                    :2  //保留位unsigned Version_number              :5  //取值0-31,代表当前PMT的版本号unsigned Current_next_indicator      :1  //代表当前PMT是否有效unsigned Section_number              :8  //给出了当前所处段的数目unsigned Last_section_number         :8  //给出了最后一个分段,即分段的最大数目unsigned Reserved                    :3  //保留位unsigned PCR_PID                     :13 //指示TS包的PCR值,该TS包含有PCR字段unsigned Reserved                    :4  //保留位unsigned Program_info_length         :12 //该字段描述跟随其后对节目信息描述的字节数for(int i = 0; i < N; i++)Descriptr()for(int i = 0; i < N; i++){unsigned Stream_type             :8  //0x00:保留, 0x01:MPEG1视频,0x02:MPEG2视频,0x03:MPEG1音频,0x04:MPEG2音频,0x05:私有字段,0x06:含有私有数据的PES包 ......unsigned Reserved                :3  //保留unsigned Elementary_PID          :13 //指示TS包的PID,这些TS包含有相同的PIDunsigned Reserved                :4  //保留unsigned ES_info_length          :12 //指示跟随其后描述相关节目元素的字节数for(int j = 0; j < N2; j++)Descriptr()}unsigned CRC_32                      :32 //循环校检位
}

◆ 打包ts流时PAT和PMT表是没有调整字段的,不够的长度直接补0xff即可。

◆ 视频流和音频流都需要加adaptation field,通常加在一个帧的第一个ts包和最后一个ts包里,中间的ts包不加。

PES 层

◆ PES(Packetized Elementary Stream,打包的ES),在 ES 层的基础上加入了时间戳(PTS/TDS)等信息。

◆ ES数据包比较大,加入PES头时需将ES进行分割,只在第一个分割的ES上加PES头,如下图所示

◆ PES packet length — 指示PES 包中跟随该字段最后字节的字节数。0 值指示PES 包长度既未指示也未限定并且仅在这样的PES 包中才被允许,该PES 包的有效载荷由来自传输流包中所包含的视频基本流的字节组成。

◆ PES结构如下:◆ PES 关键字段说明

ES 层

◆ ES(Elementary Stream,基本码流),就是音视频编码数据流,比如视频H.264,音频AAC。

◆ 一个 ES 流中只包含一种类型的数据(视频,或音频,或字幕)。

MP4(MPEG-4)

MP4由许多的box组成,每个box包含不同的信息,这些box以树状结构的形式组成,box中可以包含box

◆ box 由 header 和 body 组成,header 指明 box 的 size 和 type。size 是包含 box header 的整个 box 的大小。

◆ box type,通常是4个ASCII码的字符如“ftyp”、“moov”等,这些 box type都是已经预定义好的,表示固定的含义。如果是“uuid”,表示该box为用户自定义扩展类型,如果 box type 是未定义的,应该将其忽略。

◆ 如果 header 中的 size 为1,则表示 box 长度需要更多的bits位来描述,在后面会有一个8字节的 largesize 用来描述 box 的长度。如果 size 为0,表示该 box 为文件的最后一个box,文件结尾(同样只存在于“mdat”类型的box中)。

◆ box 分为两种,Box 和 Fullbox。FullBox 是 Box 的扩展,Header 中增加了version 和 flags字段。

◆ box 定义如下:

aligned(8) class Box (unsigned int(32) boxtype,optional unsigned int(8)[16] extended_type) {unsigned int(32) size;unsigned int(32) type = boxtype;if (size==1) {unsigned int(64) largesize;} else if (size==0) {// box extends to end of file}if (boxtype==‘uuid’) {unsigned int(8)[16] usertype = extended_type;}
}

FullBox定义:

aligned(8) class FullBox(unsigned int(32) boxtype, unsigned int(8) v, bit(24) f)
extends Box(boxtype) {unsigned int(8) version = v;bit(24) flags = f;
}

ISO/ICE 14496-12

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/143385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode——岛屿的最大面积

1. 题目链接&#xff1a;695. 岛屿的最大面积 2. 题目描述&#xff1a; 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都…

Moto edge s pro手机 WIFI和蓝牙连接不上 解决方法分享

2021年12月入手一台Moto Edge S Pro 12256版&#xff0c;看着性价比很高&#xff0c;越用越垃圾。屏幕显示没有vivo亮丽/APP图标很丑/屏幕上一点点水就失灵/拍照片边缘是模糊的/系统几乎不更新。 以上都可以忍受&#xff0c;但是&#xff1a; 用一年不到&#xff0c;蓝牙不能…

pycharm使用

1、注释多行&#xff1a;ctril/ 2、解除多行注释&#xff1a;ctril/

【人工智能Ⅰ】7-KNN 决策树

【人工智能Ⅰ】7-KNN & 决策树 7-1 KNN&#xff08;K near neighbour&#xff09; 思想&#xff1a;一个样本与数据集中的k个样本最相似&#xff0c;若这k个样本大多数属于某类别&#xff0c;则该个样本也属于这类别 距离度量 样本相似性用欧氏距离定义 L p ( x i , x…

kicad源代码研究:symbol properties窗口中为SCH_SYMBOL添加或删除一个sch_field

向grid中添加一个sch_field FIELDS_GRID_TABLE<SCH_FIELD>* m_fields; WX_GRID* m_fieldsGrid; simEnableFieldRow (int) m_fields->size(); m_fields->emplace_back( VECTOR2I( 0, 0 ), simEnableFieldRow, m_symbol, SIM_ENABLE_FIELD ); // notify the grid w…

前端 vue 面试题 (一)

文章目录 v-if,v-show差别v-for和v-if虚拟dom解决什么问题vue的data为什么返回函数不返回对象比较vue&#xff0c;reactvue双向绑定原理vue虚拟dom 的diff算法vue 虚拟dom的diff算法的时间复杂度vue2与vue3的区别vue数据缓存&#xff0c;避免重复计算单页应用怎么跨页面传参vue…

在MySQL上实现间隔5分钟汇总取数及相关字符串、时间处理方法实践

1. 实践案例需求描述 查询mysql数据库&#xff0c;按每5分钟分组获取3个小时内的电量数据&#xff0c;参考SQL语句如下。 select sd.RecordTime RecordTime, sd.sddl sddl,sd.pvdl ,cap.capdl capdl from ((SELECT CONCAT(DATE_FORMAT(RecordTime,%Y-%m-%d %H:), LPAD(floor(…

Ubuntu20.04 通过nmcli命令查看网卡状态为unmanaged

问题描述&#xff1a; 通过下述指令查看网卡状态为 "unmanaged" nmcli dev status 解决方法&#xff1a; cd /usr/lib/NetworkManager/conf.d/ sudo mv 10-globally-managed-devices.conf 10-globally-managed-devices.conf.bak sudo cp 10-globally-managed-devic…

Java 设计模式——中介者模式

目录 1.概述2.结构3.案例实现3.1.抽象中介类3.2.抽象同事类3.3.具体同事类3.4.具体中介类3.5.测试 4.优缺点5.使用场景 1.概述 &#xff08;1&#xff09;一般来说&#xff0c;同事类之间的关系是比较复杂的&#xff0c;多个同事类之间互相关联时&#xff0c;他们之间的关系会…

Python爬取股票交易数据代码示例及可视化展示。

文章目录 前言一、开发环境二、第三方模块三、爬虫案例步骤四、爬虫程序全部代码1.分析网页2.导入模块3.请求数据4.解析数据5.翻页6.保存数据 五、实现效果六、数据可视化全部代码1.导入数据2.读取数据3.可视化图表4.效果展示关于Python技术储备一、Python所有方向的学习路线二…

Windows本地配置带GPU的Pytorch环境

首先需要安装并配置好Anaconda环境&#xff0c;安装教程教程随便找一个就好。 第一步&#xff1a;安装好之后创建conda虚拟环境&#xff1a; conda create -n your_env_name pythonx.x 第二步&#xff1a;安装需要版本的pytorch&#xff1a;pytorch下载链接 cu100/torch-1.2…

VUE基础的一些总结

首先推荐观看VUE官方文档 目录 创建一个 Vue 应用 要创建一个 Vue 应用&#xff0c;你需要按照以下步骤操作&#xff1a; 步骤 1&#xff1a;安装 Node.js 和 npm 确保你的计算机上已经安装了 Node.js。你可以在 Node.js 官网 上下载并安装它。安装完成后&#xff0c;npm&…

算法之Eigen库

Eigen库是用于线性代数运算的C++模板库,提供了矩阵、向量、数值求解器等线性代数相关算法的实现。以下是Eigen库的一些基本用法示例: 1. 安装Eigen库 首先,你需要下载并安装Eigen库。你可以从Eigen的官方网站上获取最新版本:Eigen官方网站 2. 定义矩阵和向量: #includ…

sqlalchemy查询数据为空,查询范围对应的数据在数据库真实存在

记录一个开发过程遇到的小bug&#xff0c;构造些伪数据还原并解释。 """ 场景&#xff1a;传参触发了查询条件&#xff0c;数据库中是存在传参对应范围的数据&#xff0c;但是通过查询条件得到的查询结果为空 """ 入参场景一&#xff1a; start_…

修复img实际有正确的链接,但是不显示 (chrome 插件保存的html)--google镜像chatgpt

打开目标html文件 chrome 控制台 执行以下脚本 //删除侧边栏 $x("//div[idsidebar]")[0].remove();//修复img实际有正确的链接&#xff0c;但是不显示 (chrome 插件保存的html&#xff09; //img.data-savepage-src 复制到 img.src imgs$x("//img"); imgs…

小黑完成了最后一节健身课,顺利完成了跳绳比赛,乘飞机到达南京准备第二天领物资和南京城内闲逛的leetcode之旅:215. 数组中的第K个最大元素

小黑代码 class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:# 数组长度n len(nums)nums list(map(lambda x:-x, nums))q []for i in range(n):heapq.heappush(q, nums[i])# 出堆target -1for i in range(k):target heapq.heappop(q)return -…

Java Web——TomcatWeb服务器

目录 1. 服务器概述 1.1. 服务器硬件 1.2. 服务器软件 2. Web服务器 2.1. Tomcat服务器 2.2. 简单的Web服务器使用 1. 服务器概述 服务器指的是网络环境下为客户机提供某种服务的专用计算机&#xff0c;服务器安装有网络操作系统和各种服务器的应用系统服务器的具有高速…

《向量数据库指南》——2023云栖大会现场,向量数据库Milvus Cloud成关注焦点

近期,广受关注的2023 云栖大会正式收官,来自全球各地的开发者集聚一堂,共同探索 AI 时代的更多可能性。 云栖大会是由阿里巴巴集团主办的科技盛宴,是中国最早的开发者创新展示平台。据悉,今年云栖大会的主题为“计算,为了无法计算的价值”,共吸引了全球 44 个国家和地区…

Qt DragDrop拖动与放置

本文章从属于 Qt实验室-CSDN博客系列 拖放操作包括两个动作&#xff1a;拖动(drag)和放下(drop或称为放置)。 拖动允许 对于要拖出的窗口或控件&#xff0c;要setDragEnabled(true) 对于要拖入的窗口或控件&#xff0c;要setAcceptDrops(true) 下面以一个具体的用例进行说…

Neo4j数据库介绍及简单使用

图数据库介绍 图数据库是一种专门设计用于存储和管理图形数据的数据库类型。在图数据库中&#xff0c;数据以图的形式表示&#xff0c;其中节点表示实体&#xff0c;边表示实体之间的关系。这种表示方式非常适合处理具有复杂关系的数据&#xff0c;如社交网络、推荐系统、网络…