还是感谢任老师提供的设备可以让我进行一个研究。
本来是想看硬件组成的,但是全打胶了,看不了一点,值得学习,也值得被骂,一点没有维修的机会,扣开就凉了。
表面使用的是尼龙框架
先看一下使用吧,第一次做视频,轻喷,我还加了字幕方便静音观看。
这个是导出的眼动数据
看这里,还得学深度学习啊,学!
我逆向也一般,这次这个APP没有加固,所以就可以直接简单的分析了,我安卓写的也一般,但是看个结构还是可以的,下面的就是分析出来里面打包进去的二进制库,可以看到ZeroMQ,以及USB,其实视频里面说的没有神经网络是不对的,分析显示是有高通的神经网络库( Qualcomm 公司的骁龙神经处理引擎 (SNPE) 库,用于在移动设备上加速机器学习推理),还有就是jpeg是压缩图像的,特别的其实还有DSP的库,在后面的分析来看是进行滤波操作的。
比较感慨,虽然APK不大,但是代码量很足,首先是硬件,通过USB来适配自己的硬件设备,可以进行固件升级,摄像头的参数控制等。内置了局域网的流控制,就是可以在电脑上面控制手机的APP,获得视频流什么的。这个是使用ZeroMQ来实现的,还有高效的播放系统,针对及时渲染,后处理,以及单独的硬件和流视频传输都对应了不同的渲染器。
这个视频流好评,有浏览器就可以。还有固件升级也是通过USB可以完成,好评。一个APP就好像是一个枢纽一样,可以承担很多任务。
这样的
追踪一角
下面是滤波器和数据转换的一部分代码:
在这里
初始化: 初始化一个
sum
向量,用于累加卷积的结果。条件判断:
如果纹理坐标在图像的左上角附近,则进行卷积操作。
如果纹理坐标在图像的右下角附近,则直接采样当前纹素。
否则,将红色通道设置为 1.0。
卷积操作: 通过循环遍历卷积核,计算加权平均值,实现卷积效果。
颜色调整: 将
uColorAdjust
添加到最终结果。输出: 将计算得到的颜色值赋值给
gl_FragColor
,作为输出。
实现了一个简单的YUV到RGB的转换,并提供了亮度调整的功能。它可以用于处理摄像头采集到的YUV图像数据,并将其显示在屏幕上。
这个代码是日本写的。
还有一段是:主要用于将RGB565格式的YUV数据转换为RGB格式,并在转换过程中进行亮度调整。不同于之前的代码,这次的YUV数据是打包成RGB565格式存储在纹理中。
这个是和硬件相关的代码,主要是云服务,时间戳对齐,以及上代的支持,还有发布,录制,rtp传输,以及USB,mic和IMU等。这个工程量不小啊。
时间同步
客户端创建一个
ITimeSyncCallback
对象。客户端调用
ITimeSync
接口的a()
方法,将回调对象传递给服务器端。服务器端的
Stub
对象收到回调对象,并将其保存。当需要通知客户端时间同步时,服务器端调用回调对象的相应方法。
消息发布
创建
RtpPublishController
对象,并设置传感器对象。调用
b()
方法开始发布数据流。传感器数据更新时,会调用
a(Object obj)
方法,触发更新数据流。RtpPublishController
内部会控制发布的数据流数量。调用
b()
方法停止发布数据流
因为后处理是很重要的事情,所以一定要保证录好,看门狗
启动服务时,会初始化一些变量并创建定时任务。
定时任务会循环检查正在录制的 URI 的文件大小,如果 30 秒内没有变化,则认为录制异常。
录制异常时,会触发振动和发送通知。
可以通过广播控制服务的行为,例如停止通知、停止录制等。
因为是输出多个文件,还要上传到云,所以也要不停的做限制
该代码使用了轮询的方式来检查录制文件的大小,可能会有一定的性能损耗。
代码针对 OnePlus 8 Pro 手机做了特殊处理,因为该机型可能存在文件修改时间不准确的问题。
这个挺重要的
该类用于发布传感器数据帧
创建
AbstractBufferPublisher
对象时,会初始化一些变量,例如发布控制器、数据流名称、数据帧大小等。调用
start()
方法启动数据发布,会设置当前状态为正在运行、清空帧数据缓存区并创建两个空帧数据。调用
stop()
方法停止数据发布,会设置当前状态为停止运行并清空帧数据缓存区。调用
release()
方法释放资源,会调用stop()
方法停止数据发布并释放一些内部资源。a(int i)
方法用于获取一个帧数据,它会尝试从缓存区获取空闲帧数据,如果缓存区为空,则会根据需要创建新的帧数据。recycle(FrameData frameData)
方法用于回收一个帧数据,它会将该帧数据放入缓存区。a(ByteBuffer byteBuffer)
方法可以计算数据帧的 MD5 哈希值,用于数据校验 (非必须)。
哭
检查相机名称是否属于黑名单设备列表 (例如,PI World Cam)。这个就是垄断的一种做法,有人可能会想插个摄像头不使用专有硬件,来避免这些。
管理不同类型摄像头的设置和配置
其实可以控制的不多,就是一个曝光
里面使用的IMU是这个
IIC接口
这个LED和MIC以及IMU都是在这个芯片上面挂着
计算机能直接与这些设备和传感器通信
这是代码的逻辑
可以看到接口上面有着IIC和USB
这样的
这个就是编码器
VP8一会儿有
结束,烦死了,讨厌java
说说最大的硬件,这东西真的是一个传感器的集合体,三个摄像头,一个IMU,以及麦克风,这些都是使用了IIC接口,所以硬件里面有个USB的桥接器。另外我觉得还有一个FPGA来连接三个摄像头:
就是这样,然后FPGA里面有拼接视频的功能
非常小
后面
这样的
前面
上面,看着旁边是PUYA
啊?
我觉得应该是这个flash,给fpga搭配的,因为任务还是有的,MIPI和拼接。
然后通过FPC来连接,害,还是没有看到
这个是USB端可以控制的一个增益
嗯呐
证明拼接后输出
大小
Y8 格式: 这是一种灰度格式,每个像素由一个 8 位的值表示。
其它信息,这些都是我探查的
电脑端是模拟成了一个USB设备UVC的,可以使用Core软件
更加详细的数据,这里有一个USB的转换芯片
实锤是FPGA,这个也要学,就是做了拼接
里面再一个Hub上面,有两个相机,第一个有摄像头和HID,就是我说的IMU和MIC,下面就是一个摄像头。
这个是世界相机
输出的是注视数据-这个是机内计算的
还有瞳孔变化
这个应该是它们只拿到了一加的内部SDK,可以做加速
高通的
这个是通过IIC控制的速率
代码里面还有对机器的辨认,就是说就得自己选择的机器才行,摩托罗拉和一加
滤波器的选择
路太长了。
欢迎交流
https://docs.pupil-labs.com/neon/data-collection/transfer-recordings-via-usb/
https://blog.csdn.net/Ximerr/article/details/123498701
https://git-scm.com/download/win