你好!这里是风筝的博客,

欢迎和我一起交流。


【前提条件】
移动卡纯5G,120HZ,最小亮度,最小音量,开启定位

【操作步骤】
1.从软件商店下载最新版本APK
2.进入抖音并登录账号,点击右上方的“摄像头”图标进入摄像界面,开直播(默认后置),摄像头对准人头,播放背景音乐
3.点击开始播放后,等待30秒,记录3分钟的平均电流

【实际结果】
测试机比对比机功耗大23mA

一般功耗问题,都是需要硬件同事先进行功耗拆解数据,进一步定位功耗是由硬件还是由软件引入。

android 调用 摄像头 android调用摄像头还耗电_android 调用 摄像头

查看拆解数据可知,多出来的二十多mA功耗由软件引入,聚焦在camera相机模块。
那么这题和我们audio音频有何关系呢?下面细说~

从之前的经历(Android音频子系统(九)------数字耳机功耗问题解析)就就可以看出,一般就有两个方向分析:

  • CPU频率提升带来的功耗增大。
  • 负载较重/锁等待导致的进程长时间占用CPU资源导致功耗增大。

抓取一份systrace log,打开浏览器:chrome://tracing/ 分析trace。

可以看出:抖音直播过程中,CPU 小核频率被垫高到1.5G

android 调用 摄像头 android调用摄像头还耗电_音频_02


为了进一步观察频率图,使用perfconv工具抓取trace并转换成图表。测试机数据,C0(CPU0):1.6g,C1(CPU4):1.9G,C2(CPU7):1.4g

android 调用 摄像头 android调用摄像头还耗电_audio_03

对比机数据,C0(CPU0):1.2g,C1(CPU4):1.1G,C2(CPU7):500m

android 调用 摄像头 android调用摄像头还耗电_Android_04


对比发现,测试机里面,小核大核超大核的频率都比对比机要高出不少。

查看log:

AudioALSAStreamIn: open(), Set RawStartFrameCount = 0
AudioUtility: power_hal_hint - custPowerHint 37,data 268435455
libPowerHal: [perfGetHintRsc] hint:37 MTKPOWER_HINT_AUDIO_LATENCY_UL
libPowerHal: [perfScnEnable] scn:MTKPOWER_HINT_AUDIO_LATENCY_UL set cpu freq[0] min:1500000 max:-1
libPowerHal: [perfScnEnable] scn:MTKPOWER_HINT_AUDIO_LATENCY_UL set cpu freq[1] min:1000000 max:-1
libPowerHal: [setClusterFreq] MTKPOWER_HINT_AUDIO_LATENCY_UL: sysfs_freq set cpu freq: 1500000 -1 1000000 2200000 -1 -1

从log可以看出,抖音直播录音时,进入了MTKPOWER_HINT_AUDIO_LATENCY_UL这个scene,小核频率被限制为最低1.5g:set cpu freq[0] min:1500000 max:-1。
CPU底频被拉高了,所以相应的,直播录音时功耗会增大。

频率配置一般在powerscntbl.xml里配置,一般是不建议随便修改。
这里是直播场景,走voip fast通路,要求low latency低延时,所以为了保障音频性能要求不出现卡顿,所以垫高了CPU频率。

所以这题就明了了,取舍问题,要性能还是要功耗。
要么牺牲功耗提升性能,要么牺牲性能节省功耗。

目前我是选择了节省功耗,因为降频只是有音频录音卡顿风险,并不一定会卡顿,但是节省的功耗却是实实在在的。。。。。。

一般提频涉及的场景在mtkpower_hint.h,我们audio音频主要是一下几个地方会操作频率:

enum {
    //MTK pre-defined hint
    MTKPOWER_HINT_BASE                              = 20,

    MTKPOWER_HINT_AUDIO_LATENCY_DL                  = 36,
    MTKPOWER_HINT_AUDIO_LATENCY_UL                  = 37,
    MTKPOWER_HINT_AUDIO_POWER_DL                    = 38,
    MTKPOWER_HINT_AUDIO_DISABLE_WIFI_POWER_SAVE     = 39,
    MTKPOWER_HINT_AUDIO_POWER_UL                    = 44,
    MTKPOWER_HINT_AUDIO_POWER_HI_RES                = 46,

    MTKPOWER_HINT_LAST,
};
  • MTKPOWER_HINT_AUDIO_LATENCY_DL / UL主要应用在fast通路做low latency的。
  • MTKPOWER_HINT_AUDIO_POWER_DL / UL主要针对手机息屏时降低功耗。
  • MTKPOWER_HINT_AUDIO_DISABLE_WIFI_POWER_SAVE 主要针对voip场景,目前没有开启,不知道MTK为啥加入这个。
  • MTKPOWER_HINT_AUDIO_POWER_HI_RES 针对high rate,大于48K的音频,常见于播放192KHz音频,高速率的音频需要提频播放,否则容易出现卡顿。