MPEG4Extractor

1、readMetaData 必须要找到 Moov box,找到 Mdat box或者 Moof box,并且创建了 ItemTable

大端

box 分为 box header 和 box content:
box header由8个字节组成,前面四个字节表示这个box 的大小(包含这个头的8字节)
box size有3中可能,第一种是正常大小,读出来就是box的大小 (这里是包含box header 的 8个字节的)
第二种box size 为 1,说明这个box 大小是 large size,也就是所说的 mdat box(数据)
box size 为 0 时,表示box是文件的最后一个box(这个box的大小需要用文件的大小减去偏移量得到)

紧接着的是 4个字节的 box typebox content 大小:正常大小时,box content size = size -8box size 为 1时,需要继续往后读8位,这就是 mdat 中数据的长度

ftyp:无关紧要

moov:包含有文件媒体的元数据信息,这是一种嵌套盒子(必须且只能有一个 moov box)
mvhd box:movie header box,描述了具体音频或视频流无关的文件整体信息,duration为媒体时长和timescale为时长单位。具体的文件多长需要用这里的duration / timescale
由于这是个嵌套盒子,所以里面会有递归解析的步骤

trak: 包含了该track的媒体数据的引用和描述
tkhd: track header , 存储有 track 头信息(包含track-id,用于显示的宽高(display-width/display-height))
mdia:track media structure 描述了这条音视频track的媒体数据样本的主要信息
mdhd:media header,存储有media track 信息,但是和 tkhd中的信息是不一样的,这里可以读取到 track 的duration ,以及对应的 timescale,文件时长依旧使用 duration / timescale 计算
hdlr:
minf(media info):
vmhd(video media handler type):对应的还有 smhd,用于记录 audio type
dinf(data information):
stbl(sample table):检查到有这个box,则会当前 trak 建立sample table
stsd:子box用于存储当前track的编码类型,以及解码所需要的信息,重要的是解析内部的盒子
hvc1/av01/avc1:类似于这些box,box名称也就是编码类型,一般box里面会有视频的宽高,如果是 AVC/HEVC 这种,里面还会嵌套有avcC这种信息,这些都是解码需要的信息,不同的类型解析方式会有点不一样。
stss:sync sample box,这个box中存储的是关键帧的序号,这个box的第四到八字节表示关键帧的数量,所有的关键帧的偏移量都以uint32 的形式存储在后面的数据中,读出以后需要按照4个字节来划分出来(如果没有这个表,那么说明每个samp都是关键帧,或者说是一个随机存取点)
stts:setTimeToSampleParams 这个box中存储了每个sample以及其对应的duration,和上面的box 类似,第四到八个字节表示 sample的数量,之后的属于以 sampleNumber–duration的形式排列;
stsz:set sample size,里面记录的是每个sample的大小
stsc:setSampleToChunkParams,用chunk组织sample可以方便优化数据获取,一个thunk包含一个或多个sample。“stsc”中用一个表描述了sample与chunk的映射关系,查看这张表就可以找到包含指定sample的thunk,从而找到这个sample。
stco:setChunkOffsetParams,定义了每个chunk在媒体流中的位置
ctss:

mdat:数据放在这个box中,帧信息放在 stbl 中

数据如何构建:

数据如何读取:mp4 中的数据都是放在 mdat box中的(而且audio和video混在一起),我们想要读取一帧数据,那么就要知道数据的 offset,size,以及其对应的pts,我们应该如何获取这些内容呢?
首先我们要知道需要读取的哪一帧,这里会有两种情况,一种是seek跳跃读取,另一种就是顺序读取:
seek:需要根据时间查找对应的关键帧,拿到该帧的索引
顺序读取:记录当前读到的帧的索引

读取该帧索引的信息,例如偏移量,大小,是否为关键帧,帧的时间长度。这里的问题是应该如何根据帧索引获取这些信息呢?
首先要根据帧索引找到对应的 Chunk 索引和chunk 的偏移量,根据索引在chunk中的位置,计算sample的偏移量,再根据stsz 和 stts box中的信息读取到sample 大小和 持续时长

在这里插入图片描述

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

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

相关文章

【Docker】Docker基础

文章目录 安装使用帮助启动命令镜像命令容器命令 安装 # 卸载旧版本 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine # 设置存储库 sudo yum install -y yum-utils …

QT自定义信号和槽

信号和槽 介绍实现创建文件对teacher的h和cpp文件进行处理对student的h和cpp文件进行处理对widget的h和cpp文件进行处理 介绍 Qt中的信号和槽是一种强大的机制,用于处理对象之间的通信。它们是Qt框架中实现事件驱动编程的核心部分。 信号(Signal&#x…

pgAdmin和asdf postgres的安装

安装pgAdmin: curl https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo apt-key addsudo sh -c echo "deb https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/$(lsb_release -cs) pgadmin4 main" > /etc/apt/sources.list.d/pgadmi…

MyBatisPlus学习一:快速入门

前言 前面快速学习了Mybatis,现在开始快速学习MyBatisPlus 学习教程: 黑马mybatis教程全套视频教程,2天Mybatis框架从入门到精通 黑马程序员最新MybatisPlus全套视频教程,4小时快速精通mybatis-plus框架 简介 MyBatisPlus 是…

使用AutoDecoder自动解码器实现简单MNIST特征向量提取

AutoDecoder 自动解码器(AD)是论文"DeepSDF: Learning Continuous Signed Distance Functions for Shape Representation" 中使用的一种方法,与传统编码-解码结构不同,AD无编码器,仅有一个解码器。解码器实…

K-means 聚类算法分析

算法简述 K-means 算法原理 我们假定给定数据样本 X ,包含了 n 个对象 ,其中每一个对象都具有 m 个维度的属性。而 K-means 算法的目标就是将 n 个对象依据对象间的相似性聚集到指定的 k 个类簇中,每个对象属于且仅属于一个其到类簇中心距离…

Python中调用matplotlib库三维可视化图像像素曲面分布

为了更直观的从3D视角观察一副图像的像素分布,且拖动观察没一个像素细节,可以使用下面代码实现。 目录 一、代码二、效果展示 一、代码 使用代码修改修改的地方如下: 具体实现代码如下: import numpy as np import matplotlib.pyplot as …

windows系统如何查看扇区?

windows系统如何查看扇区? 首先,我们按WindowsR 弹出"运行"对话框,打开文本框输入"MSINFO32.EXE"命令 展开左侧"组件"节点 接下来,我们选择"组件|存储|磁盘"文件夹 在其里面即可查看硬盘…

欧科云链研究院:奔赴2024,Web3与AI共振引爆数字时代潘多拉魔盒

出品|欧科云链研究院 2024年,Web3与AI两个数字科技的巅峰碰撞,欧科云链研究院探索AI与Web3的技术融合,与澎湃科技联合发布2024年展望,原标题为《2024年展望:Web3与AI共振引爆可信数字社会》,共…

Linux系统下gitee使用git提交代码

Linux系统下gitee使用git提交代码 一、安装配置git1.1 在 Linux 中安装 git,并生成授信证书1.2 将SSH key 添加到 ssh-agent1.2 将SSH key 添加到你的gitee账户 二、gitee 的使用2.1 下载项目到本地 三、上传gitee三步走3.1 三板斧第一招:git add3.2 三板…

编译原理期末大题步骤——例题

一、预测分析方法步骤 提取左公因子,消除左递归判断文法是否为LL(1)文法若是,构造预测分析表;否则,不能进行分析。根据预测分析表对输入串进行分析 例子: 文法G[E]: …

【Python】不一样的Ansible(一)

不一样的Ansible——进阶学习 前言正文概念Ansible CorePlugins和Modules 插件插件类型编写自定义插件基本要求插件选项文档标准编写插件 添加一个本地插件注册为内置插件指定插件目录 其他一些技巧更改Strategy 结语 前言 Ansible 是一个极其简单的 IT 自动化引擎&#xff0c…

ros gazebo机械臂仿真,手动控制与MoveIt自动控制

本文总结归纳古月居胡春旭ros机械臂教程,给出了一些error的解决方法,补充了通过python运行moveit。十分建议去看github huchunxu源代码的repository。 创建机械臂的xacro模型 首先创建一个工作空间,在工作空间中创建arm_description功能包。…

GitHub 一周热点汇总 第4期 (2024/01/01-01/06)

GitHub一周热点汇总第四期 (2023/12/24-12/30),梳理每周热门的GitHub项目,了解热点技术趋势,掌握前沿科技方向,发掘更多商机。2024年到了,希望所有的朋友们都能万事顺遂。 说明一下,有时候本周的热点项目会…

【HarmonyOS4.0】第三篇-类web开发模式

【HarmonyOS4.0】第三篇-类web开发模式 一、鸿蒙介绍 课程核心 为什么我们需要学习鸿蒙? 哪些人适合直接转鸿蒙? 鸿蒙系统优势是什么? 课程内容 (1)为什么要学习鸿蒙 从行情出发: 美国商务部长访问中国,2023年…

【Java并发】深入浅出 synchronized关键词原理-下

上一篇文章,简要介绍了syn的基本用法和monter对象的结构,本篇主要深入理解,偏向锁、轻量级锁、重量级锁的本质。 对象内存布局 Hotspot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据 (Instance Da…

【Sublime Text】| 02——常用插件安装及配置

系列文章目录 【Sublime Text】| 01——下载软件安装并注册 【Sublime Text】| 02——常用插件安装及配置 失败了也挺可爱,成功了就超帅。 文章目录 1. 汉化2. 更换颜色主题3. 更改编码插件—ConvertToUTF84. 对齐插件—Alignment5. 括号高亮插件—BracketHighligh…

win11修改本地hosts,自定义域名

目录 🧈1.打开指定目录 🥚2.粘贴至桌面 🍳3.添加自己的域名和对应的ip地址 🍿4.替换原来的hosts文件 1.打开指定目录🧂🧂 在C盘下打开 --------C:\Windows\System32\drivers\etc,找到hos…

众和策略:沪指跌0.91%险守2900点,半导体、金融等板块走低

8日早盘,两市股指低开低走,沪指一度失守2900点,深成指、创业板指跌约1%,科创50指数创前史新低。 到午间收盘,沪指跌0.91%报2902.4点,深成指跌1.17%,创业板指跌0.99%,科创50指数跌超…

vue3中使用elementplus中的el-tree-select,自定义显示名称label

<el-tree-select v-model"addPval" node-key"id" :data"menulists" :render-after-expand"false" :props"menuProps" /> <el-divider />let menuProps {//自定义labellabel: (data: { name: any; }) > {ret…