Я использую camera.addCallbackBuffer(data);
, чтобы повторно использовать буфер, чтобы избежать нехватки памяти.Мой код в PreviewCallback, как
checkFace(data, camera);
camera.addCallbackBuffer(data);
В методе checkFace просто конвертируйте данные в растровое изображение, а затем используйте FaceDetector для проверки лиц.И я пытался использовать camera.addCallbackBuffer(data);
после преобразования данных, но родная память показывается в профилировщике Android Studio как
после того, как мое приложение работает примерно через 10 минут, "Native"увеличение с 10 МБ до 250 МБ.
Когда мое приложение работает около 4 часов, оно падает и Logcat печатает:
E / IMemory (17967): невозможно сопоставить BpMemoryHeap (связыватель = 0x11515160)), размер = 462848, fd = 70 (Недостаточно памяти)
Я думаю, возможно, из-за "родной" памяти все чаще
КОД:
camera1.setPreviewCallbackWithBuffer(previewCallback1);
camera1.addCallbackBuffer(buffer1);
camera1.startPreview();
...
private Camera.PreviewCallback previewCallback1 = (data, camera) -> {
checkFace(data, camera);
camera.addCallbackBuffer(data);
};
//convert data to bitmap then check face from the bitmap
private void checkFace(byte[] data, Camera camera){
...
...run on new Thread...
Bitmap bitmap = BitmapUtil.ByteToBitmap(data, camera.getParameters().getPreviewSize());
...
FaceDetector detector = new FaceDetector(bitmap.getWidth(), bitmap.getHeight(), numberOfFace);
...then get the result of face detection
}
//convert frame data to bitmap
public static Bitmap ByteToBitmap(byte[] data, Camera.Size previewSize) {
ByteArrayOutputStream baos = null;
Bitmap bitmapOut = null;
try {
int w = previewSize.width;
int h = previewSize.height;
YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21, w, h, null);
baos = new ByteArrayOutputStream();
yuvimage.compressToJpeg(new Rect(0, 0, w, h), 60, baos);
byte[] jdata = baos.toByteArray();
bitmapOut = BitmapFactory.decodeByteArray(jdata, 0, jdata.length);
if (null == bitmapOut) {
return bitmapOut;
}
jdata = null;
yuvimage = null;
Matrix matrix = new Matrix();
matrix.postRotate(90);
bitmapOut = Bitmap.createBitmap(bitmapOut, 0, 0, w, h, matrix, false);
} catch (Exception e) {
} finally {
try {
if (baos != null) {
baos.flush();
baos.close();
}
} catch (Exception e) {
}
}
return bitmapOut;
}
Итак, что я должен сделать, чтобы решить это ???