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 type

box content 大小:正常大小时,box content size = size -8
			      box 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 大小和 持续时长

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库,子查询

子查询指一个查询语句嵌套在另一个查询语句内部的查询。很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量,也可能是某个集合)进行比较。 例&#…

微信小程序适配方案:rpx(responsive pixel响应式像素单位)

小程序适配单位:rpx 规定任何屏幕下宽度为750rpx 小程序会根据屏幕的宽度自动计算rpx值的大小 Iphone6下:1rpx 1物理像素 0.5css 小程序编译后,rpx会做一次px换算,换算是以375个物理像素为基准,也就是在一个宽度…

通用基础模型+提示词是否能胜过微调模型?医学案例研究

论文链接在末尾 摘要 通用基础模型,如GPT-4,在各种领域和任务中展现出令人惊讶的能力。然而,普遍存在这样一种假设,即它们在没有专业知识深度训练的情况下无法达到专业能力。例如,迄今为止对医学竞赛基准的大多数探索都利用了领域特定的训练,正如在BioGPT和Med-PaLM等项…

基于Python+WaveNet+MFCC+Tensorflow智能方言分类—深度学习算法应用(含全部工程源码)(二)

目录 前言引言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理1)数据介绍2)数据测试3)数据处理 相关其它博客工程源代码下载其它资料下载 前言 博主前段时间发布了一篇有关方言识别和分类模型训练的博客,在读者…

ooTD I 这么精致优雅的套装也太好看了吧

精致到每一个细节的国风套装 领口袖口拼接环保毛条 精美的绣花增添浓重的高级感 外套90白鸭绒填充 敲暖和裙子的门襟处 也是做了定制盘扣,外套和裙子单独来穿也很精致

章鱼网络进展月报 | 2023.11.1-11.30

章鱼网络大事摘要 1、2023年12月,Octopus 2.0 将会正式启动。 2、隐私协议 Secret Network 宣布使用 Octopus Network 构建的 NEAR-IBC 连接 NEAR 生态。 3、Louis 受邀作为嘉宾,在 NEARCON2023 的多链网络主题沙龙中发言:我们依然处于区…

主存储器与CPU的连接

目录 一. 单块存储芯片与CPU的连接二. 多块存储芯片与CPU的连接2.1 位扩展2.2 字扩展2.3 字位扩展 三. 译码器知识点的补充 \quad 一. 单块存储芯片与CPU的连接 \quad \quad \quad 暴露出的引脚都是与CPU连接的 上面这个是88位的存储芯片 我们可以看到有8个字, 每个字的字长是8…

Git提交代码时出现: ‘LF will be replaced by CRLF the next time Git touches it‘

遇到的问题 windows平台进行 git add 时,控制台打印警告 问题分析 1. Dos/Windows平台默认换行符:回车(CR)换行(LF),即’\r\n’ 2. Mac/Linux平台默认换行符:换行(LF&…

imazing正在查找最新的apple mobile device组件

​ Apple Mobile Device是macOS的一个组件,它允许您在Mac上与iOS设备进行无缝连接和通信。因此,无法直接在苹果设备上下载和安装Apple Mobile Device,需要借助管理工具进行下载安装后启动。 如果您需要与iOS设备进行通信和同步,…

javascript实现Stack(栈)数据结构

上一篇文章我们理解了List这种数据结构,知道了它的特点和一些使用场景,这篇文章我们就来看一下栈这种数据结构,这里的栈可不是客栈哦,哈哈 栈其实和List非常像,使用javascript实现都是基于数组来实现 尝试理解Stack …

10 大 Android 手机系统修复软件深度评测

您的新 Android 手机可能因其令人兴奋的性能而印象深刻。然而,随着时间的推移,您可能会发现系统有些地方与以前不太一样。您可能会遇到屏幕无响应、 Android应用程序崩溃、连接问题、电池耗尽等现象。 10 大 Android 手机系统修复软件 好吧,…

【51单片机系列】74HC595实现对LED点阵的控制

本文是关于LED点阵的使用,使用74HC595模块实现对LED点阵的控制。 文章目录 一、8x8LED点阵的原理1.1 LED点阵显示原理1.2 LED点阵内部结构图1.3 开发板上的LED点阵原理图1.4 74HC595芯片 二、使用74HC595模块实现流水灯效果三、 使用74HC595模块控制LED点阵对角线亮…

【数据结构和算法】--- 栈

目录 栈的概念及结构栈的实现初始化栈入栈出栈其他一些栈函数 小结栈相关的题目 栈的概念及结构 栈是一种特殊的线性表。相比于链表和顺序表,栈只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的…

LeetCode力扣每日一题(Java):26、删除有序数组中的重复项

一、题目 二、解题思路 1、我的思路 我一开始的思路是创建一个ArrayList对象,然后将数组中的元素追加到ArrayList中,再通过ArrayList提供的API去解题,但是发现题目中提到了原地删除重复的元素,所以这种方法是行不通的 那就只能…

智能优化算法应用:基于袋獾算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于袋獾算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于袋獾算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.袋獾算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

使用LangSmith来快速学习LangChain

好风凭借力,送我上青云! 什么是LangSmith LangSmith is a platform for building production-grade LLM applications. It lets you debug, test, evaluate, and monitor chains and intelligent agents built on any LLM framework and seamlessly int…

【数据结构】——队列实现二叉树的功能

前言:二叉树的实现方式多种多样,有数组实现满二叉树,有链表实现完全二叉树,今天我们就用队列来实现二叉树。 创建二叉树: typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTre…

人工智能,不止于模型:四步实现完整工作流

工程师越来越多地致力于将人工智能 (AI) 集成到自己的项目和应用中,同时不断着力提升自己的 AI 技能。 面对 AI 问题,工程师首先要了解什么是 AI,以及如何将它纳入当前工作流,这看似简单,实则未必容易。在 Google 中搜…

TechSmith Camtasia 2023 v23.2.0.47710 中文激活授权版(附安装教程+激活补丁)

Camtasia2023破解版是一款非常专业的屏幕录像软件。该软件集屏幕录制和视频剪辑功能于一体的软件,提供屏幕录制、区域录制、摄像头录制等多种录制方式,Camtasia2023版本带来了新的动态背景库、霓虹光标图像、录制语音旁白等多种新功能,适用于…

管理类联考——英语二——真题篇——按题型分类——小作文

文章目录 2023-建议信2022-邀请信2021-邀请信2020-建议信2019-建议信2018-道歉信2017-接受邀请信2016-建议信2015-通知2014-介绍信2013-邀请信 2023-建议信 Part A 47. Directions:   An art exhibition and a robot show are to be held on Sunday, and your friend David …