长按相机连拍,没有达到最大的连拍数量时,自动停止;
拍照的jpeg data会从底层callback回app,而因为连拍速度比较快,所以若app保存速度不够快,也就是T卡performance不好,jpeg data堆积很容易就让camera的memory爆掉。所以我们在app中会根据当前使用的memory情况去做不同的处理:
Case 1:当camera app的剩余memory小于44M时,会告诉底层降低拍照速度为最多3张/秒;
Case 2:当camera app的剩余memory小于10M时,会自动停止连拍。
从流程上说,连拍时底层每callback回来一张jpeg data,app除了保存这个jpeg data之外,会先判断是否剩余的memory是否小于10M,若小于则会停止连拍。若不小于10M,则继续判断是否小于44M,若是,则会降低拍照速度为最高3张/秒。
注意:我们这里说的memory是dvm的heap。
正常的流程log如下:
Step1. 开始长按拍照键(log关键词为“onShutterButtonLongPressed”):
例如:
01-07 11:28:17.139 4718 4718 V ModeActor: onShutterButtonLongPressed!
Step2. Camera App会在每一张图片从底层callback回来后,先判断是否需要停止连拍(log关键词为“isNeedStopCapture”):正常时isNeedStopCapture返回值为false,表示不需要停止连拍。
例如:
01-07 11:28:17.888 4718 4718 V ModeActor: isNeedStopCapture() mMaxMemory=134217728, total=24436704, free=1594200, real free=111375224, mUsedStorage=2644983, mLeftStorage=2569375616, return false
这里的real free=111375224表示剩余的dvm heap size,
Step3. 判断下一次的拍照是否需要减速(log关键词为“isNeedSlowDown”):正常时isNeedSlowDown的返回值为false,表示不需要减速。
例如:
01-07 11:28:23.067 4718 4718 V ModeActor: isNeedSlowDown(44499404) return false
然而针对此问题,通常是因为T卡performance不好,app的jpeg data很容易堆积,所以一般来说会先降速,若降速还是不行,就会停止连拍。
可通过下面的这些log查看是否是属于此问题:
1.在log中搜索“ModeActor: isNeedSlowDown”,若返回值为true,表示app告诉底层要需要降速为3张/秒了。
例如:
01-07 11:28:23.338 4718 4718 V ModeActor: isNeedSlowDown(46608579) return true
并且此时Hal层会打印出现面这样的log(关键字可以搜“{ContinuousShot}[capture] (mu4CurrentCount, usSleep, usMinContinuousShotToShotTime)”),
例如:
01-07 11:28:23.736 107 4767 D mHalCam : {ContinuousShot}[capture] (mu4CurrentCount, usSleep, usMinContinuousShotToShotTime)=(25, 10227, 333000)
只要这句log(红色部分)有打印出来,就表示Hal层已经在跑降速的流程了。
2.降速后还是不行,camera app会自动通知Hal层停止连拍,可以搜关键词“isNeedStopCapture”,当return true时,表示要停止连拍(这个log是判断该问题的关键。)。
例如:
01-07 11:28:33.188 4718 4718 V ModeActor: isNeedStopCapture() mMaxMemory=134217728, total=129949664, free=6204312, real free=10472376, mUsedStorage=116209397, mLeftStorage=2569375616, return true
另外“real free=10472376”=9.987 MB < 10M,表示剩余dvm memory不足10M.
3.同时log中可以搜索” Camera-JNI: Couldn't allocate byte array for JPEG data” ,表示JNI层也会报出已经无法为jpeg data分配内存。
例如:
01-07 11:28:33.517 4718 4811 E Camera-JNI: Couldn't allocate byte array for JPEG data
[SOLUTION]
通常这种问题是T卡performance太差,写数据太慢导致,建议更换一张正常的T卡进行测试。