简体   繁体   English

android wifi直接实时摄像头视频流

[英]android wifi direct live camera video stream

I have established a wifi direct p2p connection between two android devices, streaming the live camera feed from device A to device B, at 720x480 resolution.我已经在两个 Android 设备之间建立了 wifi 直接 p2p 连接,以 720x480 的分辨率将实时摄像头从设备 A 流式传输到设备 B。 It works ok, but is pretty choppy, even at close range (<1m).它工作正常,但非常不稳定,即使在近距离(<1m)。 Sometimes it's ~15fps, then for a couple seconds it will drop to ~3fps (just a guesstimate).有时它是~15fps,然后几秒钟它会下降到~3fps(只是一个猜测)。 The basic functionality is a Runnable thread inside the OnPreviewFrame of the PreviewCallback that uses YuvImage() to compress the preview frame into a JPEG and writes it to an OutputStream.基本功能是 PreviewCallback 的 OnPreviewFrame 内的一个 Runnable 线程,它使用 YuvImage() 将预览帧压缩为 JPEG 并将其写入 OutputStream。

My question is: Is there a more efficient way to do this?我的问题是:有没有更有效的方法来做到这一点? I don't need an amazing frame rate (mabye 20...?).我不需要惊人的帧速率(mabye 20 ...?)。 It just has to be a little more consistent.它只需要更加一致。

        private PreviewCallback previewCb_ = new PreviewCallback() {

    public void onPreviewFrame(byte[] data, Camera c) {

        frame = data;
        imageFormat = c.getParameters().getPreviewFormat();

        if (!socket.isClosed()) {

            mHandler.post(new Runnable() {
                public void run() {
                    if (stream != null){
                        try
                        {
                            //Log.d(ChooseFunction.TAG, "writing to stream");
                            buffer.reset();
                            synchronized(frame){
                                new YuvImage(frame, imageFormat, CameraView.IMG_WIDTH, CameraView.IMG_HEIGHT, null).compressToJpeg(area, 100, buffer);
                            }
                            buffer.flush();

                            // write the content header
                            stream.write(("--" + boundary + "\r\n" +
                                    "Content-type: image/jpg\r\n" +
                                    "Content-Length: " + buffer.size() +
                                    "\r\n\r\n").getBytes());



                            buffer.writeTo(stream);
                            stream.write("\r\n\r\n".getBytes());
                            stream.flush();
                        }
                        catch (IOException e)
                        {
                            Log.d(ChooseFunction.TAG, e.getMessage());
                        }
                    }
                }
            });
        }
    }
};

I've used OpenCV for this conversion to make the performance for conversion of camera preview data to bitmap more efficient.我已使用OpenCV进行此转换,以提高将相机预览数据转换为位图的性能。

//Use openCV manager or openCV native libs directly in your project
        Log.i(TAG, "Trying to load OpenCV library");
    if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_2_0, this, mOpenCVCallBack)) {
        Log.e(TAG, "Cannot connect to OpenCV Manager");
    }

private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS: {
                //Init mat object
                mYuv = new Mat(480 + 480 / 2, 640, CvType.CV_8UC1);
                mRgb = new Mat();
                Log.i(TAG, "OpenCV loaded successfully");
                OpenCVLoaded = true;
            }
            break;
            default: {
                super.onManagerConnected(status);
            }
            break;
        }
    }
};

if (OpenCVLoaded) {
                //put camera preview data in mat
                mYuv.put(0, 0, instantPhotoData);
                Imgproc.cvtColor(mYuv, mRgb, Imgproc.COLOR_YUV420sp2RGB, 4);

                // convert to bitmap:
                final Bitmap rawBitmap = Bitmap.createBitmap(mRgb.cols(), mRgb.rows(), Bitmap.Config.ARGB_8888);
                Utils.matToBitmap(mRgb, rawBitmap);
                previewImageView.setImageBitmap(rawBitmap);

                    }
                });
            }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM