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 大小和 持续时长
相关文章:

MPEG4Extractor
1、readMetaData 必须要找到 Moov box,找到 Mdat box或者 Moof box,并且创建了 ItemTable 大端 box 分为 box header 和 box content: box header由8个字节组成,前面四个字节表示这个box 的大小(包含这个头的8字节&a…...

我在工作一年时怎么都看不懂的编程写法。今天手把手教给你
作为一名程序员,你一定遇到或亲自写过这样的代码。有人将它形象的形容为shi山,或者被戏称为“面向保就业编程”。 以下面这个代码为例,其中的问题也显而易见,当越来越多的条件判断时,代码会变得非常臃肿,难…...

ThinkPHP5多小区物业管理系统源码(支持多小区)
基于 ThinkPHP5 Bootstrap 倾力打造的多小区物业 管理系统源码,操作简单,功能完善,用户体验良好 开发环境PHP7mysql 安装步骤: 1.新建数据库db_estate,还原数据db_estate.sql 2.修改配置文件:application/database.php 3.运…...

2024 年 API 安全:预测和趋势
随着技术以前所未有的速度不断进步,API(应用程序编程接口)安全性的复杂性也随之增加。随着 API 在现代应用程序和服务中的激增,组织将需要更好地了解其 API 环境以及 API 给运营带来的风险。 到 2024 年,预计几个关键…...

3D模型UV展开原理
今年早些时候,我为 MAKE 杂志写了一篇教程,介绍如何制作视频游戏角色的毛绒动物。 该技术采用给定的角色 3D 模型及其纹理,并以编程方式生成缝纫图案。 虽然我已经编写了一般摘要并将源代码上传到 GitHub,但我在这里编写了对使这一…...

SPL-cmcRVFL+
吐槽 作者未提供代码,还有图1敢再糊点吗?...

Vue3+TS+Vite 构建自动导入开发环境
关注⬆️⬆️⬆️⬆️ 专栏后期更新更多前端内容 在一个使用 Vue 3、Vite 和 TypeScript 的项目中,配置 unplugin-auto-import 和 unplugin-vue-components 插件可以极大地提高开发效率,因为它们可以自动导入 Vue 相关的 API 和 Vue 组件,从而减少了手动导入的需要。 文章目…...

长期使用外接键盘,外物压着自带键盘,容易导致华硕飞行堡垒FX53VD键盘全部失灵【除电源键】
华硕飞行堡垒FX53VD键盘全部失灵【除电源键】 前言一、故障排查二、发现问题三、使用方法总结 前言 版本型号: 型号 ASUS FX53VD(华硕-飞行堡垒) 板号:GL553VD 故障情况描述: 键盘无法使用,键盘除开机键外…...
JavaScript-循环嵌套断点调试-笔记
1.do...while循环 do while语法结构: 循环初始值; do{ //代码; 增量; }while(循环条件); <script> // 输出十句 : 你好世界 var …...

1042: 数列求和3 和 1057: 素数判定 和 1063: 最大公约与最小公倍
1042: 数列求和3 题目描述 求1-2/33/5-4/75/9-6/11...的前n项和,结果保留3位小数。 输入 输入正整数n(n>0)。 输出 输出一个实数,保留3位小数,单独占一行。 样例输入 5 样例输出 0.917 #include<stdio.h> int main(){in…...

[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-8 Bode Plot伯德图
本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-8 Bode Plot伯德图 Bode Plot 手绘技巧与应用...

Java 将Excel转换为TXT文本格式
TXT文件是一种非常简单、通用且易于处理的文本格式。在处理大规模数据时,将Excel转为TXT纯文本文件可以提高处理效率。此外,许多编程语言和数据处理工具都有内置的函数和库来读取和处理TXT文件,因此将Excel文件转换为TXT还可以简化数据导入过…...

什么事“网络水军”?他们的违法活动主要有四种形式
我国治理网络水军,包括造谣引流、舆情敲诈、刷量控评、有偿删帖等各类“网络水军”等违法犯罪活动已经许久。 日前,官方召开新闻发布会,公布了相关的一些案件进程,今年已累计侦办相关案件339起,超过历年的全年侦办案件…...
授权策略(authorize方法)
authorize方法(授权策略的使用示例) $this->authorize(destroy, $status) 要实现这个功能,你需要执行以下步骤: 1、创建一个授权策略: 在Laravel中,授权策略是用于定义用户对特定操作的权限的类。你可…...

FFmpeg获取音视频流信息
文章目录 前言一、需求二、源码三、运行结果 前言 本文记录用 FFmpeg 获取视频流音频流的信息(编码格式、分辨率、帧率、播放时长…),所用的工程基于上个博客编译成功的工程:使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c 一、需求…...
编程语言的走向又将如何呢?
编程语言的未来? 随着科技的飞速发展,编程语言在计算机领域中扮演着至关重要的角色。它们是软件开发的核心,为程序员提供了与机器沟通的桥梁。那么,在技术不断进步的未来,编程语言的走向又将如何呢? 1. 更…...
基于SpringBoot的电影评论网站
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的电影评论网站,java项目…...
粒子群算法优化支持向量SVM的供热量预测,粒子群优化支持向量机SVM回归分析
目录 背影 支持向量机SVM的详细原理 SVM的定义 SVM理论 粒子群算法原理 SVM应用实例,粒子群算法优化支持向量SVM的供热量预测,粒子群优化支持向量机SVM回归分析 代码 结果分析 展望 完整代码:粒子群算法优化支持向量SVM的供热量预测,粒子群优化支持向量机SVM回归分析_lssv…...

【Verilog】运算符
系列文章 数值(整数,实数,字符串)与数据类型(wire、reg、mem、parameter) 系列文章算术运算符关系运算符相等关系运算符逻辑运算符按位运算符归约运算符移位运算符条件运算符连接和复制运算符 算术运算符 …...

浅析ARMv8体系结构:A64指令集
文章目录 A64指令编码格式加载与存储指令寻址模式变基模式前变基模式后变基模式 PC相对地址模式 伪指令加载与存储指令的变种不同位宽的加载与存储指令多字节内存加载和存储指令基地址偏移量模式前变基模式后变基模式 跳转指令返回指令比较并跳转指令 其它指令内存独占访问指令…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...

前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...