Android直播開發之旅(10):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:  安裝密碼 12345678

displaying:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章