人脸解锁设备时出现相机报错
(1)背景分析
这是项目当中实际遇到的问题,如下代码仅用作分析和记录。
现在问题的现象是:刚亮屏大概在2s以内对着人脸一般是能解锁的,但是超过2s之后在对着人脸,是无法解锁成功的。
(2)Log分析
(A)从kernel Log分析
从Log来看,相机模组是有正常上电的,表示相机是有正常启动的。
//cat dev/kmsg | grep ov8856
6,1707232,24357395110,-; (0)[22056:powerOnSensor0]sensor_idx 1, power 1 curr_sensor_name ov8856_mipi_raw, enable list NULL
4,1707233,24357395119,-; (0)[22056:powerOnSensor0]sensor_idx = 1, pin=7, pin_state_on=11, hw_id =2, hctzhb(ov8856_mipi_raw)
4,1707234,24357395135,-; (0)[22056:powerOnSensor0]sensor_idx = 1, pin=5, pin_state_on=7, hw_id =0, hctzhb(ov8856_mipi_raw)
4,1707235,24357395587,-; (0)[22056:powerOnSensor0]sensor_idx = 1, pin=3, pin_state_on=9, hw_id =0, hctzhb(ov8856_mipi_raw)
4,1707236,24357396060,-; (1)[22056:powerOnSensor0]sensor_idx = 1, pin=4, pin_state_on=3, hw_id =0, hctzhb(ov8856_mipi_raw)
4,1707237,24357398161,-; (1)[22056:powerOnSensor0]sensor_idx = 1, pin=6, pin_state_on=9, hw_id =0, hctzhb(ov8856_mipi_raw)
4,1707238,24357400667,-; (1)[22056:powerOnSensor0]sensor_idx = 1, pin=1, pin_state_on=0, hw_id =1, hctzhb(ov8856_mipi_raw)
4,1707239,24357400690,-; (1)[22056:powerOnSensor0]sensor_idx = 1, pin=1, pin_state_on=11, hw_id =1, hctzhb(ov8856_mipi_raw)
4,1707240,24357400698,-; (1)[22056:powerOnSensor0]sensor_idx = 1, pin=2, pin_state_on=0, hw_id =1, hctzhb(ov8856_mipi_raw)
4,1707241,24357400707,-; (1)[22056:powerOnSensor0]sensor_idx = 1, pin=2, pin_state_on=11, hw_id =1, hctzhb(ov8856_mipi_raw)
(B)从main Log分析
D MtkCam/P1NodeImp: [init] +
D MtkCam/P1NodeImp: [init] -I MtkCam/P1NodeImp: [hardwareOps_start] [Cam::1] mpCamIO->init +++
I MtkCam/P1NodeImp: [hardwareOps_start] [Cam::1] mpCamIO->init ---I MtkCam/P1NodeImp: [hardwareOps_start] [Cam::1] mpCamIO->configPipe +++
I MtkCam/P1NodeImp: [hardwareOps_start] [Cam::1] mpCamIO->configPipe ---I MtkCam/P1NodeImp: [hardwareOps_start] [Cam::1] mp3A->start +++
I MtkCam/P1NodeImp: [hardwareOps_start] [Cam::1] mpISP->start +++I MtkCam/P1NodeImp: [hardwareOps_start] [Cam::1] mpCamIO->start +++
I MtkCam/P1NodeImp: [hardwareOps_start] [Cam::1] mpCamIO->start ---
可以看出,相机的Hal P1流程是有正常走的,而我们看一下P1是否有接收到数据。
I MtkCam/P1NodeImp: [setRequest] [Cam::1 R2 S2 E1 D1 O1 #0] [P1::SET][Num Q:2 M:2 F:0 R:0 @0][Type:1 Out:x81 Rec:x0 Raw:0 Cap:0 Exe:1 Flush:x0] Num[2] Ctrl[1]=[ 2 ]
I MtkCam/P1NodeImp: [setRequest] [Cam::1 R3 S3 E2 D1 O1 #1] [P1::SET][Num Q:3 M:3 F:1 R:1 @0][Type:1 Out:x81 Rec:x0 Raw:0 Cap:0 Exe:1 Flush:x0] Num[3] Ctrl[1]=[ 3 ]
I MtkCam/P1NodeImp: [setRequest] [Cam::1 R4 S4 E3 D1 O1 #1] [P1::SET][Num Q:4 M:4 F:2 R:2 @0][Type:1 Out:x81 Rec:x0 Raw:0 Cap:0 Exe:1 Flush:x0] Num[4] Ctrl[1]=[ 4 ]
I MtkCam/P1NodeImp: [setRequest] [Cam::1 R5 S5 E4 D2 O2 #0] [P1::SET][Num Q:5 M:5 F:3 R:3 @0][Type:1 Out:x81 Rec:x0 Raw:0 Cap:0 Exe:1 Flush:x0] Num[5] Ctrl[1]=[ 5 ]
I MtkCam/P1NodeImp: [setRequest] [Cam::1 R6 S6 E5 D3 O3 #1] [P1::SET][Num Q:6 M:6 F:4 R:4 @0][Type:1 Out:x81 Rec:x0 Raw:0 Cap:0 Exe:1 Flush:x0] Num[6] Ctrl[1]=[ 6 ]
I MtkCam/P1NodeImp: [setRequest] [Cam::1 R7 S7 E6 D4 O4 #0] [P1::SET][Num Q:7 M:7 F:5 R:5 @0][Type:1 Out:x81 Rec:x0 Raw:0 Cap:0 Exe:1 Flush:x0] Num[7] Ctrl[1]=[ 7 ]
I MtkCam/P1NodeImp: [setRequest] [Cam::1 R8 S8 E7 D5 O5 #0] [P1::SET][Num Q:8 M:8 F:6 R:6 @0][Type:1 Out:x81 Rec:x0 Raw:0 Cap:0 Exe:1 Flush:x0] Num[8] Ctrl[1]=[ 8 ]
//异常Log
I MtkCam/P1NodeImp: [setRequest] [Cam::1 R9 S9 E8 D6 O6 #0] [P1::SET][Num Q:9 M:9 F:-1 R:-1 @0][Type:3 Out:x82 Rec:x0 Raw:0 Cap:0 Exe:1 Flush:x0] Num[9] Ctrl[1]=[ 9 ]
I MtkCam/P1NodeImp: [setRequest] [Cam::1 R10 S10 E9 D7 O7 #0] [P1::SET][Num Q:10 M:10 F:-1 R:-1 @0][Type:3 Out:x82 Rec:x0 Raw:0 Cap:0 Exe:1 Flush:x0] Num[10] Ctrl[1]=[ 10 ]
从上面的Log可以看到,当超过7 frames之后,P1并不是真正的在出帧了,而是P1在做垫帧,我们在来看一下P2是否有接收到数据。
D MtkCam/P2/StreamingNode: [init+] P2S cam 1:
D MtkCam/P2/StreamingNode: [init-] P2S cam 1:D MtkCam/P2/StreamingNode: [config+] P2S cam 1:
D MtkCam/P2/StreamingNode: [config-] P2S cam 1:D MtkCam/P2/StreamingProcessor: [onThreadStart+] P2S cam 1:
D MtkCam/P2/StreamingProcessor: [onThreadStart-] P2S cam 1:
可以看出,相机的Hal P2流程也是有正常走的,而我们看一下P2是否有接收到数据。
D MtkCam/P2/MWFrameRequest: [printIOMap] P2S cam 1 MWFrame:#0 MWReq:#0, frame 1 : iomap: [0]=>img[1/1], meta[3/2], fps[0.00]
D MtkCam/P2/MWFrameRequest: [printIOMap] P2S cam 1 MWFrame:#1 MWReq:#1, frame 2 : iomap: [0]=>img[1/1], meta[3/2], fps[30.30]
D MtkCam/P2/MWFrameRequest: [printIOMap] P2S cam 1 MWFrame:#2 MWReq:#2, frame 3 : iomap: [0]=>img[1/1], meta[3/2], fps[29.41]
D MtkCam/P2/MWFrameRequest: [printIOMap] P2S cam 1 MWFrame:#3 MWReq:#3, frame 4 : iomap: [0]=>img[1/1], meta[3/2], fps[28.85]
D MtkCam/P2/MWFrameRequest: [printIOMap] P2S cam 1 MWFrame:#4 MWReq:#4, frame 5 : iomap: [0]=>img[1/1], meta[3/2], fps[29.63]
D MtkCam/P2/MWFrameRequest: [printIOMap] P2S cam 1 MWFrame:#5 MWReq:#5, frame 6 : iomap: [0]=>img[1/1], meta[3/2], fps[29.76]
D MtkCam/P2/MWFrameRequest: [printIOMap] P2S cam 1 MWFrame:#6 MWReq:#6, frame 7 : iomap: [0]=>img[1/1], meta[3/2], fps[28.99]
从Log来看,P2也是只接收到7 frames,就再也没收接收到Request请求了。
(3)根本原因
以上种种分析可以看到,实际上Hal只接受到了7frames的request,那我们看一下实际是否是这样的呢?通过搜索ULog发现:
D ULog : R AppRequest:0 M[CameraDevice:187001] + :mtkcam-dev3 #1990
D ULog : R AppRequest:1 M[CameraDevice:187001] + :mtkcam-dev3 #1993
D ULog : R AppRequest:2 M[CameraDevice:187001] + :mtkcam-dev3 #1994
D ULog : R AppRequest:3 M[CameraDevice:187001] + :mtkcam-dev3 #1995
D ULog : R AppRequest:4 M[CameraDevice:187001] + :mtkcam-dev3 #1996
D ULog : R AppRequest:5 M[CameraDevice:187001] + :mtkcam-dev3 #1998
D ULog : R AppRequest:6 M[CameraDevice:187001] + :mtkcam-dev3 #2000D ULog : R AppRequest:0 M[CameraDevice:187001] - :mtkcam-AppStreamMgr #1997
D ULog : R AppRequest:1 M[CameraDevice:187001] - :mtkcam-AppStreamMgr #1999
D ULog : R AppRequest:2 M[CameraDevice:187001] - :mtkcam-AppStreamMgr #2001
D ULog : R AppRequest:3 M[CameraDevice:187001] - :mtkcam-AppStreamMgr #2002
D ULog : R AppRequest:4 M[CameraDevice:187001] - :mtkcam-AppStreamMgr #2003
D ULog : R AppRequest:5 M[CameraDevice:187001] - :mtkcam-AppStreamMgr #2004
D ULog : R AppRequest:6 M[CameraDevice:187001] - :mtkcam-AppStreamMgr #2005
实际上层只发送了7 frames的request。所以才造成P1和P2都只有7 frames的有效数据。
通过排查Log报错发现,有以下Error:
06-05 13:59:11.621877 829 15363 E HidlCamera3-Device: processBatchCaptureRequests: Transaction error: Status(EX_TRANSACTION_FAILED): 'FAILED_TRANSACTION: '
06-05 13:59:11.621932 829 15363 E Camera3-Device: Camera 1: sendRequestsBatch: RequestThread: Unable to submit capture request 7 to HAL device: Broken pipe (-32)
可以看到是Framework层发送request报错了,从而导致request无法下到Hal。那引起发送request失败的原因是什么?我们在从Log中发现如下:
W C3Dev-1-ReqQueu: type=1400 audit(0.0:649): avc: denied { use } for path="anon_inode:sync_file" dev="anon_inodefs" ino=6816 scontext=u:r:mtk_hal_camera:s0 tcontext=u:r:hal_face_default:s0 tclass=fd permissive=0
看起来像是avc权限导致的,我们使用setenforce 0测试一下发现确实这里就是根本原因了。
相关文章:
人脸解锁设备时出现相机报错
(1)背景分析 这是项目当中实际遇到的问题,如下代码仅用作分析和记录。 现在问题的现象是:刚亮屏大概在2s以内对着人脸一般是能解锁的,但是超过2s之后在对着人脸,是无法解锁成功的。 (2&#…...

【广州华锐互动】利用VR开展工业事故应急救援演练,确保救援行动的可靠性和有效性
在工业生产中,事故的突发性与不可预测性常常带来巨大的损失。传统的应急演练方式往往存在场地限制、成本高、效果难以衡量等问题。然而,随着虚拟现实(VR)技术的快速发展,VR工业事故应急救援演练应运而生,为…...

还不知道数据类岗位的相关技能和职责吗?涤生大数据告诉你(二)
续接上文:还不知道数据类岗位的相关技能和职责吗?涤生大数据告诉你(一) 1.数据治理工程师 工作职责 数据治理工程师的工作职责主要包括以下几个方面: 1. 数据管理策略制定:制定和实施数据管理策略&#…...

常见应用层协议
一.HTTP(超文本传输协议) HTTP 和 HTTPS 二.FTP(文件传输协议) 三.SMTP(简单邮件传输协议) 四.POP3(邮局协议版本3) 五.IMAP(互联网消息访问协议) 六.DNS&am…...
解决docker容器无法关闭的问题
一般正常关闭: docker stop 容器ID解决方法 方法1:强制停止docker kill 容器ID方法2:直接重启dockersudo service docker stop方法3:直接删除容器,重新创建docker rm -f my_container...

2023-09-27 LeetCode每日一题(餐厅过滤器)
2023-09-27每日一题 一、题目编号 1333. 餐厅过滤器二、题目链接 点击跳转到题目位置 三、题目描述 给你一个餐馆信息数组 restaurants,其中 restaurants[i] [idi, ratingi, veganFriendlyi, pricei, distancei]。你必须使用以下三个过滤器来过滤这些餐馆信息…...

梯度下降法(SGD)原理
目录 梯度下降法(SGD)原理:求偏导 1. 梯度(在数学上的定义) 2. 梯度下降法迭代步骤 BGD批量梯度下降算法 BGD、SGD在工程选择上的tricks 梯度下降法(SGD)原理:求偏导 1. 梯度(在数学上的定义) 表示某一函数在该点处的方向导数沿着该方向取得最大值…...

QQ表情包存储位置解析
一些常见的设备和系统的QQ表情包存储位置: Windows系统: 路径:C:\Users[用户名]\Documents\Tencent Files[QQ号码]\Image\Image\CustomFace 在这个文件夹中,您可以找到所有自定义的QQ表情包。 Android系统: 路径&am…...

软件架构的演化和维护
软件架构的演化和维护 定义 定义 顶不住了,刷题去了,不搞这个了,想吐。。。...

C语言数组和指针笔试题(四)(一定要看)
目录 二维数组例题一例题二例题三例题四例题五例题六例题七例题八例题九例题十例题十一 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒个人主页 🥸🥸🥸C语言 🐿️…...

FragmentManager is already executing transactions
本文解决问题: java.lang.IllegalStateException: FragmentManager is already executing transactions 问题背景描述: 在Fragment中 用tablayoutviewpagerfragment,即Fragment嵌套Fragment场景、或者ViewPager2嵌套ViewPager2时。 执行生命…...

Matlab中clear,close all,clc功能详细说明
背景: 我们在写matlab程序时,首行总是先敲入:clear; close all; clc;,但你真的知道这三句话的具体作用嘛,下面进行详细说明和演示。 一、clear的功能 clear的功能:清理工作区变量,不清理前是…...

Typora安装无需破解免费使用
Typora简介: 在介绍Typora软件之前,需要先介绍一下MARKDOWN。 MARKDOWN是一种轻量型标记语言,它具有“极简主义”、高效、清晰、易读、易写、易更改纯文本的特点。 Typora 是一款支持实时预览的 Markdown 文本编辑器。它有 OS X、Windows、…...
LuatOS-SOC接口文档(air780E)--errDump - 错误上报
示例 -- 基本用法, 10分钟上报一次,如果有的话 if errDump thenerrDump.config(true, 600) end-- 附开源服务器端: https://gitee.com/openLuat/luatos-devlogerrDump.dump(zbuff, type, isDelete) 手动读取异常日志,主要用于用户将日志发送给自己的服务器而不是I…...

低代码平台如何助力国内企业数字化转型?
数字化是什么 数字化(Digitalization)是将许多复杂多变的信息转变为可以度量的数字、数据,再以这些数字、数据建立起适当的数字化模型,把它们转变为一系列二进制代码,引入计算机内部,进行统一处理…...

SI3262—高度集成的低功耗SOC芯片
Si3262是一款高度集成的低功耗SOC芯片,其集成了基于RISC-V核的低功耗MCU和工作在13.56MHz的非接触式读写器模块。 MCU模块具有低功耗、Low Pin Count、宽电压工作范围,集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC、TSC等…...

除静电离子风机在无尘车间的应用
除静电离子风机在无尘车间中的应用非常广泛,主要是用来控制车间内的静电荷,防止静电对车间内的电子元器件、电路板等敏感部件产生损害。 具体来说,除静电离子风机通常采用电离器产生大量负离子,将车间内的静电荷中和成无害的水蒸气…...

Linux上的Pip和Python升级指南
在Linux系统上,保持Pip和Python版本的最新状态对于顺利进行Python开发至关重要。通过升级Pip和Python,你可以享受到最新的功能、修复的bug以及提升的开发效率。本文将为你提供在Linux上升级Pip和Python的详细指南,助你打造更强大的开发环境。…...

4G工业路由器高效数据传输助力光伏发电站管理
光伏发电站是能源产业中一种利用太阳能技术将光转化为电能的常见设施。随着物联网技术与环保能源的不断进步和应用的普及,光伏发电站的管理也变得更加便捷高效。 光伏发电站结合4G工业路由器实现远程监控管理,并用于采集发电站中的传感器数据和监控信息…...
【音视频笔记】Mediacodec+Muxer生成mp4,浏览器无法播放问题处理
文章目录 背景解决过程曲线修复方案 解决问题根源 背景 最近在测试视频录制功能时发现,AudioRecord MediaCodec MediaMuxer生成的MP4,PC浏览器无法播放 ,但是Android、Windows、Mac的播放器应用都能正常播放。虽然不禁想吐槽浏览器视频组件…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...