Потоковое изображение с камеры как mjpeg с nanohttpd в Android

Я создал приложение и с помощью nanohttpd я мог получить информацию с телефона. Я мог открыть камеру на заднем плане и сделать снимок. Но я не могу передать это как движение jpeg через nanohttpd.

Я искал ответ в Интернете, но, к сожалению, я не смог достичь успеха. Я нашел много способов и проектов с открытым исходным кодом (ipweb-cam, spydroid), но они мне не помогли.

Пожалуйста, помогите мне.

1 ответ

Решение

Для тех, кто заинтересован в ответе и нуждается в некотором коде, здесь:

cameraObject.setPreviewCallback(new Camera.PreviewCallback(){
     @Override
     public void onPreviewFrame(byte[] data, Camera camera) {

            try {

                if (cameraObject.getParameters().getPreviewFormat() == ImageFormat.NV21) {
                    timestampBeforecompression = SystemClock.uptimeMillis();
                    yuvImage = new YuvImage(data, imageFormat, width, height, null);
                    yuvImage.compressToJpeg(rect, 75, mByteArrayOutputStream);

                    frameToStream = mByteArrayOutputStream.toByteArray();

                    bitmap = BitmapFactory.decodeByteArray(frameToStream, 0, frameToStream.length);
                    mByteArrayOutputStream.reset();
                    bitmap = Bitmap.createScaledBitmap(bitmap, 320, 240, true);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 60, mByteArrayOutputStream);
                    frameToStream = null;
                    frameToStream = mByteArrayOutputStream.toByteArray();

                    compressionMillis = SystemClock.uptimeMillis() - timestampBeforecompression;
                    if (125 - compressionMillis > 0) {
                        SystemClock.sleep(125 - compressionMillis);
                    }

                    if (mJpegStream != null) {
                        mJpegStream.streamJpeg(frameToStream, frameToStream.length, Long.MIN_VALUE);
                    }

                    if (mByteArrayOutputStream != null) {
                        mByteArrayOutputStream.reset();
                    }

                    frameToStream = null;
               }

           } catch (Exception e) {
                System.out.println("Oops: " + e.getMessage());
           }

      }
});

Обратите внимание, что вы можете опустить сжатие Millis и System.sleep(). Я использовал их для контроля частоты кадров, если у вас есть какие-либо недоразумения, не стесняйтесь писать.

Другие вопросы по тегам