国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android 外接基于UVC協(xié)議的攝像頭并實(shí)現(xiàn)預(yù)覽

這篇具有很好參考價(jià)值的文章主要介紹了Android 外接基于UVC協(xié)議的攝像頭并實(shí)現(xiàn)預(yù)覽。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

先來一段從網(wǎng)上找到的理論知識(shí),對(duì)UVC協(xié)議有初步的印象

UVC協(xié)議:USB Video Class,USB視頻類,是一種為USB視頻捕獲設(shè)備定義的協(xié)議標(biāo)準(zhǔn)。

Android 平臺(tái)支持使用即插即用的 USB 攝像頭(即網(wǎng)絡(luò)攝像頭),但前提是這些攝像頭采用標(biāo)準(zhǔn)的?Android Camera2 API?和攝像頭?HIDL?接口。網(wǎng)絡(luò)攝像頭通常支持?USB 視頻類 (UVC)?驅(qū)動(dòng)程序,并且在 Linux 上,系統(tǒng)采用標(biāo)準(zhǔn)的?Video4Linux (V4L)?驅(qū)動(dòng)程序控制 UVC 攝像頭。

本文主要展示具體的實(shí)現(xiàn),并不研究UVC協(xié)議以及底層實(shí)現(xiàn),只展示Android外界usb攝像頭的預(yù)覽功能的流程。文末附demo

本文的實(shí)現(xiàn)基于github開源庫:傳送門

1.項(xiàng)目中集成libuvccamera模塊(代碼可從github下載,或者是文末demo中附帶)

 implementation project(':libuvccamera')

2.布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.serenegiant.widget.AspectRatioSurfaceView
        android:id="@+id/surfaceView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

3.MainActivity

public class MainActivity extends AppCompatActivity {

    private static final String TAG = MainActivity.class.getSimpleName();
    private static final boolean DEBUG = true;
    private ActivityMainBinding binding;
    private UsbDevice mUsbDevice;
    /**
     * CameraHelper是管理Camera服務(wù)的客戶端
     * (功能包括:選擇設(shè)備,打開設(shè)備,連接設(shè)備,關(guān)聯(lián)預(yù)覽用的CameraView,拍照,錄像,斷開連接等操作)
     * 其中通過addSurface,關(guān)聯(lián)預(yù)覽用的Surface比較關(guān)鍵,分為三種情況:
     * a. 連接設(shè)備成功時(shí),執(zhí)行addSurface
     * b. 旋轉(zhuǎn)屏幕,成功進(jìn)入OnResume時(shí),CameraView生成Surface,并執(zhí)行回調(diào)onSurfaceCreated方法,在方法中執(zhí)行addSurface
     */
    private ICameraHelper mCameraHelper;
    private final ICameraHelper.StateCallback mStateCallback = new MyCameraHelperCallback();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
    }

    @Override
    public void onStart() {
        super.onStart();
        resetCameraHelper();
    }

    private void resetCameraHelper() {
        clearCameraHelper();
        initCameraHelper();
    }

    public void initCameraHelper() {
        mCameraHelper = new CameraHelper();
        mCameraHelper.setStateCallback(mStateCallback);
    }

    /**
     * 程序結(jié)束或者UVC設(shè)備斷開連接時(shí),釋放CameraHelper
     */
    private void clearCameraHelper() {
        if (mCameraHelper != null) {
            mCameraHelper.releaseAll();
            mCameraHelper = null;
        }
    }

    private class MyCameraHelperCallback implements ICameraHelper.StateCallback {
        @Override
        public void onAttach(UsbDevice device) {
            if (DEBUG) Log.v(TAG, "onAttach:device=" + device.getDeviceName());
            mCameraHelper.selectDevice(device);
        }

        /**
         * 獲取USB設(shè)備權(quán)限之后,才開始連接USB攝像頭
         */
        @Override
        public void onDeviceOpen(UsbDevice device, boolean createNew) {
            if (DEBUG) Log.v(TAG, "onDeviceOpen:device=" + device.getDeviceName());
            if (mCameraHelper != null) {
                mCameraHelper.openCamera();
            }
        }

        @Override
        public void onCameraOpen(UsbDevice device) {
            if (DEBUG) Log.v(TAG, "onCameraOpen:");
            mCameraHelper.startPreview();
            // 和攝像頭成功建立連接之后,就可以獲取攝像頭當(dāng)前預(yù)覽的實(shí)際分辨率
            Size size = mCameraHelper.getPreviewSize();
            if (size != null) {
                // 設(shè)置TextureView的寬高比,使之符合攝像頭的真實(shí)比例
                binding.surfaceView.setAspectRatio(size.width, size.height);
            }
            if (mCameraHelper != null && binding.surfaceView != null && binding.surfaceView.getHolder() != null && binding.surfaceView.getHolder().getSurface() != null) {
                mCameraHelper.addSurface(binding.surfaceView.getHolder().getSurface(), false);
            }
        }

        @Override
        public void onCameraClose(UsbDevice device) {
            if (DEBUG) Log.v(TAG, "onCameraClose:");
            if (mCameraHelper != null && binding.surfaceView != null && binding.surfaceView.getHolder() != null && binding.surfaceView.getHolder().getSurface() != null) {
                mCameraHelper.removeSurface(binding.surfaceView.getHolder().getSurface());
            }
        }

        @Override
        public void onDeviceClose(UsbDevice device) {
            if (DEBUG) Log.v(TAG, "onDeviceClose:");
        }

        @Override
        public void onDetach(UsbDevice device) {
            if (DEBUG) Log.v(TAG, "onDetach:device=" + device.getDeviceName());
            if (device.equals(mUsbDevice)) {
                mUsbDevice = null;
            }
        }

        @Override
        public void onCancel(UsbDevice device) {
            if (DEBUG) Log.v(TAG, "onCancel:device=" + device.getDeviceName());
            if (device.equals(mUsbDevice)) {
                mUsbDevice = null;
            }
        }

        @Override
        public void onError(UsbDevice device, CameraException e) {
            if (DEBUG) Log.v(TAG, "onError:" + e);
            if (device.equals(mUsbDevice)) {
                mUsbDevice = null;
            }
        }
    }

}

至此,就實(shí)現(xiàn)了對(duì)usb攝像頭的簡單的預(yù)覽功能

demo源碼?文章來源地址http://www.zghlxwxcb.cn/news/detail-620834.html

到了這里,關(guān)于Android 外接基于UVC協(xié)議的攝像頭并實(shí)現(xiàn)預(yù)覽的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • ubuntu調(diào)用外接攝像頭

    ubuntu調(diào)用外接攝像頭

    一、ubuntu20.04調(diào)用外接攝像頭(如果是Ubuntu18.04用melodic放在第二行) 1.檢查是否連接攝像頭 輸出/dev/video0? /dev/video1? /dev/video2? /dev/video3 ...表示可以 2.命令行下載軟件調(diào)用USB攝像頭 2.1使用應(yīng)用程序camorama 輸入命令: 安裝完成后,在終端中輸入命令: 即可顯示出視頻信息;

    2024年02月07日
    瀏覽(28)
  • 使用opencv調(diào)用外接攝像頭

    使用opencv調(diào)用外接攝像頭

    當(dāng)我們使用opencv調(diào)用攝像頭的命令?cv2.VideoCapture(0),可能會(huì)出現(xiàn)下面這個(gè)錯(cuò)誤。 [ERROR:0@0.433] global obsensor_uvc_stream_channel.cpp:156 cv::obsensor::getStreamChannelGroup Camera index out of range 表明在嘗試獲取攝像機(jī)流通道組時(shí),使用的攝像機(jī)索引超出了有效范圍。這通常意味著你嘗試訪問的攝

    2024年02月03日
    瀏覽(26)
  • ESP32-CAM網(wǎng)絡(luò)攝像頭系列-01-基于RTSP協(xié)議的局域網(wǎng)視頻推流/拉流的簡單實(shí)現(xiàn)

    ESP32-CAM網(wǎng)絡(luò)攝像頭系列-01-基于RTSP協(xié)議的局域網(wǎng)視頻推流/拉流的簡單實(shí)現(xiàn)

    ????????由于項(xiàng)目需要,最近開始開坑關(guān)于ESP32-CAM系列的RTSP網(wǎng)絡(luò)攝像頭系列,該文章為該系列的第一篇文章。用于記錄項(xiàng)目開發(fā)過程。 ? ? ? ? 使用ESP32-CAM獲取圖像數(shù)據(jù),并通過RTSP協(xié)議將獲取到的視頻流傳輸?shù)缴衔粰C(jī)進(jìn)行顯示。 ????????使用ESP32-CAM進(jìn)行視頻推流,

    2024年02月11日
    瀏覽(122)
  • 基于ESP32-CAM的RSTP協(xié)議網(wǎng)絡(luò)攝像頭

    基于ESP32-CAM的RSTP協(xié)議網(wǎng)絡(luò)攝像頭

    開發(fā)環(huán)境:Arduino。 程序語言:C語言。 ESP32-CAM: ESP32 CAM 產(chǎn)品特性 采用低功耗雙核32位CPU,可作應(yīng)用處理器 主頻高達(dá)240MHz,運(yùn)算能力高達(dá) 600 DMIPS 內(nèi)置 520 KB SRAM,外置8MB PSRAM 支持UART/SPI/I2C/PWM/ADC/DAC等接口 支持OV2640和OV7670攝像頭,內(nèi)置閃光燈 支持圖片WiFI上傳 支持TF卡 支持多

    2024年02月16日
    瀏覽(60)
  • 基于TCP/IP協(xié)議的網(wǎng)絡(luò)攝像頭的QT項(xiàng)目

    基于TCP/IP協(xié)議的網(wǎng)絡(luò)攝像頭的QT項(xiàng)目

    目錄 項(xiàng)目簡述: 1.服務(wù)器 ?步驟一:首先搭建一個(gè)基本的服務(wù)器框架。 ?1.初始化服務(wù)器的函數(shù)主體 ?2.等待連接 步驟二:數(shù)據(jù)庫的使用,本次項(xiàng)目使用的Sqlite3數(shù)據(jù)庫 1.數(shù)據(jù)庫初始化 2.登錄時(shí)使用數(shù)據(jù)庫? 3.注冊(cè)時(shí)使用數(shù)據(jù)庫 步驟三:攝像頭的調(diào)用與數(shù)據(jù)傳輸 1.V4L2框架的使

    2024年02月03日
    瀏覽(28)
  • Ubuntu18.04中用ROS驅(qū)動(dòng)外接USB攝像頭

    Ubuntu18.04中用ROS驅(qū)動(dòng)外接USB攝像頭

    問題描述: 在學(xué)習(xí)古月居ROS機(jī)器人開發(fā)實(shí)踐第7章機(jī)器視覺過程中,按照書中的指令驅(qū)動(dòng)USB攝像頭打開的是筆記本電腦自帶的攝像頭,然后網(wǎng)上各種找教程去驅(qū)動(dòng)USB外接的攝像頭,終于解決問題,成功驅(qū)動(dòng)外接USB攝像頭! ? 1 首先確定USB攝像頭已經(jīng)連接到電腦的USB接口上。

    2024年02月15日
    瀏覽(26)
  • DroidCam---將手機(jī)轉(zhuǎn)為電腦外接攝像頭的軟件(提供下載鏈接)

    DroidCam---將手機(jī)轉(zhuǎn)為電腦外接攝像頭的軟件(提供下載鏈接)

    在做計(jì)算機(jī)視覺的項(xiàng)目時(shí),由于電腦自帶的攝像頭無法活動(dòng),會(huì)造成識(shí)別的相對(duì)困難。同時(shí)手上也無攝像頭設(shè)備,那么人手一部的手機(jī)就可以嘗試成為一個(gè)攝像頭。 鏈接:https://pan.baidu.com/s/1_liaLq6zk5YTFq3j_j4ldw? 提取碼:w1z7 我使用的是window系統(tǒng),手機(jī)是安卓機(jī)。電腦和手機(jī)都

    2024年02月10日
    瀏覽(108)
  • 基于android的 rk3399 同時(shí)支持多個(gè)USB攝像頭

    基于android的 rk3399 同時(shí)支持多個(gè)USB攝像頭

    一、前文 在這里插入圖片描述 二、CameraHal_Module.h 三、CameraHal_Module.cpp 四、編譯燒錄Image 該部分的修改要生效的話,需要進(jìn)行全編譯 五、App驗(yàn)證 AndroidManifest.xml MainActivity.java activity_main.xml

    2024年02月08日
    瀏覽(20)
  • ffmpeg+nginx實(shí)現(xiàn)rtsp協(xié)議攝像頭web端播放

    ffmpeg+nginx實(shí)現(xiàn)rtsp協(xié)議攝像頭web端播放

    nginx(需要安裝rtmp模塊) ffmpeg 6.0 vlc播放器(本地播放驗(yàn)證) 這些資源已經(jīng)上傳需要的可以自己下載,這個(gè)壓縮包里的nginx已經(jīng)安裝好所需模塊,解壓即可使用 下載地址 如果你使用的是??低暤脭z像頭構(gòu)成一般為rtsp://攝像頭用戶名:密碼@攝像頭IP:攝像頭端口/Streaming/Chann

    2024年02月14日
    瀏覽(20)
  • Android-WebRTC-實(shí)現(xiàn)攝像頭顯示

    EglBase是什么? 它提供了一個(gè)接口,用于在Android平臺(tái)上創(chuàng)建和管理EGL(嵌入式系統(tǒng)圖形庫)上下文,以便在WebRTC中進(jìn)行圖像和視頻的處理和渲染。 Capturer, Source, Track, Sink分別是什么? Capturer(采集器)是指用于采集音頻或視頻數(shù)據(jù)的設(shè)備或軟件。它可以是麥克風(fēng)、攝像頭或其

    2024年02月15日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包