解决Android camera 录像中拍照帧率不足30fps

问题现象

camera录像中拍照,录出来的视频帧率为29.3fps,未达到30fps。

问题分析

这个场景相当于跑了previe+vedio+capture,极其损耗性能。

当前场景CPU频率已处于最高。

抓取systrace分析。

1,分析掉帧直接原因

c91f97cb877540a89ce45dc83635f89b.jpg

SinkNode存在大量一帧耗时超过33.3ms,造成帧率无法达到30fps。

2,对比查看线程优先级

f26febd201634fb69bed166b34f8f111.jpg

b74c432eee5349e3bc696de017214327.jpg

SinkNode大部分处于Runnable状态,async_FaceDetec处于Running状态,很明显两者优先级不一样,从systrace上看确实如此。

3,提升SinkNode线程优先级

#include <sys/resource.h>
void set_current_max_priority()
{auto current_tid = gettid();auto origin_priority = getpriority(PRIO_PROCESS, current_tid);if (-1 == origin_priority) {LOGE("licq getpriority error");return;}auto set_perf_ret = setpriority(PRIO_PROCESS, current_tid, -20);
}void set_current_max_rt()
{struct sched_param param;int policy;int ret;ret = pthread_getschedparam(pthread_self(), &policy, &param);if (ret != 0) {LOGE("licq Error: pthread_getschedparam failed");return;}param.sched_priority = 99;pthread_setschedparam(pthread_self(), SCHED_FIFO, &param);
}

两种方式提升线程优先级,选用set_current_max_rt,将SinkNode设置为RT线程并达到最高级别。

systrace确定改动是否生效:

e48d8616fa5d49cdbc0de3f8733b9a72.jpg

帧率达标,抓取systrace查看SinkNode耗时,已在33.3ms之内完成。同时发现一段很长sleep时间,是processCaptureResult,systrace如下:

4b17e60ac5654310b29a6afd15b3a56d.jpg

 474158f610a54731ad25d8d17f36433e.jpg

73ebb3ff84294c33b72b6caff2fcb84e.jpg

aff94256c6c4471eb115e6d309c9ae79.jpg

根据binder通信原理,很快找到了最终元凶,是com.android.camera 处理慢了。

 

解决方案

提升SinkNode线程优先级为RT且为最高。

 

 

 

 

 

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

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

相关文章

四、Redis之配置文件

redis配置文件的名称 redis.conf 通过命令 find / -name redis.confvim redis.conf通过 : set nu 设置行号: set nonu 取消行号/关键字 搜索关键字: set noh 取消高亮选择4.1 Units 配置大小单位&#xff0c;开头定义了一些基本的度量单位&#xff0c;只支持 bytes&#…

《Vue3 基础知识》 使用 GoGoCod 升级到Vue3+ElementPlus 适配处理

此篇为 《Vue2ElementUI 自动转 Vue3ElementPlus&#xff08;GoGoCode&#xff09;》 的扩展&#xff01; Vue3 适配 Vue3 不兼容适配 Vue 3 迁移指南 在此&#xff0c;本章只讲述项目或组件库中遇到的问题&#xff1b; Vue3 移除 o n &#xff0c; on&#xff0c; on&#…

海量数据处理商用短链接生成器平台 - 2

第二章 短链平台项目创建git代码管理开发分层规范 第1集 短链平台实战-Maven聚合工程创建微服务项目 **简介&#xff1a;Maven聚合工程创建微服务项目实战 ** Maven聚合工程拆分 dcloud-common 公共依赖包 dcloud-app FlinkKafka实时计算 dcloud-account 账号流量包微服务 dc…

如何在Vue应用程序中使用Vue-Router来实现路由嵌套动画效果

Vue-Router是Vue.js官方的路由管理插件&#xff0c;可以帮助我们轻松管理应用程序的路由。除了基本的路由功能外&#xff0c;Vue-Router还允许我们在切换路由时添加动画效果&#xff0c;提升用户体验。本文将介绍如何使用Vue-Router来实现路由嵌套动画效果&#xff0c;并提供具…

为什么越来越多的企业在考虑将ERP从云端迁移到本地?

越来越多的企业在考虑将核心ERP迁移到本地部署&#xff0c;原来实施的时候局限于业务规模、实施成本的原因采用云端部署的方式越来越不再适应于企业规模的发展、系统应用和数据安全的要求。 因此他们都宁愿将云端ERP的数据迁移到本地&#xff0c;使得系统数据和安全更加可控。…

python中[[]] * (n)和[[] for _ in range(n)]的区别

1、现象 刷leetcode207的时候碰到一个坑&#xff0c;用[[]] * (n)初始化二维数组&#xff0c;逻辑是正确的&#xff0c;但是结果始终不对。 2、原因 最后定位是初始化语句使用错误导致的&#xff0c;我使用的是[[]] * (n)&#xff0c;应该使用[[] for _ in range(n)] 3、解…

(十)流程控制经典案例

文章目录 最大公约数&#xff0c;最小公倍数现象水仙花数现象 最大公约数&#xff0c;最小公倍数 最大公约数&#xff1a; 最大体现在&#xff1a;最大也只能是两个数中最小的那个数 公约体现在&#xff1a;两个数全都能被某个数整除 还有个公式求其一&#xff0c;就知道另一…

MySQL 教程 2.3

MySQL DELETE 语句 你可以使用 DELETE FROM 命令来删除 MySQL 数据表中的记录。 你可以在 mysql> 命令提示符或 PHP 脚本中执行该命令。 语法 以下是 DELETE 语句从 MySQL 数据表中删除数据的通用语法&#xff1a; DELETE FROM table_name WHERE condition; 参数说明&…

【Linux网络编程三】Udp套接字编程网络应用场景

【Linux网络编程三】Udp套接字编程网络应用场景 应用场景一&#xff1a;远程命令执行应用场景二&#xff1a;与Windos端相互通信应用场景三&#xff1a;简单聊天1.多线程化2.输入输出分开 应用场景一&#xff1a;远程命令执行 简单的服务器上一篇已经完成&#xff0c;接下来我…

r0下进程保护

简介 SSDT 的全称是 System Services Descriptor Table&#xff0c;系统服务描述符表。这个表就是一个把 Ring3 的 Win32 API 和 Ring0 的内核 API 联系起来。SSDT 并不仅仅只包含一个庞大的地址索引表&#xff0c;它还包含着一些其它有用的信息&#xff0c;诸如地址索引的基地…

DFS——连通性和搜索顺序

dfs的搜索是基于栈&#xff0c;但一般可以用用递归实现&#xff0c;实际上用的是系统栈。有内部搜索和外部搜索两种&#xff0c;内部搜索是在图的内部&#xff0c;内部搜索一般基于连通性&#xff0c;从一个点转移到另一个点&#xff0c;或者判断是否连通之类的问题&#xff0c…

赎金信[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你两个字符串&#xff1a;ransomNote和magazine&#xff0c;判断ransomNote能不能由magazine里面的字符构成。如果可以&#xff0c;返回true&#xff1b;否则返回false。magazine中的每个字符只能在ransomNote中使用一次。 示例 …