【发布时间】:2017-03-30 03:22:06
【问题描述】:
我有这个过热问题,运行几个小时后它会关闭我的手机。我想 24/7 全天候运行,请帮我改进:
我使用Camera2接口,RAW格式后跟一个renderscript将YUV420888转换为rgba。我的渲染脚本如下:
#pragma version(1)
#pragma rs java_package_name(com.sensennetworks.sengaze)
#pragma rs_fp_relaxed
rs_allocation gCurrentFrame;
rs_allocation gByteFrame;
int32_t gFrameWidth;
uchar4 __attribute__((kernel)) yuv2RGBAByteArray(uchar4 prevPixel,uint32_t x,uint32_t y)
{
// Read in pixel values from latest frame - YUV color space
// The functions rsGetElementAtYuv_uchar_? require API 18
uchar4 curPixel;
curPixel.r = rsGetElementAtYuv_uchar_Y(gCurrentFrame, x, y);
curPixel.g = rsGetElementAtYuv_uchar_U(gCurrentFrame, x, y);
curPixel.b = rsGetElementAtYuv_uchar_V(gCurrentFrame, x, y);
// uchar4 rsYuvToRGBA_uchar4(uchar y, uchar u, uchar v);
// This function uses the NTSC formulae to convert YUV to RBG
uchar4 out = rsYuvToRGBA_uchar4(curPixel.r, curPixel.g, curPixel.b);
rsSetElementAt_uchar(gByteFrame, out.r, 4 * (y*gFrameWidth + x) + 0 );
rsSetElementAt_uchar(gByteFrame, out.g, 4 * (y*gFrameWidth + x) + 1 );
rsSetElementAt_uchar(gByteFrame, out.b, 4 * (y*gFrameWidth + x) + 2 );
rsSetElementAt_uchar(gByteFrame, 255, 4 * (y*gFrameWidth + x) + 3 );
return out;
}
这是我调用渲染脚本转换为 rgba 的地方:
@Override
public void onBufferAvailable(Allocation a) {
inputAllocation.ioReceive();
// Run processing pass if we should send a frame
final long current = System.currentTimeMillis();
if ((current - lastProcessed) >= frameEveryMs) {
yuv2rgbaScript.forEach_yuv2RGBAByteArray(scriptAllocation, outputAllocation);
if (rgbaByteArrayCallback != null) {
outputAllocationByte.copyTo(outBufferByte);
rgbaByteArrayCallback.onRGBAArrayByte(outBufferByte);
}
lastProcessed = current;
}
}
这是使用 OpenCV 运行图像处理的回调:
@Override
public void onRGBAArrayByte(byte[] rgbaByteArray) {
try {
/* Fill images. */
rgbaMat.put(0, 0, rgbaByteArray);
analytic.processFrame(rgbaMat);
/* Send fps to UI for debug purpose. */
calcFPS(true);
} catch (Exception e) {
e.printStackTrace();
}
}
整个过程以 ~22fps 的速度运行。我仔细检查过,没有内存泄漏。但是即使在屏幕关闭的情况下运行一段时间后,手机也会变得非常热,并自行关闭。请注意,如果我删除图像处理部分,问题仍然存在。这有什么问题?我可以打开手机相机应用程序,让它运行几个小时而没有问题。
- renderscript 会导致发热吗?
- 22fps 会导致发热吗?也许我应该减少它?
- Android 后台服务会发热吗?
谢谢。
ps:我在完全支持 Camera2 接口的 LG G4 上对此进行了测试。
【问题讨论】:
-
您在相机上停留了多长时间?因为相机硬件每秒将 24 帧序列化为视频。如果随着时间的推移持续运行它,就会产生大量的磁盘 IO。对我来说听起来很合乎逻辑。
-
摄像头、RenderScript、OpenCV,加上潜在的 IO 和网络使用,可以轻松地将手机推到其热极限。您可以尝试的一件事是使用较低的分辨率或较低的 fps,或者在其上安装散热器 :)
标签: android android-camera android-camera2 android-renderscript overheating