Камера Android получает проблему с кадрами для копирования или предотвращения - PullRequest
0 голосов
/ 08 октября 2019

У меня есть этот код:

package com.example.socket;

import android.graphics.ImageFormat;
import android.graphics.Rect;
import android.graphics.SurfaceTexture;
import android.graphics.YuvImage;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PreviewCallback;

import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class CameraService extends Thread {

    private Camera mCamera;
    //private Parameters parameters;
    private int MAX_BUFFER = 90;
    private byte[] lastFrame;
    private volatile LinkedList<byte[]> mQueue = new LinkedList<byte[]>();
    private volatile ArrayList<ServerThread> sub = new ArrayList<ServerThread>();
    public byte[] buffer;//for previewcallback

    public void run() {
        iniciar();
        onRun();
    }

    public void iniciar() {

        System.out.println("Creacion de la camara");
        mCamera = Camera.open();
        SurfaceTexture surfaceTexture = new SurfaceTexture(0);

        try {
            lastFrame = previewBuffer();
            mCamera.setPreviewTexture(surfaceTexture);
            //parameters = mCamera.getParameters();
            //parameters.set("jpeg-quality", 70);
            //parameters.setPictureFormat(ImageFormat.JPEG);
            //parameters.setPreviewFpsRange(12000, 15000);
            //mCamera.setParameters(parameters);
            for (int i = 0; i < 3; i++) {
                mCamera.addCallbackBuffer(previewBuffer());
            }

        } catch (Exception e) {
            System.out.println("Error en la creacion de la camara");
        }
    }

    private Camera.PreviewCallback mePreviewCallbackWithBuffer = new PreviewCallback() {
        @Override
        public void onPreviewFrame(byte[] data, Camera camera) {
            // TODO Auto-generated method stub
            System.out.println("Function onPreviewFrame iniciado");

            mCamera.addCallbackBuffer(data);
        }
    };

    public void onRun() {
        mCamera.setPreviewCallbackWithBuffer(mePreviewCallbackWithBuffer);
        mCamera.startPreview();
    }

    public void onPause() {
        if (mCamera != null) {
            mCamera.setPreviewCallback(null);
            mCamera.stopPreview();
            mCamera.release();
        }
    }

    public void add_sub(ServerThread agregar) {
        synchronized (sub) {
            System.out.println("Se agrego");
            sub.add(agregar);
            System.out.println(sub.size());

        }
    }

    private byte[] previewBuffer() {
        int bufferSize;
        byte buffer[];
        int bitsPerPixel;

        Camera.Parameters mParams = mCamera.getParameters();
        Camera.Size mSize = mParams.getPreviewSize();
        int mImageFormat = mParams.getPreviewFormat();

        bitsPerPixel = ImageFormat.getBitsPerPixel(mImageFormat);
        bufferSize = (int) (mSize.height * mSize.width * ((bitsPerPixel / (float) 8)));
        buffer = new byte[bufferSize];
        return buffer;
    }
}

Но когда я пытаюсь изменить эту функцию: enter code here

    private Camera.PreviewCallback mePreviewCallbackWithBuffer = new PreviewCallback() {
        @Override
        public void onPreviewFrame(byte[] data, Camera camera) {
            // TODO Auto-generated method stub
            System.out.println("Function onPreviewFrame iniciado");

            mCamera.addCallbackBuffer(data);
        }
    };

Обратный вызов PreviewCallback With Buffer останавливается, когда я пытаюсь скопироватьмассив в другой массив или отправить или скопировать, если я использую массив изображений, код остановки. Я понятия не имею, почему остановлен !!!

Код в основном пытается получить кадры камеры и затем отправить их через tcp sokects клиенту Python. Часть сокетов не потому, что я думаю, что это не имеет отношения.

...