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

RK3568 android11 移植 v4l2loopback 虛擬攝像頭

這篇具有很好參考價(jià)值的文章主要介紹了RK3568 android11 移植 v4l2loopback 虛擬攝像頭。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一,v4l2loopback 簡(jiǎn)介

v4l2loopback是一個(gè)Linux內(nèi)核模塊,它允許用戶創(chuàng)建虛擬視頻設(shè)備。這種虛擬視頻設(shè)備可以用于各種用途,例如將實(shí)際攝像頭的視頻流復(fù)制到虛擬設(shè)備上,或者用于視頻流的處理和分析等。v4l2loopback的主要作用是創(chuàng)建一個(gè)虛擬的Video4Linux2設(shè)備,它可以接收來(lái)自其他應(yīng)用程序的視頻數(shù)據(jù),并將這些數(shù)據(jù)提供給其他應(yīng)用程序
一旦加載了v4l2loopback模塊,就可以在/dev目錄下找到虛擬設(shè)備文件,通常命名為/dev/videoX(X是一個(gè)數(shù)字)。

二,驅(qū)動(dòng)文件配置

1. v4l2loopback 內(nèi)核模塊驅(qū)動(dòng)文件

RK3568 android11 移植 v4l2loopback 虛擬攝像頭,RockChip平臺(tái) 調(diào)試記錄,android,rk3568,音視頻,虛擬攝像頭,v4l2loopback

1> v4l2loopback.c: v4l2loopback 內(nèi)核模塊的 C 語(yǔ)言源代碼文件。它包含了實(shí)現(xiàn) v4l2loopback 模塊功能的代碼。
2> v4l2loopback.h: v4l2loopback 內(nèi)核模塊的頭文件,通常包含一些宏定義、結(jié)構(gòu)體定義、函數(shù)聲明等。
3> v4l2loopback_formats.h:這個(gè)文件包含了有關(guān)視頻格式的定義和處理,用于支持 v4l2loopback 模塊對(duì)不同視頻格式的處理和轉(zhuǎn)換。

2. 移植 v4l2loopback驅(qū)動(dòng)

a. 將驅(qū)動(dòng)(v4l2loopback)拷貝到下面的文件夾:

./kernel/drivers/v4l2loopback

b. 在 Makefile 中添加 v4l2loopback設(shè)備

kernel/drivers/Makefile中添加:
+obj-y                           +=v4l2loopback/

c. 編譯kernel后會(huì)在目錄下生成對(duì)應(yīng)的.o文件

~/RK3568_Android11/kernel/drivers/v4l2loopback$ ls
built-in.a  Makefile  modules.builtin  modules.order  v4l2loopback.c  v4l2loopback_formats.h  v4l2loopback.h  v4l2loopback.o

d. 驗(yàn)證 v4l2loopback.ko 模塊是否加載成功
RK3568 android11 移植 v4l2loopback 虛擬攝像頭,RockChip平臺(tái) 調(diào)試記錄,android,rk3568,音視頻,虛擬攝像頭,v4l2loopback
設(shè)備 video9 就是 v4l2loopback.ko 模塊驅(qū)動(dòng)的設(shè)備,確認(rèn)v4l2loopback.ko 模塊移植成功。


三,hardware下整合v4l2loopback 虛擬攝像頭設(shè)備

源碼目錄:hardware/interfaces/camera/
修改補(bǔ)丁如下:

diff --git a/camera/device/3.4/default/ExternalCameraDevice.cpp b/camera/device/3.4/default/ExternalCameraDevice.cpp
index ec3264894..c2a1f4156 100755
--- a/camera/device/3.4/default/ExternalCameraDevice.cpp
+++ b/camera/device/3.4/default/ExternalCameraDevice.cpp
@@ -22,6 +22,8 @@
 #include <array>
 #include <regex>
 #include <linux/videodev2.h>
+#include <linux/v4l2-subdev.h>
+#include <linux/videodev2.h>
 #include "android-base/macros.h"
 #include "CameraMetadata.h"
 #include "../../3.2/default/include/convert.h"
@@ -373,6 +395,7 @@ status_t ExternalCameraDevice::initDefaultCharsKeys(
     UPDATE(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
            &opticalStabilizationMode, 1);
 
+    ALOGD("=========mCameraId.c_str():%s ANDROID_LENS_FACING_EXTERNAL:%d========", mCameraId.c_str(), ANDROID_LENS_FACING_EXTERNAL);
     const uint8_t facing = ANDROID_LENS_FACING_EXTERNAL;
     UPDATE(ANDROID_LENS_FACING, &facing, 1);
 
@@ -831,6 +854,16 @@ void ExternalCameraDevice::getFrameRateList(
         }
     }
 
+    struct v4l2_capability capability_v4l2;
+    int ret_query_v4l2 = ioctl(fd, VIDIOC_QUERYCAP, &capability_v4l2);
+    if (ret_query_v4l2 < 0) {
+        ALOGE("%s v4l2 QUERYCAP %s failed: %s", __FUNCTION__, strerror(errno));
+    }
+    if(strstr((const char*)capability_v4l2.driver,"v4l2")){
+        LOGD("======%s: capability_v4l2.driver:%s ========", __func__, capability_v4l2.driver);
+        SupportedV4L2Format::FrameRate fr = {1,30}; //特定幀率(1幀每秒到30幀每秒)添加到 format->frameRates 向量中
+        format->frameRates.push_back(fr);
+    }
     if (format->frameRates.empty()) {
         ALOGE("%s: failed to get supported frame rates for format:%c%c%c%c w %d h %d",
                 __FUNCTION__,
@@ -917,6 +950,12 @@ std::vector<SupportedV4L2Format> ExternalCameraDevice::getCandidateSupportedForm
     int ret = 0;
     while (ret == 0) {
         ret = TEMP_FAILURE_RETRY(ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc));
+        if(ret < 0 && strstr((const char*)capability.driver, "v4l2")) {
+            ALOGE("driver.find :%s",capability.driver);
+            fmtdesc.pixelformat = V4L2_PIX_FMT_NV12; 
+			ret = 0;
+        }
         ALOGV("index:%d,ret:%d, format:%c%c%c%c", fmtdesc.index, ret,
                 fmtdesc.pixelformat & 0xFF,
                 (fmtdesc.pixelformat >> 8) & 0xFF,
@@ -963,6 +1002,39 @@ std::vector<SupportedV4L2Format> ExternalCameraDevice::getCandidateSupportedForm
                     }
                 }
             }
+            if(strstr((const char*)capability.driver, "v4l2")) {
+					ALOGD("driver.find :%s",capability.driver);
+					SupportedV4L2Format format_1920x1080 {
+                            .width = 1920,
+                            .height = 1080,
+                            .fourcc = V4L2_PIX_FMT_NV12
+                        };
+					updateFpsBounds(fd, cropType, fpsLimits, format_1920x1080, outFmts);//名為 updateFpsBounds 的函數(shù),向其傳遞了一些參數(shù),包括文件描述符 fd、crop 類型、幀率限制、format_1920x1080 結(jié)構(gòu)和 outFmts
+					ret = -1;
+                }
         }
         fmtdesc.index++;
     }
diff --git a/camera/device/3.4/default/ExternalCameraDeviceSession.cpp b/camera/device/3.4/default/ExternalCameraDeviceSession.cpp
index e2ab4fa2f..664d7d262 100644
--- a/camera/device/3.4/default/ExternalCameraDeviceSession.cpp
+++ b/camera/device/3.4/default/ExternalCameraDeviceSession.cpp
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 #define LOG_TAG "ExtCamDevSsn@3.4"
-//#define LOG_NDEBUG 0
+#define LOG_NDEBUG 0
 #define ATRACE_TAG ATRACE_TAG_CAMERA
 #include <log/log.h>
 
@@ -3104,7 +3104,18 @@ int ExternalCameraDeviceSession::configureV4l2StreamLocked(
             ALOGE("%s: QUERYBUF %d failed: %s", __FUNCTION__, i,  strerror(errno));
             return -errno;
         }
+//fy
+        ALOGD("==========mV4L2Buffer[%d] = (char*)mmap()==========", i);
+        if (buffer.memory == V4L2_MEMORY_MMAP) {
+            mV4L2Buffer[i] = (char*)mmap(0 /* start anywhere */ ,
+                        buffer.length, PROT_READ, MAP_SHARED, mV4l2Fd.get(),
+                        buffer.m.offset);
+            if (mV4L2Buffer[i] == MAP_FAILED) {
+                LOGE("%s(%d): Unable to map buffer(length:0x%x offset:0x%x) %s(err:%d)\n",__FUNCTION__,__LINE__, buffer.length,buffer.m.offset,strerror(errno),errno);
+            }
 
+        }
+        V4l2BufferLen = buffer.length;
         if (TEMP_FAILURE_RETRY(ioctl(mV4l2Fd.get(), VIDIOC_QBUF, &buffer)) < 0) {
             ALOGE("%s: QBUF %d failed: %s", __FUNCTION__, i,  strerror(errno));
             return -errno;
@@ -3401,8 +3412,10 @@ Status ExternalCameraDeviceSession::configureStreams(
         }
     }
     // Find the smallest format that matches the desired aspect ratio and is wide/high enough
-    SupportedV4L2Format v4l2Fmt {.width = 0, .height = 0};
-    SupportedV4L2Format v4l2Fmt_tmp {.width = 0, .height = 0};
+//    SupportedV4L2Format v4l2Fmt {.width = 0, .height = 0};
+//    SupportedV4L2Format v4l2Fmt_tmp {.width = 0, .height = 0};
+//初始化寬度為 1920,高度為 1088,fourcc 值為 V4L2_PIX_FMT_NV12;
+    SupportedV4L2Format v4l2Fmt {.width = 1920, .height = 1088, .fourcc = V4L2_PIX_FMT_NV12};
+    SupportedV4L2Format v4l2Fmt_tmp {.width = 1920, .height = 1088, .fourcc = V4L2_PIX_FMT_NV12};
     for (const auto& fmt : mSupportedFormats) {
         uint32_t dim = (mCroppingType == VERTICAL) ? fmt.width : fmt.height;
         if (dim >= maxDim) {
diff --git a/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraDeviceSession_3.4.h b/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraDeviceSession_3.4.h
index 209c5e91e..027a27ae7 100755
--- a/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraDeviceSession_3.4.h
+++ b/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraDeviceSession_3.4.h
@@ -383,6 +383,9 @@ protected:
     SupportedV4L2Format mV4l2StreamingFmt;
     double mV4l2StreamingFps = 0.0;
     size_t mV4L2BufferCount = 0;
+    #define V4L2_BUFFER_MAX             32
+    char *mV4L2Buffer[V4L2_BUFFER_MAX];
+    unsigned int V4l2BufferLen = 0;
     struct v4l2_plane planes[1];
     struct v4l2_capability mCapability;
 
diff --git a/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraDevice_3_4.h b/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraDevice_3_4.h
index 6e0e4ebab..e085682d4 100644
diff --git a/camera/provider/2.4/default/ExternalCameraProviderImpl_2_4.cpp b/camera/provider/2.4/default/ExternalCameraProviderImpl_2_4.cpp
index 65447421c..a5a74e380 100755
--- a/camera/provider/2.4/default/ExternalCameraProviderImpl_2_4.cpp
+++ b/camera/provider/2.4/default/ExternalCameraProviderImpl_2_4.cpp
@@ -257,6 +257,8 @@ void ExternalCameraProviderImpl_2_4::addExternalCamera(const char* devName) {
 }
 
 void ExternalCameraProviderImpl_2_4::deviceAdded(const char* devName) {
+    ALOGD("=============%s===========", __func__);
+    struct v4l2_capability capability;
     if (std::atoi(devName + kDevicePrefixLen) >= 30)
     {
         sp<device::V3_4::implementation::ExternalFakeCameraDevice> deviceImpl =
@@ -267,14 +269,15 @@ void ExternalCameraProviderImpl_2_4::deviceAdded(const char* devName) {
         }
         deviceImpl.clear();
     } else {
-    {
+        {
+        ALOGD("======fd(::open(devName, O_RDWR)) devName:%s ==========", devName);
         base::unique_fd fd(::open(devName, O_RDWR));
         if (fd.get() < 0) {
             ALOGE("%s open v4l2 device %s failed:%s", __FUNCTION__, devName, strerror(errno));
             return;
         }
 
-        struct v4l2_capability capability;
+//        struct v4l2_capability capability;
         int ret = ioctl(fd.get(), VIDIOC_QUERYCAP, &capability);
         if (ret < 0) {
             ALOGE("%s v4l2 QUERYCAP %s failed", __FUNCTION__, devName);
@@ -289,6 +292,7 @@ void ExternalCameraProviderImpl_2_4::deviceAdded(const char* devName) {
     // See if we can initialize ExternalCameraDevice correctly
     sp<device::V3_4::implementation::ExternalCameraDevice> deviceImpl =
             new device::V3_4::implementation::ExternalCameraDevice(devName, mCfg);
+    ALOGD("=========ExternalCameraDevice(devName:%s======", devName);
     if (deviceImpl == nullptr || deviceImpl->isInitFailed()) {
         ALOGW("%s: Attempt to init camera device %s failed!", __FUNCTION__, devName);
         return;
@@ -296,7 +300,15 @@ void ExternalCameraProviderImpl_2_4::deviceAdded(const char* devName) {
     deviceImpl.clear();
     }
 
-    addExternalCamera(devName);
+    //fy
+    if(capability.device_caps & V4L2_CAP_VIDEO_CAPTURE) {
+        ALOGD("===========dzp_test: devName:%s========", devName);
+        addExternalCamera(devName);
+    }
+    else addExternalCamera(devName);
     return;
 }
 
@@ -331,6 +349,7 @@ ExternalCameraProviderImpl_2_4::HotplugThread::HotplugThread(
 ExternalCameraProviderImpl_2_4::HotplugThread::~HotplugThread() {}
 
 bool ExternalCameraProviderImpl_2_4::HotplugThread::threadLoop() {
+    ALOGD("============%s kDevicePath:%s========", __func__, kDevicePath);
     // Find existing /dev/video* devices
     DIR* devdir = opendir(kDevicePath);
     if(devdir == 0) {
@@ -351,6 +370,7 @@ bool ExternalCameraProviderImpl_2_4::HotplugThread::threadLoop() {
                 snprintf(v4l2DevicePath, kMaxDevicePathLen,
                         "%s%s", kDevicePath, de->d_name);
                 mParent->deviceAdded(v4l2DevicePath);
+                ALOGD("=============v4l2DevicePath:%s ==============", v4l2DevicePath);
             }
         }
     }

  1. 添加虛擬攝像頭設(shè)備接口:在 “hardware/interfaces/camera/” 目錄下可能會(huì)添加或修改相機(jī)設(shè)備的接口,以便 Android 系統(tǒng)可以與 v4l2loopback 虛擬攝像頭進(jìn)行交互。

  2. 實(shí)現(xiàn)虛擬攝像頭設(shè)備功能:可能會(huì)在該目錄下實(shí)現(xiàn)虛擬攝像頭設(shè)備的功能,包括與 Android 相機(jī)框架的集成、數(shù)據(jù)流處理等。

  3. 支持虛擬攝像頭的配置:可能會(huì)對(duì) Android 相機(jī)服務(wù)的配置進(jìn)行修改,以支持虛擬攝像頭設(shè)備的添加和管理。

改動(dòng)的目的是將 v4l2loopback 虛擬攝像頭設(shè)備整合到 Android 系統(tǒng)中,以便應(yīng)用程序可以與虛擬攝像頭進(jìn)行交互,并利用其提供的視頻流數(shù)據(jù)


四,賦予虛擬攝像頭注冊(cè)節(jié)點(diǎn)權(quán)限

device/rockchip/common/ueventd.rockchip.rc中修改:

/dev/video9          0666   media      camera

虛擬攝像頭注冊(cè)節(jié)點(diǎn)設(shè)為666權(quán)限是為了確保所有用戶都能夠訪問(wèn)和使用該節(jié)點(diǎn)。權(quán)限數(shù)字666表示所有用戶都有讀寫權(quán)限,這意味著任何用戶都可以讀取和寫入該節(jié)點(diǎn),從而能夠?qū)μ摂M攝像頭進(jìn)行訪問(wèn)和控制。
例如,如果虛擬攝像頭用于視頻會(huì)議應(yīng)用程序,那么所有參與會(huì)議的用戶都需要能夠訪問(wèn)虛擬攝像頭節(jié)點(diǎn)。
需要注意的是,賦予666權(quán)限也可能存在一定的安全風(fēng)險(xiǎn),因?yàn)檫@樣做會(huì)允許任何用戶都能夠?qū)υ摴?jié)點(diǎn)進(jìn)行讀寫操作。因此,在實(shí)際應(yīng)用中,需要仔細(xì)考慮安全性和訪問(wèn)控制的需求,以確定是否真的需要將虛擬攝像頭節(jié)點(diǎn)權(quán)限設(shè)置為666。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-805121.html

到了這里,關(guān)于RK3568 android11 移植 v4l2loopback 虛擬攝像頭的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(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)文章

  • Linux之V4L2驅(qū)動(dòng)框架

    Linux之V4L2驅(qū)動(dòng)框架

    目錄 一、V4L2簡(jiǎn)介 二、V4L2操作流程 ?1.打開(kāi)攝像頭 2.查詢?cè)O(shè)備的屬性/能力/功能 3.獲取攝像頭支持的格式 4.設(shè)置攝像頭的采集通道 5.設(shè)置/獲取攝像頭的采集格式和參數(shù) 6.申請(qǐng)幀緩沖、內(nèi)存映射、入隊(duì) (1)申請(qǐng)幀緩沖 (2)內(nèi)存映射 (3)入隊(duì) 7.開(kāi)啟視頻采集 8.讀取數(shù)據(jù)、對(duì)數(shù)

    2024年02月08日
    瀏覽(21)
  • 項(xiàng)目之利用 V4L2應(yīng)用程序框架 進(jìn)行視頻錄制

    目錄 知識(shí)儲(chǔ)備: 視頻采集方式: 處理采集數(shù)據(jù): 相關(guān)結(jié)構(gòu)體: 對(duì)于設(shè)備的操作步驟: ????????V4L2較V4L有較大的改動(dòng),并已成為 2.6 的標(biāo)準(zhǔn)接口,函蓋 videodvbFM... ,多數(shù)驅(qū)動(dòng)都在向 V4l2 遷移。更好地了解 V4L2 先從應(yīng)用入手,然后再深入到內(nèi)核中結(jié)合物理設(shè)備/接口的規(guī)范實(shí)現(xiàn)

    2023年04月09日
    瀏覽(18)
  • 汽車IVI中控開(kāi)發(fā)入門及進(jìn)階(十二):V4L2視頻

    前言 ? ? IVI,In-Vehicle Infotainment,智能座艙信息娛樂(lè)系統(tǒng),或稱車載信息娛樂(lè)系統(tǒng), 汽車中控也被稱為車機(jī)、車載多媒體、車載娛樂(lè)等, 它是智能座艙的重要組成部分。IVI 采用車載專用中央處理器,基于車身總線系統(tǒng)和聯(lián)網(wǎng)服務(wù)提供車載綜合信息處理功能,包括音頻播放、

    2024年02月04日
    瀏覽(21)
  • 【C++】開(kāi)源:Linux端V4L2視頻設(shè)備庫(kù)

    【C++】開(kāi)源:Linux端V4L2視頻設(shè)備庫(kù)

    ?? ★,° :.☆( ̄▽ ̄)/$: .°★ ?? 這篇文章主要介紹Linux端V4L2視頻設(shè)備庫(kù)。 無(wú)專精則不能成,無(wú)涉獵則不能通。——梁?jiǎn)⒊?歡迎來(lái)到我的博客,一起學(xué)習(xí),共同進(jìn)步。 喜歡的朋友可以關(guān)注一下,下次更新不迷路?? Video4Linux2( V4L2 )是一個(gè)用于Linux操作系統(tǒng)的視頻設(shè)備驅(qū)動(dòng)框

    2024年02月11日
    瀏覽(21)
  • 內(nèi)存不足V4L2 申請(qǐng)DMC緩存報(bào)錯(cuò)問(wèn)題

    當(dāng)內(nèi)存不足時(shí),V4L2可能存在申請(qǐng)DMA緩存報(bào)錯(cuò),如下日志:

    2024年02月12日
    瀏覽(17)
  • linux v4l2架構(gòu)分析之異步注冊(cè)v4l2_async_subdev_notifier_register、v4l2_async_register_subdev、v4l2_async_notifie

    ? ? ? ? 在camera驅(qū)動(dòng)注冊(cè)中,v4l2_async_subdev_notifier_register、v4l2_async_register_subdev、v4l2_async_notifier_register這幾個(gè)函數(shù)都會(huì)被使用到,三者在異步注冊(cè)的實(shí)現(xiàn)中是緊密關(guān)聯(lián)的,所以本文將三者放在一起進(jìn)行分析。本文主要介紹異步注冊(cè)的功能的整體實(shí)現(xiàn)框架,為了更好把握整體思

    2024年02月14日
    瀏覽(36)
  • Linux攝像頭(v4l2應(yīng)用)——獲取攝像頭一幀圖像

    Linux攝像頭(v4l2應(yīng)用)——獲取攝像頭一幀圖像

    一.V4L2簡(jiǎn)介 V4L2(Video for Linux 2):Linux內(nèi)核中視頻設(shè)備中的驅(qū)動(dòng)框架,對(duì)于應(yīng)用層它提供了一系列的API接口,同時(shí)對(duì)于硬件層,它適配大部分的視頻設(shè)備,因此通過(guò)調(diào)用V4L2的接口函數(shù)可以適配大部分的視頻設(shè)備。 二、操作流程 1.打開(kāi)設(shè)備 當(dāng)把攝像頭插入到電腦后,執(zhí)行l(wèi)s /

    2024年02月20日
    瀏覽(18)
  • c 攝像頭利用v4l2直接生成avi視頻(不利用ffmpeg)

    自定義avi結(jié)構(gòu)頭文件?,F(xiàn)在不能實(shí)時(shí)顯示攝像頭畫面,準(zhǔn)備參照f(shuō)im(終端中顯示圖片),直接對(duì)顯示framebuffer操作,顯示視頻。不用qt等。 生成的視頻根據(jù)機(jī)子的性能不同,詁計(jì)要手動(dòng)調(diào)一下生成視頻的幀率。 播放: $ aplay ?musicdemo.wmv 錄音: $ arecord -c 2 -r 44100 -f S16_LE musicd

    2024年02月08日
    瀏覽(21)
  • rk3568 安卓11 修改android id

    frameworksbasepackagesSettingsProvidersrccomandroidproviderssettingsSettingsProvider.java 系統(tǒng)應(yīng)用獲取的android id 直接寫死 上層普通應(yīng)用 android id跟著sn變化 android id跟著IMEI變化

    2024年04月28日
    瀏覽(20)
  • Linux + 香橙派 + V4L2 + http 實(shí)現(xiàn)遠(yuǎn)程監(jiān)控?cái)z像頭在網(wǎng)頁(yè)端顯示

    Linux + 香橙派 + V4L2 + http 實(shí)現(xiàn)遠(yuǎn)程監(jiān)控?cái)z像頭在網(wǎng)頁(yè)端顯示

    項(xiàng)目需求,需要做一個(gè)基于邊緣端的人臉識(shí)別遠(yuǎn)程監(jiān)控?cái)z像頭并在網(wǎng)頁(yè)前端展示 ,這里采用國(guó)產(chǎn)香橙派作為邊緣計(jì)算終端,安裝ubuntu系統(tǒng),系統(tǒng)中采用v4l2接口對(duì)攝像頭進(jìn)行獲取,當(dāng)客戶端通過(guò)網(wǎng)頁(yè)進(jìn)行請(qǐng)求時(shí),服務(wù)器通過(guò)http服務(wù)的形式將一幀幀圖像發(fā)送給客戶端,只要一秒

    2024年02月15日
    瀏覽(20)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包