天天看點

AndroidUSBCamera,UVCCamera開發通用庫

 AndroidUSBCamera基于[saki4510t/UVCCamera](https://github.com/saki4510t/UVCCamera)開發,該項目對USB Camera(UVC裝置)的使用和視訊資料采集進行了高度封裝,能夠幫助開發者通過幾個簡單的API實作USB Camera裝置的檢測、連接配接、預覽和音視訊資料采集,最重要的是手機無需root,隻需支援otg功能即可驅動。主要功能包括:  

(1)支援USB Camera裝置檢測,畫面實時預覽;  

(2)支援本地錄制mp4格式視訊,支援實時擷取音視訊資料流;  

(3)支援jpg格式圖檔抓拍;  

(4)支援擷取camera支援的分辨率,和分辨率切換;  

(5)支援屏蔽聲音,重新開機Camera; 

(6)支援相機自動對焦;  

(7)支援調整對比度和亮度

(8) 支援480P、720P、1080P and higher

(9) 支援Android5.0,6.0,7.0,8.0,9.0

如何使用AndroidUSBCamera項目 

1. 添加依賴到本地工程

第一步 添加JitPack倉庫到工程gradle  

Step 1. Add the JitPack repository to your build file

Add it in your root build.gradle at the end of repositories:

allprojects {

repositories {

...

maven { url 'http://raw.github.com/saki4510t/libcommon/master/repository/' }

maven { url 'https://jitpack.io' }

}

}

第二步 添加依賴到app Module的gradle   

Step 2. Add the dependency  

dependencies {

compile 'com.github.jiangdongguo:AndroidUSBCamera:1.3.8'

注:最新版為2,3,0

 2. 初始化引擎,注冊USB裝置事件監聽器  

  Init AndroidUSBCamera engine,register the USB device event listener  

   private USBCameraManager.OnMyDevConnectListener listener = new USBCameraManager.OnMyDevConnectListener() {

        // 插入USB裝置

        @Override

        public void onAttachDev(UsbDevice device) {

            if(mUSBManager == null || mUSBManager.getUsbDeviceCount() == 0){

                showShortMsg("未檢測到USB攝像頭裝置");

                return;

            }

            // 請求打開攝像頭

            if(! isRequest){

                isRequest = true;

                if(mUSBManager != null){

                    mUSBManager.requestPermission(0);

                }

            }

        }

        // 拔出USB裝置

        @Override

        public void onDettachDev(UsbDevice device) {

            if(isRequest){

                // 關閉攝像頭

                isRequest = false;

                mUSBManager.closeCamera();

                showShortMsg(device.getDeviceName()+"已撥出");

            }

        }

        // 連接配接USB裝置成功

        @Override

        public void onConnectDev(UsbDevice device,boolean isConnected) {

            if(! isConnected) {

                showShortMsg("連接配接失敗,請檢查分辨率參數是否正确");

                isPreview = false;

            }else{

                isPreview = true;

            }

        }

        // 與USB裝置斷開連接配接

        @Override

        public void onDisConnectDev(UsbDevice device) {

            showShortMsg("連接配接失敗");

        }

    };

    mUVCCameraView = (CameraViewInterface) mTextureView;

    mUVCCameraView.setCallback(new CameraViewInterface.Callback() {

        @Override

        public void onSurfaceCreated(CameraViewInterface view, Surface surface) {

            if(!isPreview && mUSBManager.isCameraOpened()) {

                 mUSBManager.startPreview(mUVCCameraView, new AbstractUVCCameraHandler.OnPreViewResultListener() {

                 @Override

                 public void onPreviewResult(boolean result) {

                 }

              });

              isPreview = true;

              }

         }

            @Override

            public void onSurfaceChanged(CameraViewInterface view, Surface surface, int width, int height) {

            }

            @Override

            public void onSurfaceDestroy(CameraViewInterface view, Surface surface) {

                if(isPreview && mUSBManager.isCameraOpened()) {

                    mUSBManager.stopPreview();

                    isPreview = false;

                }

            }

        });

        // 初始化引擎

        mUSBManager = USBCameraManager.getInstance();

        mUSBManager.initUSBMonitor(this,listener);

        mUSBManager.createUVCCamera(mUVCCameraView);

3. 注冊USB裝置廣播事件監聽器,開始Camera預覽  

  Register the USB device broadcast event listener and start the Camera Preview

// 注冊USB事件廣播監聽器

if(mUSBManager != null){

      mUSBManager.registerUSB();

}

// 恢複Camera預覽

 if(mUVCCameraView != null){

      mUVCCameraView.onResume();

 }

4. 登出USB裝置廣播事件監聽器,停止Camera預覽  

  Unregister the USB device broadcast event listener and stop the Camera Preview

// 登出USB事件廣播監聽器

 if(mUSBManager != null){

         mUSBManager.unregisterUSB();

  }

 // 暫停Camera預覽

 if(mUVCCameraView != null){

         mUVCCameraView.onPause();

 }

 5. 圖檔抓拍

  Picture capturing

if(mUSBManager == null || ! mUSBManager.isCameraOpened()){

          showShortMsg("抓拍異常,攝像頭未開啟");

          return;

 }

 mUSBManager.capturePicture(picPath, new AbstractUVCCameraHandler.OnCaptureListener() {

          @Override

          public void onCaptureResult(String path) {

               showShortMsg("儲存路徑:"+path);

          }

 });

6. 本地錄制(可實時擷取音視訊資料流)

   recoring mp4,and get media real-stream  

if(mUSBManager == null || ! mUSBManager.isCameraOpened()){

           showShortMsg("錄制異常,攝像頭未開啟");

           return;

 }

if(! mUSBManager.isRecording()){

                    String videoPath = USBCameraManager.ROOT_PATH+System.currentTimeMillis();

                    FileUtils.createfile(FileUtils.ROOT_PATH+"test666.h264");

                    RecordParams params = new RecordParams();

                    params.setRecordPath(videoPath);

                    params.setRecordDuration(0);    // 設定為0,不分割儲存

                    params.setVoiceClose(false);    // 不屏蔽聲音

                    mUSBManager.startRecording(params, new AbstractUVCCameraHandler.OnEncodeResultListener() {

                        @Override

                        public void onEncodeResult(byte[] data, int offset, int length, long timestamp, int type) {

                            // type = 0,aac格式音頻流

                            // type = 1,h264格式視訊流

                            if(type == 1){

                                FileUtils.putFileStream(data,offset,length);

                            }

                        }

                        @Override

                        public void onRecordResult(String videoPath) {

                            showShortMsg(videoPath);

                        }

                    });

// 停止錄制

mUSBManager.stopRecording();

7. 切換分辨率

  update Resulotion  

mUSBManager.updateResolution(this, mUVCCameraView, 320, 240, new USBCameraManager.OnPreviewListener() {

             @Override

             public void onPreviewResult(boolean isSuccess) {

                    if(! isSuccess) {

                            showShortMsg("預覽失敗,不支援該分辨率");

                        }else {

                            showShortMsg("以切換到分辨率為320x240");

                        }

                    }

      });  

 // 擷取Camera支援得分辨率  

 List<Size> list = mUSBManager.getSupportedPreviewSizes();

 // Camera自動對焦  

 mUSBManager.startCameraFoucs();

8. 釋放引擎資源

  release resource  

// 釋放資源

if(mUSBManager != null){

       mUSBManager.release();

 }

9. 添權重限

  add permissions  

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.RECORD_AUDIO" />

USBCameraManager  API (Other)

(1) void requestPermission(int index):請求授予開啟USB攝像頭權限;

(2) int getUsbDeviceCount():傳回查詢到的可用USB Camera數目;

(3) boolean isRecording():判斷是否正在錄制視訊;

(4) boolean isCameraOpened():判斷USB攝像頭是否正常打開;

(5) void release():釋放資源

(6) USBMonitor getUSBMonitor():傳回USBMonitor執行個體;

(7) mUSBManager.setModelValue(USBCameraManager.MODE_CONTRAST,contrast++); 調整對比度

(8) mUSBManager.setModelValue(USBCameraManager.MODE_BRIGHTNESS,brightness++);調整亮度

注:在使用Android Studio移植UVCCamera時,很多朋友可能會遇到"open(“/dev/bus/usb/001/002”, O_RDWR, 0),報錯,Permission denied"問題,這是由于Android Studio使用的ndk版本所緻,建議使用ndk-r14即可。解決方法:local.properties-->指定ndk.dir版本。(注:這裡使用的是離線方式)

最新版為2.3.0,更新時間為2019年6月17日,使用方法請移步Github項目

GitHub源碼位址:https://github.com/jiangdongguo/AndroidUSBCamera(如果對您有用,歡迎star&fork以表支援~謝謝^_^!)

Download APK

 In order to display the functions, I develop a simple released apk,which is based on version 2.3.1,and the build version is 28.0.3.Here is my configs and if you have any questions please issues to me ,I will follow it do my best.

ext {

    javaSourceCompatibility = JavaVersion.VERSION_1_8

    javaTargetCompatibility = JavaVersion.VERSION_1_8

    compileSdkVersion = 28

    buildToolsVersion = '28.0.3'

    minSdkVersion = 21

    targetSdkVersion = 28

    commonLibVersion= '2.12.4'

}

下載下傳APP:

displaying:

————————————————

繼續閱讀