From 3fba2482078ab53215feae085a4fcb12f1ad8610 Mon Sep 17 00:00:00 2001 From: jiangdongguo <765067602@qq.com> Date: Wed, 4 Apr 2018 15:36:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=AB=98=E5=88=86=E8=BE=A8?= =?UTF-8?q?=E7=8E=87=E5=88=87=E6=8D=A2=E5=A4=B1=E8=B4=A5=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=9B=E8=A7=A3=E5=86=B3Camera=E9=A2=84=E8=A7=88=E4=B8=8D?= =?UTF-8?q?=E6=B5=81=E7=95=85=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usbcamera/view/USBCameraActivity.java | 1 - .../main/res/layout/activity_usbcamera.xml | 39 +++++++------ .../jiangdg/usbcamera/UVCCameraHelper.java | 58 ++++++++++++++----- .../java/com/serenegiant/usb/UVCCamera.java | 4 +- .../usb/common/AbstractUVCCameraHandler.java | 14 ++--- .../usb/common/UVCCameraHandler.java | 6 +- .../common/UVCCameraHandlerMultiSurface.java | 6 +- 7 files changed, 78 insertions(+), 50 deletions(-) diff --git a/app/src/main/java/com/jiangdg/usbcamera/view/USBCameraActivity.java b/app/src/main/java/com/jiangdg/usbcamera/view/USBCameraActivity.java index c360d81..bb5ba33 100644 --- a/app/src/main/java/com/jiangdg/usbcamera/view/USBCameraActivity.java +++ b/app/src/main/java/com/jiangdg/usbcamera/view/USBCameraActivity.java @@ -139,7 +139,6 @@ public class USBCameraActivity extends AppCompatActivity implements CameraDialog mUVCCameraView = (CameraViewInterface) mTextureView; mUVCCameraView.setCallback(this); mCameraHelper = UVCCameraHelper.getInstance(); - mCameraHelper.setDefaultPreviewSize(320,240); mCameraHelper.initUSBMonitor(this, mUVCCameraView, listener); diff --git a/app/src/main/res/layout/activity_usbcamera.xml b/app/src/main/res/layout/activity_usbcamera.xml index 1d7e7b4..ada9f5b 100644 --- a/app/src/main/res/layout/activity_usbcamera.xml +++ b/app/src/main/res/layout/activity_usbcamera.xml @@ -17,39 +17,42 @@ app:navigationIcon="@null" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> - + android:layout_height="match_parent" + android:layout_below="@id/toolbar"> + + + + android:text="对比度(contrast)" + android:textColor="@color/colorWhite" /> + android:layout_height="match_parent" + android:layout_weight="2" /> + android:layout_height="match_parent" + android:layout_weight="2" /> + android:text="closeVoice" + android:textColor="@color/colorWhite" /> \ No newline at end of file diff --git a/libusbcamera/src/main/java/com/jiangdg/usbcamera/UVCCameraHelper.java b/libusbcamera/src/main/java/com/jiangdg/usbcamera/UVCCameraHelper.java index 44ca652..194ff46 100644 --- a/libusbcamera/src/main/java/com/jiangdg/usbcamera/UVCCameraHelper.java +++ b/libusbcamera/src/main/java/com/jiangdg/usbcamera/UVCCameraHelper.java @@ -32,6 +32,10 @@ public class UVCCameraHelper { private static final String TAG = "UVCCameraHelper"; private int previewWidth = 640; private int previewHeight = 480; + // 高分辨率YUV格式帧率较低 + private static int FRAME_FORMAT_YUYV = UVCCamera.FRAME_FORMAT_YUYV; + // 默认使用MJPEG + private static int FRAME_FORMAT_MJPEG = UVCCamera.FRAME_FORMAT_MJPEG; public static int MODE_BRIGHTNESS = UVCCamera.PU_BRIGHTNESS; public static int MODE_CONTRAST = UVCCamera.PU_CONTRAST; @@ -42,8 +46,8 @@ public class UVCCameraHelper { private UVCCameraHandler mCameraHandler; private USBMonitor.UsbControlBlock mCtrlBlock; - private WeakReference mActivityWrf; - private WeakReference mCamViewWrf; + private Activity mActivity; + private CameraViewInterface mCamView; private UVCCameraHelper() { } @@ -72,8 +76,8 @@ public class UVCCameraHelper { } public void initUSBMonitor(Activity activity, CameraViewInterface cameraView, final OnMyDevConnectListener listener) { - this.mActivityWrf = new WeakReference<>(activity); - this.mCamViewWrf = new WeakReference<>(cameraView); + this.mActivity = activity; + this.mCamView = cameraView; mUSBMonitor = new USBMonitor(activity.getApplicationContext(), new USBMonitor.OnDeviceConnectListener() { // called by checking usb device @@ -100,7 +104,19 @@ public class UVCCameraHelper { public void onConnect(final UsbDevice device, USBMonitor.UsbControlBlock ctrlBlock, boolean createNew) { mCtrlBlock = ctrlBlock; openCamera(ctrlBlock); - startPreview(mCamViewWrf.get()); + new Thread(new Runnable() { + @Override + public void run() { + // 休眠500ms,等待Camera创建完毕 + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + // 开启预览 + startPreview(mCamView); + } + }).start(); if(listener != null) { listener.onConnectDev(device,true); } @@ -124,7 +140,7 @@ public class UVCCameraHelper { } public void createUVCCamera() { - if (mCamViewWrf.get() == null) + if (mCamView == null) throw new NullPointerException("CameraViewInterface cannot be null!"); // release resources for initializing camera handler @@ -133,9 +149,9 @@ public class UVCCameraHelper { mCameraHandler = null; } // initialize camera handler -// mCamViewWrf.get().setAspectRatio(previewWidth / (float)previewHeight); - mCameraHandler = UVCCameraHandler.createHandler(mActivityWrf.get(), mCamViewWrf.get(), 2, - previewWidth, previewHeight, UVCCamera.FRAME_FORMAT_YUYV); + mCamView.setAspectRatio(previewWidth / (float)previewHeight); + mCameraHandler = UVCCameraHandler.createHandler(mActivity, mCamView, 2, + previewWidth, previewHeight, FRAME_FORMAT_MJPEG); } public void updateResolution(int width, int height) { @@ -148,11 +164,23 @@ public class UVCCameraHelper { mCameraHandler.release(); mCameraHandler = null; } -// mCamViewWrf.get().setAspectRatio(previewWidth / (float)previewHeight); - mCameraHandler = UVCCameraHandler.createHandler(mActivityWrf.get(), mCamViewWrf.get(), 2, - previewWidth, previewHeight, UVCCamera.FRAME_FORMAT_YUYV); + mCamView.setAspectRatio(previewWidth / (float)previewHeight); + mCameraHandler = UVCCameraHandler.createHandler(mActivity,mCamView, 2, + previewWidth, previewHeight, FRAME_FORMAT_MJPEG); openCamera(mCtrlBlock); - startPreview(mCamViewWrf.get()); + new Thread(new Runnable() { + @Override + public void run() { + // 休眠500ms,等待Camera创建完毕 + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + // 开启预览 + startPreview(mCamView); + } + }).start(); } public void registerUSB() { @@ -206,7 +234,7 @@ public class UVCCameraHelper { public List getUsbDeviceList() { List deviceFilters = DeviceFilter - .getDeviceFilters(mActivityWrf.get().getApplicationContext(), R.xml.device_filter); + .getDeviceFilters(mActivity.getApplicationContext(), R.xml.device_filter); if (mUSBMonitor == null || deviceFilters == null) return null; return mUSBMonitor.getDeviceList(deviceFilters.get(0)); @@ -245,8 +273,6 @@ public class UVCCameraHelper { } public void release() { - mCamViewWrf.clear(); - mActivityWrf.clear(); if (mCameraHandler != null) { mCameraHandler.release(); mCameraHandler = null; diff --git a/libusbcamera/src/main/java/com/serenegiant/usb/UVCCamera.java b/libusbcamera/src/main/java/com/serenegiant/usb/UVCCamera.java index 2c0e935..15a4180 100644 --- a/libusbcamera/src/main/java/com/serenegiant/usb/UVCCamera.java +++ b/libusbcamera/src/main/java/com/serenegiant/usb/UVCCamera.java @@ -48,7 +48,7 @@ public class UVCCamera { public static final int DEFAULT_PREVIEW_HEIGHT = 480; public static final int DEFAULT_PREVIEW_MODE = 0; public static final int DEFAULT_PREVIEW_MIN_FPS = 1; - public static final int DEFAULT_PREVIEW_MAX_FPS = 30; + public static final int DEFAULT_PREVIEW_MAX_FPS = 31; public static final float DEFAULT_BANDWIDTH = 1.0f; public static final int FRAME_FORMAT_YUYV = 0; @@ -127,7 +127,7 @@ public class UVCCamera { private UsbControlBlock mCtrlBlock; protected long mControlSupports; // カメラコントロールでサポートしている機能フラグ protected long mProcSupports; // プロセッシングユニットでサポートしている機能フラグ - protected int mCurrentFrameFormat = FRAME_FORMAT_YUYV; + protected int mCurrentFrameFormat = FRAME_FORMAT_MJPEG; protected int mCurrentWidth = DEFAULT_PREVIEW_WIDTH, mCurrentHeight = DEFAULT_PREVIEW_HEIGHT; protected float mCurrentBandwidthFactor = DEFAULT_BANDWIDTH; protected String mSupportedSize; diff --git a/libusbcamera/src/main/java/com/serenegiant/usb/common/AbstractUVCCameraHandler.java b/libusbcamera/src/main/java/com/serenegiant/usb/common/AbstractUVCCameraHandler.java index 5286b42..b05a9ac 100644 --- a/libusbcamera/src/main/java/com/serenegiant/usb/common/AbstractUVCCameraHandler.java +++ b/libusbcamera/src/main/java/com/serenegiant/usb/common/AbstractUVCCameraHandler.java @@ -534,13 +534,13 @@ public abstract class AbstractUVCCameraHandler extends Handler { // mUVCCamera.setFrameCallback(mIFrameCallback, UVCCamera.PIXEL_FORMAT_NV21); mUVCCamera.setFrameCallback(mIFrameCallback, UVCCamera.PIXEL_FORMAT_YUV420SP); } catch (final IllegalArgumentException e) { -// try { -// // fallback to YUV mode -// mUVCCamera.setPreviewSize(mWidth, mHeight, 1, 31, UVCCamera.DEFAULT_PREVIEW_MODE, mBandwidthFactor); -// } catch (final IllegalArgumentException e1) { -// callOnError(e1); -// return; -// } + try { + // fallback to YUV mode + mUVCCamera.setPreviewSize(mWidth, mHeight, 1, 31, UVCCamera.DEFAULT_PREVIEW_MODE, mBandwidthFactor); + } catch (final IllegalArgumentException e1) { + callOnError(e1); + return; + } } if (surface instanceof SurfaceHolder) { mUVCCamera.setPreviewDisplay((SurfaceHolder)surface); diff --git a/libusbcamera/src/main/java/com/serenegiant/usb/common/UVCCameraHandler.java b/libusbcamera/src/main/java/com/serenegiant/usb/common/UVCCameraHandler.java index 4403ee8..2d01f1c 100644 --- a/libusbcamera/src/main/java/com/serenegiant/usb/common/UVCCameraHandler.java +++ b/libusbcamera/src/main/java/com/serenegiant/usb/common/UVCCameraHandler.java @@ -42,7 +42,7 @@ public class UVCCameraHandler extends AbstractUVCCameraHandler { final Activity parent, final CameraViewInterface cameraView, final int width, final int height) { - return createHandler(parent, cameraView, 1, width, height, UVCCamera.FRAME_FORMAT_YUYV, UVCCamera.DEFAULT_BANDWIDTH); + return createHandler(parent, cameraView, 1, width, height, UVCCamera.FRAME_FORMAT_MJPEG, UVCCamera.DEFAULT_BANDWIDTH); } /** @@ -58,7 +58,7 @@ public class UVCCameraHandler extends AbstractUVCCameraHandler { final Activity parent, final CameraViewInterface cameraView, final int width, final int height, final float bandwidthFactor) { - return createHandler(parent, cameraView, 1, width, height, UVCCamera.FRAME_FORMAT_YUYV, bandwidthFactor); + return createHandler(parent, cameraView, 1, width, height, UVCCamera.FRAME_FORMAT_MJPEG, bandwidthFactor); } /** @@ -74,7 +74,7 @@ public class UVCCameraHandler extends AbstractUVCCameraHandler { final Activity parent, final CameraViewInterface cameraView, final int encoderType, final int width, final int height) { - return createHandler(parent, cameraView, encoderType, width, height, UVCCamera.FRAME_FORMAT_YUYV, UVCCamera.DEFAULT_BANDWIDTH); + return createHandler(parent, cameraView, encoderType, width, height, UVCCamera.FRAME_FORMAT_MJPEG, UVCCamera.DEFAULT_BANDWIDTH); } /** diff --git a/libusbcamera/src/main/java/com/serenegiant/usb/common/UVCCameraHandlerMultiSurface.java b/libusbcamera/src/main/java/com/serenegiant/usb/common/UVCCameraHandlerMultiSurface.java index 428908c..b85aaa0 100644 --- a/libusbcamera/src/main/java/com/serenegiant/usb/common/UVCCameraHandlerMultiSurface.java +++ b/libusbcamera/src/main/java/com/serenegiant/usb/common/UVCCameraHandlerMultiSurface.java @@ -43,7 +43,7 @@ public class UVCCameraHandlerMultiSurface extends AbstractUVCCameraHandler { final Activity parent, final CameraViewInterface cameraView, final int width, final int height) { - return createHandler(parent, cameraView, 1, width, height, UVCCamera.FRAME_FORMAT_YUYV, UVCCamera.DEFAULT_BANDWIDTH); + return createHandler(parent, cameraView, 1, width, height, UVCCamera.FRAME_FORMAT_MJPEG, UVCCamera.DEFAULT_BANDWIDTH); } /** @@ -59,7 +59,7 @@ public class UVCCameraHandlerMultiSurface extends AbstractUVCCameraHandler { final Activity parent, final CameraViewInterface cameraView, final int width, final int height, final float bandwidthFactor) { - return createHandler(parent, cameraView, 1, width, height, UVCCamera.FRAME_FORMAT_YUYV, bandwidthFactor); + return createHandler(parent, cameraView, 1, width, height, UVCCamera.FRAME_FORMAT_MJPEG, bandwidthFactor); } /** @@ -75,7 +75,7 @@ public class UVCCameraHandlerMultiSurface extends AbstractUVCCameraHandler { final Activity parent, final CameraViewInterface cameraView, final int encoderType, final int width, final int height) { - return createHandler(parent, cameraView, encoderType, width, height, UVCCamera.FRAME_FORMAT_YUYV, UVCCamera.DEFAULT_BANDWIDTH); + return createHandler(parent, cameraView, encoderType, width, height, UVCCamera.FRAME_FORMAT_MJPEG, UVCCamera.DEFAULT_BANDWIDTH); } /**