ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

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

2026/9/15 6:44:55 拓冰建站 浏览量
解决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且为最高。