视频封装格式

news2024/12/22 19:27:50

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,表示该表是PAT
    unsigned section_syntax_indicator :1  //段语法标志,固定为1
    unsigned zero                     :1  //固定为0
    unsigned reserved_1               :2  //第一个保留位
    unsigned section_length           :12 //表示这个字节之后有用的字节数,包括CRC_32
    unsigned 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分段传输,那么此值每次递增1
    unsigned 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)的PID
        else
            Program_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,此值为0x02
    unsigned Section_syntax_indicator    :1  //置为1
    unsigned '0'                         :1
    unsigned 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包含有相同的PID
        unsigned 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.coloradmin.cn/o/1207507.html

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

相关文章

java 旋转方阵

public static void main(String[] args) {Scanner scanner new Scanner(System.in);// N阶方阵int n scanner.nextInt();// 构建方阵List<List<Integer>> matrix new ArrayList<>();for (int i 0; i < n; i) {List<Integer> row new ArrayLis…

RUST与Python对比分析

1 什么是Rust&#xff1f; Rust 是一种系统编程语言&#xff0c;注重安全性&#xff0c;尤其是并发安全性&#xff0c;支持函数式、命令式和泛型编程范式等多范式语言。Rust 在语法上与 C 类似&#xff0c;但设计者希望在保持性能的同时提供更好的内存安全性。Rust 最初是由 Mo…

集团VPN问题排查及核心交换机(思科C9500)路由编写

前言 昨天发现子公司A无法访问子公司B的服务器。已知之前是可以的。经过tracert及ping的简单排查。发现&#xff0c;A没有经过飞塔200F的防火墙出去。 已知集团使用两套防火墙。思科2110以及飞塔200F。并且在上方都做了VPN的配置。200F承接SD-WAN。 我们知道&#xff0c;当A公…

详述使用CubeMX配置STM32RCC时钟

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言一…

帮助中心干货 | 4步即可快速搭建高效帮助中心

任何一个产品有用户涌入使用之后&#xff0c;都会不可避免地面临一个场景问题&#xff1a;如何及时、高效、便捷地解决用户使用过程中的问题&#xff1f; 在使用某些网站的功能或服务时&#xff0c;用户常常会遇到一些看似简单但没有说明依然可能难以理解的问题。如果问题没有…

linux查看端口占用情况

lsof命令 lsof(list open files)命令可以列出当前系统中打开的所有文件&#xff0c;包括网络端口。可以使用lsof命令查看某个端口被哪个进程占用。 具体的命令为&#xff1a;sudo lsof -i :端口号&#xff0c;其中端口号为需要查询的端口号。 netstat命令 使用netstat命令&a…

Vatee万腾的数字化掌舵:Vatee科技引领未来的新高度

随着数字化时代的到来&#xff0c;Vatee万腾以其卓越的科技决策力成为引领潮流的掌舵者。 Vatee万腾通过对科技前沿的不懈探索&#xff0c;站在了数字化创新的最前沿。其领先的科技团队致力于发掘并应用最新的数字技术&#xff0c;为用户提供卓越的数字化体验。 Vatee万腾以其…

运动耳机哪个牌子好性价比高?运动耳机品牌排行榜前十名

​其实&#xff0c;选择运动耳机并不只是看外观&#xff0c;性能也同样重要。在选择时&#xff0c;我们需要考虑几个关键因素&#xff0c;例如稳固性、舒适度和音质等。这些都是运动耳机必备的要求&#xff0c;因为它们能帮助我们在运动时更加专注于锻炼&#xff0c;而不会被耳…

操作系统——死锁(一文详解死锁,死锁产生的原因和死锁的解决方案)

1、什么是死锁&#xff1f;死锁产生的条件&#xff1f; 1.1、什么是死锁&#xff1f; 答&#xff1a; 在两个或者多个并发进程中&#xff0c;如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源&#xff0c;在未改变这种状态之前都不能向前推进&#xff…

Python:Virtual Environment——venv

文章目录 1 基本信息2 创建虚拟环境3 venv如何工作 1 基本信息 venv支持构建轻量级虚拟环境 包含独立的位于其site文件夹中的python package venv构建在base Python上在虚拟环境中执行pip会将package安装在当前的隔离环境中一个venv包含&#xff1a; 独立的Python解释器、libr…

在线预览编辑PDF::RAD PDF for ASP.NET

RAD PDF for ASP.NET作为功​​能最齐全的基于 HTML 的 PDF 查看器、编辑器和 ASP.NET 表单填充器&#xff0c;RAD PDF 为传统 PDF 解决方案提供了灵活而强大的替代方案。与 Adob​​e Acrobat Reader 不同&#xff0c;RAD PDF 几乎可以在任何现代网络浏览器中运行&#xff0c;…

推荐5款靠谱好用,无广告不流氓的软件

​ 话不多说&#xff0c;直入正题&#xff0c;全都是靠谱好用&#xff0c;无广告不流氓的好软件&#xff0c;可以先点赞收藏&#xff0c;以后慢慢用。 1.视频压缩工具——Moo0 VideoMinimizer ​ Moo0 VideoMinimizer是一款绿色免安装的视频压缩工具&#xff0c;它可以让你轻…

深度学习+opencv+python实现昆虫识别 -图像识别 昆虫识别 计算机竞赛

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数&#xff1a;2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 4 MobileNetV2网络5 损失函数softmax 交叉熵5.1 softmax函数5.2 交叉熵损失函数 6 优化器SGD7 学…

干货!工业级3D开发工具HOOPS的开发环境探讨——3D模型格式转换篇

HOOPS产品主要应用于3D模型的转换、显示、处理和发布&#xff0c;包括HOOPS Exchange、HOOPS Communicator、HOOPS Visualize和HOOPS Publish等4种产品&#xff0c;其中&#xff1a; HOOPS Exchange主要应用于模型的文件格式转换。HOOPS Communicator主要应用于WEB端模型显示。…

百济神州财报解读:第三季度扭亏为盈,胜利来晚了?

短短几年时间&#xff0c;从国产创新药一哥&#xff0c;到如今唯一一家在纳斯达克、港交所、上交所三地上市的生物科技公司&#xff0c;飞速的发展和超强的融资能力&#xff0c;早已让百济神州成为了一面反映“创新药企”发展状况的镜子。 因此&#xff0c;百济神州的业绩也牵…

Python测试开发中Django和Flask框架的区别

在谈Python中Django框架和Flask框架的区别之前&#xff0c;我们需要先探讨如下几个问题。 1、为什么要使用框架&#xff1f; 为了更好地阐述这个问题&#xff0c;我们把开发一个应用的过程进行类比&#xff0c;往往开发一个应用&#xff08;web应用、系统应用&#xff09;跟建…

c#桥接模式详解

基础介绍&#xff1a; 将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。适用于不希望在抽象和实现部分之间有固定的绑定关系的情况&#xff0c;或者类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充的情况。 将抽象部分与实现部分分离&#xff0c;…

动静态库。

gcc去 1、默认路径/usr/include里面去找 2、当前目录去找 但是mymath.h根本不在这里面&#xff0c;所以就报错了 你可以在.c中 #include “./lib/include/” 指明头文件在哪里&#xff0c;但是不推荐 &#xff0c;建议在gcc时处理

求推荐哪个好用的ERP或CRM软件?有ERP、CRM一体化的软件吗?

推荐好用的ERP或CRM软件&#xff1f;那么&#xff0c;有软件能够实现ERP、CRM一体化吗&#xff1f; 当然有&#xff0c;我们公司就在使用这样一个一体化平台。 只要你能够准确地理解业务逻辑&#xff0c;即使没有编程经验和代码基础&#xff0c;也能够利用简道云轻松创建各种…

c++ 经典服务器开源项目Tinywebserver如何运行

第一次直接按作者的指示&#xff0c;运行sh ./build.sh,再运行./server&#xff0c;发现不起作用&#xff0c;localhost:9006也是拒绝访问的状态&#xff0c;后来摸索成功了发现&#xff0c;运行./server之后&#xff0c;应该是启动状态&#xff0c;就是不会退出&#xff0c;而…