Камера Android обрабатывает данные кадра в PreviewCallback, что приводит к увеличению собственной памяти - PullRequest
0 голосов
/ 14 сентября 2018

Я использую camera.addCallbackBuffer(data);, чтобы повторно использовать буфер, чтобы избежать нехватки памяти.Мой код в PreviewCallback, как

checkFace(data, camera); camera.addCallbackBuffer(data);

В методе checkFace просто конвертируйте данные в растровое изображение, а затем используйте FaceDetector для проверки лиц.И я пытался использовать camera.addCallbackBuffer(data); после преобразования данных, но родная память показывается в профилировщике Android Studio как enter image description here

после того, как мое приложение работает примерно через 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;
}

Итак, что я должен сделать, чтобы решить это ???

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...