小米米家智能摄像头mp4多碎片手工恢复案例

小米米家智能摄像头mp4多碎片手工恢复案例

智能摄像头品牌中小米算是绝对的大厂,其采用的方案也是比较成熟比较典型的:日志+截图+1分钟1个文件。小米米家的智能摄像头之前处理过很多,这次来讲一个比较特殊的案例。

故障存储:  32G TF卡   fat32文件系统  簇大小32sec

故障现象:

此卡被格式化后重新使用了很短的时间,生成的文件容量大约578.14MB,剩余空间还有29G(如图1)。

图1:卡的剩余空间还有29G

故障分析:

小米的智能摄像头之前处理过不少,基本上规律如下:

1、1分钟生成一个文件。

  1. 文件格式为MP4,新式摄像头一般使用HVC高清编码。

3、采用的方案是在生成当前MP4文件结构体时,已经在采集新的视频画面数据,此时会导致两个文件碎片交叉,糟糕的是有时候碎片的大小仅仅只有一个簇,即碎片又小又多。

第3条会产生最不愿意看到的情况-----“音视频”数据区交叉,HVC采用的也是压缩算法,其会对采集画面进行量化后压缩,对于压缩来讲就是为了让数据不在松散,所以根本没有任何规律而言(有规律的一定是结构体而不是数据本身),此种情况下恢复难度是很大的,因为就算用CHS零壹视频恢复系列软件,也无法甄别数据区交叉碎片的情况,这个时候只能通过穷举遍历法结合恢复经验来判断。

图2:16.6M的文件碎片数量

可能觉得文件的碎片并不多仅有4个,不要被这个假象所迷惑,因为这个是格式化之后生成的文件,小米智能摄像头这种方案文件的碎片是会随着IO次数的变多而不断增加,后期此方案我们恢复出来的碎片数量最多的是480个,普遍在300个碎片以上。这也就是这个案例的特殊之处:

  1. 块(簇)大小为32SEC,块(簇)是文件系统分配的最小单元,其值越小意味着碎片数量更多,小米常见的块(簇)大小是64SEC;
  2. 文件容量更大,可能是摄像头分辨率更高吧,所以导致文件容量是常见的一倍还要多一点(常见的一般是4M到8M,此案例中文件大小基本是在12M到18M之间),更大的容量意味着需要的块(簇)数量更多,也就意味着碎片是常见案例的几倍甚至十几倍。
  3. 客户指定的时间段区间较大,近一个小时,这个也是之前案例中没有的。

故障处理:

根据这种复杂的情况,通用型的恢复软件是无法恢复的,原理如下:

  1. 删除或者格式化后FAT32或者exfat 都会对FAT表进行清0,清0后存在碎片的文件是无法得到有效的链表的,没有链表就无法得到准确的数据。
  2. 由于文件不连续存放,所以此时通用型恢复软件只能通过目录项中的文件第一簇指针和文件长度,来定位文件头。然后按照连续存放的方式读取,这就导致恢复的文件除了第一簇其它全是错误的。

图3:通用型恢复软件R-Studio新版本增加了文件校验并提示发现存在碎片,文件当然是无法播放的。

但是我们可以使用通用恢复软件来扫描并定位文件的目录,FAT32格式化后只要目录项所在簇没有覆盖就能定位文件的第一个簇,也就是文件头所在,在来定位文件尾,两者之间就是数据区间

由于文件名中就包含了日期和时间所以这个也可以精确定位到客户需要的文件,经过通用软件扫描发现客户要的文件名都在,而且第一簇起始是相对靠中间的,所以恢复的机率还是比较大的。

下边这些话照抄之前的案例,解释的很清楚,就不再码字了 :-) :-) :-)

下图可以看到通用恢复软件只会定位到文件目录所在的第一个簇,也就是文件头所在,但是后边的区域就是直接以长度获取了,所以肯定是不能用的。通过这个方法成功定位了客户所要的时间段,由于是采用裸流,所以计划提取文件头所在的簇,得到第一帧画面,来和客户确定数据。但是发现失败了,因为以一个簇为单位进行提取发现视频帧是不完整的,说明碎片极小可能只有一个簇的大小(可以理解为首帧长度>簇长度)。其原理如图5,第一帧至少有三个DATA分割分别是DATA0~DATA2,注意DATA区本身就是对现实环境抽象化取值再转换成数字化的底层数据其是压缩类数据,没有参考值。另外就是图5中是为了方便介绍用了比较简单的方式,现实中可能DATA1和DATA0会“距离”很远,极端情况下也有可能DATA1位于DATA0之前(这在所有文件系统中都是允许的)。

图4:视频、音频帧数据存在碎片的简略图

经过使用不同的方案反复测试,发现没有比较好的办法应对,但是也找到了此类文件的规律,其采用moov后置方案,基本上可以判断在head和moov之间的数据就是此文件的所有簇列表,现在的问题是需要精确的定位碎片并分离数据,但是用常规的方法却无法做到。

此处不在赘述原理,直接使用“MOOV视频RAW级重组程序“,程序的精度和便利度已经很好了,所以直接处理即可,如果没有此程序,光靠纯粹的手工是一项不可能完成的任务。

处理此案例又对程序做了一些完善:

  1. 增加一个外部存储列表,用于存储当前文件碎片分布信息,这样可以对碎片数量做一个统计;
  2. 优化自动对比方案,提升效率;
  3. 可以引入外部列表进行当前簇的对比,不过经过测试没毛用,因为交叉的碎片都是之前存在后来删除的,意义不大;

图5:MOOV视频RAW级碎片重组程序是恢复此类案例很优秀的助手

下图为恢复效果,40个文件播放没有任何问题,视频帧及音频帧全部正常,40个文件消耗了近两周的时间,恢复的成功再次验证了方案的可行性。

图6:重组好的视频文件

这就是小米米家智能摄像头格式化后重新写入后的恢复方法,对于此类智能摄像头,CHS恢复的效果可以做到取证级---确保每一帧声音、画面都100%正常,目前成功助力过国内各大公检法机构的取证请求,大家在遇到此类问题时,欢迎和我们联系!

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

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

相关文章

Java中的String类的常用方法(对于字符串的常用操作)

目录 一、获取指定索引的字符 二、 获取指定字符或者字符串的索引位置 三、判断字符串是否以指定内容开头或结尾 四、替换指定的字符或者是字符串 五、获取字符串的子串 六、将字符串转换为字符数组 七、比较字符串的内容是否相等 八、连接字符串 九、比较两个字符串的大…

【AIGC】Stable Diffusion的ControlNet参数入门

Stable Diffusion 中的 ControlNet 是一种用于控制图像生成过程的技术,它可以指导模型生成特定风格、内容或属性的图像。下面是关于 ControlNet 的界面参数的详细解释: 低显存模式 是一种在深度学习任务中用于处理显存受限设备的技术。在这种模式下&am…

(2024|ICLR,SVD,软加权正则化,推理时文本嵌入优化)文本到图像扩散模型的图像内容抑制

Get What You Want, Not What You Dont- Image Content Suppression for Text-to-Image Diffusion Models 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 2. 相关工作 3. 方…

【C++】---类和对象(中)默认成员函数 和 操作符重载

前言: 假如一个类中既没有成员变量也没有成员函数,那么这个类就是空类,空类并不是什么都没有,因为所有类都会生成如下6个默认成员函数: 一、构造函数 1、构造函数的定义及其特性 对于日期类对象,我们可…

VBA技术资料MF119:数据验证的添加与删除

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

如何在没有第三个变量的情况下进行两个变量交换大小

昨天我看到了一个很有意思的一个面试题:如何在没有第三个变量的情况下进行两个变量交换大小 大家再在平时进行两个变量交换大小的时候通常会进行将其中的一个赋值给第三个变量,借助第三个变量进行两个变量交换,如下: #include &…

java8-用流收集数据-6

本章内容口用co1lectors类创建和使用收集器 口将数据流归约为一个值 口汇总:归约的特殊情况 数据分组和分区口 口 开发自己的自定义收集器 我们在前一章中学到,流可以用类似于数据库的操作帮助你处理集合。你可以把Java8的流看作花哨又懒惰的数据集迭代器。它们…

Nuxt3+Vue3(Composition API)+TS+Vite+Ant Design Vue 搭建

最近官网搭建选择了nuxtjs,由于框架更新了,其中语法也有很多变化,中间遇到了一些问题点做下总结。 nuxt3官方文档地址:https://nuxt.com/docs/getting-started/installation 安装 在安装Nuxt3之前,你需要保证你的nod…

中科星图——LANDSAT_8/02/T1/RAW的Landsat8_C2_RAW类数据集

数据名称: Landsat8_C2_RAW 数据来源: USGS 时空范围: 2020年1月-2023年3月 空间范围: 全国 数据简介: Landsat8_C2_RAW数据集是经过缩放和校准的辐射亮度产品,按照数据质量划分为T1和T2。数据质量…

进程地址空间

虚拟地址: 引子: 我们在Linux中使用fork函数创建子进程时是否会产生一下几个疑惑。 为什么一个变量id具有两个值? 学习C语言后,我们都知道一个函数是不会返回两个值的,那么我们只能猜测是fork函数return了两次。 事实…

(16)Hive——企业调优经验

前言 本篇文章主要整理hive-3.1.2版本的企业调优经验,有误请指出~ 一、性能评估和优化 1.1 Explain查询计划 使用explain命令可以分析查询计划,查看计划中的资源消耗情况,定位潜在的性能问题,并进行相应的优化。 explain执行计划…

基于Python实现的元宵节猜灯谜兑奖软件源码,输入灯谜序号,获取谜面及谜底

基于Python实现的元宵节猜灯谜兑奖软件源码,输入灯谜序号,获取谜面及谜底 核心代码: import sys from time import sleep import xlrd import os import tkintertable_listA "" table_listB ""filename os.getcwd()&…