RK3568平台 安卓hal3适配usb camera
一.RK安卓hal3 camera框架

Camera hal3 在 android 框架中所处的位置如上图, 对上,主要实现 Framework 一整套 API 接口,响应其 控制命令,返回数据与控制参数结果。 对下, 主要是通 V4l2 框架实现与 kernel 的交互。3a 控制则是通 control loop 接口与 camera_engine_isp 交互。 另外,其中一些组件或功能的实现也会调用到其他一些第三方 库, 如 cameraBuffer 相关,会调用到 Galloc 相关库, jpeg 编码则会调用到 Hwjpeg 相关库。
二.Camera hal3 与 Frame work 交互时序

三.usbcamera调试

首先硬件给usb供电,供电后插上usbcamera可以看到新生成的pid vid。
ls /dev/video*

新生成了video1 video2.
media-ctl -d /dev/media0 -p
1|console:/ # media-ctl -d /dev/media0 -p
Opening media device /dev/media0
Enumerating entities
Found 4 entities
Enumerating pads and links
Media controller API version 0.0.189Media device information
------------------------
driver uvcvideo
model USB2.0 PC CAMERA: USB2.0 PC CAM
serial
bus info usb-fc880000.usb-1.3
hw revision 0x100
driver version 0.0.189Device topology
- entity 1: USB2.0 PC CAMERA: USB2.0 PC CAM (1 pad, 1 link)type Node subtype V4Ldevice node name /dev/video1pad0: Sink<- "Processing 2":1 [ENABLED,IMMUTABLE]- entity 4: USB2.0 PC CAMERA: USB2.0 PC CAM (0 pad, 0 link)type Node subtype V4Ldevice node name /dev/video2- entity 8: Processing 2 (2 pads, 2 links)type V4L2 subdev subtype Unknownpad0: Sink
v4l2_subdev_open: Failed to open subdev device node<- "Input 1":0 [ENABLED,IMMUTABLE]pad1: Source
v4l2_subdev_open: Failed to open subdev device node-> "USB2.0 PC CAMERA: USB2.0 PC CAM":0 [ENABLED,IMMUTABLE]- entity 11: Input 1 (1 pad, 1 link)type V4L2 subdev subtype Sensorpad0: Source
v4l2_subdev_open: Failed to open subdev device node-> "Processing 2":0 [ENABLED,IMMUTABLE]
查看拓扑图,生成新的video1 video2.
dumpsys media.camera
onsole:/ # dumpsys media.camera== Service global info: ==Number of camera devices: 1
Number of normal camera devices: 1
Number of public camera devices visible to API1: 1Device 0 maps to "101"
Active Camera Clients:
[]
Allowed user IDs: 0== Camera service events log (most recent at top): ==02-01 18:52:22 : ADD device 101, reason: (Device added)02-01 18:50:29 : REMOVE device 101, reason: (Device status changed from 1 to 0)02-01 18:08:37 : DISCONNECT device 101 client for package com.android.camera2 (PID 6195)02-01 18:08:37 : CONNECT device 101 client for package com.android.camera2 (PID 6195)02-01 18:06:25 : ADD device 101, reason: (Device added)02-01 18:06:16 : REMOVE device 101, reason: (Device status changed from 1 to 0)02-01 18:03:23 : ADD device 101, reason: (Device added)02-01 18:01:26 : REMOVE device 101, reason: (Device status changed from 1 to 0)02-01 18:00:53 : DISCONNECT device 101 client for package com.android.camera2 (PID 4701)02-01 18:00:53 : CONNECT device 101 client for package com.android.camera2 (PID 4701)02-01 18:00:34 : DISCONNECT device 101 client for package com.android.camera2 (PID 3004)02-01 18:00:34 : CONNECT device 101 client for package com.android.camera2 (PID 3004)02-01 18:00:29 : DISCONNECT device 101 client for package com.android.camera2 (PID 3004)02-01 18:00:29 : CONNECT device 101 client for package com.android.camera2 (PID 3004)02-01 18:00:04 : ADD device 101, reason: (Device added)02-01 18:00:01 : USER_SWITCH previous allowed user IDs: <None>, current allowed user IDs: 0== Camera device 101 dynamic info: ==Device 101 is closed, no client instance
== Camera Provider HAL external/0-0 (v2.5, remote) static info: 1 devices: ==
== Camera HAL device device@3.4/external/101 (v3.4) static information: ==Resource cost: 100Conflicting devices: NoneAPI1 info:Has a flash unit: falseFacing: FrontOrientation: 0API2 camera characteristics:Dumping camera metadata array: 55 / 55 entries, 2048 / 2048 bytes of extra data.Version: 1, Flags: 00000000android.info.supportedHardwareLevel (150000): byte[1][EXTERNAL ]android.colorCorrection.availableAberrationModes (00004): byte[1][0 ]android.control.aeAvailableAntibandingModes (10012): byte[1][3 ]android.control.maxRegions (1001c): int32[3][0 0 0 ]android.control.availableVideoStabilizationModes (1001a): byte[1][0 ]android.control.awbAvailableModes (1001b): byte[1][1 ]android.control.aeAvailableModes (10013): byte[1][1 ]android.control.availableEffects (10018): byte[1][0 ]android.control.availableModes (10026): byte[2][0 1 ]android.edge.availableEdgeModes (30002): byte[1][0 ]android.flash.info.available (50000): byte[1][FALSE ]android.hotPixel.availableHotPixelModes (60001): byte[1][0 ]android.jpeg.availableThumbnailSizes (70007): int32[14][0 0 176 144 ][240 144 256 144 ][240 160 256 154 ][240 180 ]android.jpeg.maxSize (70008): int32[1][3145728 ]android.lens.info.focusDistanceCalibration (90007): byte[1][UNCALIBRATED ]android.lens.info.availableOpticalStabilization (90003): byte[1][0 ]android.lens.facing (80005): byte[1][FRONT ]android.noiseReduction.availableNoiseReductionModes (a0002): byte[1][0 ]android.noiseReduction.mode (a0000): byte[1][OFF ]android.request.partialResultCount (c000b): int32[1][1 ]android.request.pipelineMaxDepth (c000a): byte[1][4 ]android.request.maxNumOutputStreams (c0006): int32[3][0 2 1 ]android.request.maxNumInputStreams (c0008): int32[1][0 ]android.scaler.availableMaxDigitalZoom (d0004): float[1][4.00000000 ]android.scaler.croppingType (d000d): byte[1][CENTER_ONLY ]android.sensor.availableTestPatternModes (e0019): int32[2][0 1 ]android.sensor.info.timestampSource (f0008): byte[1][UNKNOWN ]android.sensor.orientation (e000e): int32[1][0 ]android.shading.availableModes (100002): byte[1][0 ]android.statistics.info.availableFaceDetectModes (120000): byte[1][0 ]android.statistics.info.maxFaceCount (120002): int32[1][0 ]android.statistics.info.availableHotPixelMapModes (120006): byte[1][0 ]android.statistics.info.availableLensShadingMapModes (120007): byte[1][0 ]android.sync.maxLatency (170001): int32[1][UNKNOWN ]android.request.availableRequestKeys (c000d): int32[28][3 65536 65537 65538 ][65539 65542 65541 65543 ][65545 65546 65547 65549 ][65550 65551 65552 65553 ][262146 458755 458756 458757 ][458758 524292 655360 851968 ][917528 1114112 1114115 65583 ]android.request.availableResultKeys (c000e): int32[35][3 65536 65537 65538 ][65539 65542 65567 65541 ][65543 65568 65545 65546 ][65547 65570 65549 65550 ][65551 65552 65553 262146 ][262149 458755 458756 458757 ][458758 524292 655360 786441 ][851968 917520 1114112 1114115 ][1114128 1114126 65583 ]android.request.availableCharacteristicsKeys (c000f): int32[43][4 65554 65555 65556 ][65557 65558 65572 65559 ][65560 65574 65561 65562 ][65563 65573 65564 327680 ][1376256 458759 524293 589827 ][589831 655362 786444 786440 ][786438 786443 786442 851972 ][851978 851981 983040 983044 ][983046 983050 983048 917518 ][1048578 1179648 1179654 1179655 ][1179650 1507329 65582 ]android.control.aeCompensationRange (10015): int32[2][0 0 ]android.control.aeCompensationStep (10016): rational[1][(0 / 1) ]android.control.afAvailableModes (10017): byte[2][1 0 ]android.control.availableSceneModes (10019): byte[1][0 ]android.control.aeLockAvailable (10024): byte[1][FALSE ]android.control.awbLockAvailable (10025): byte[1][FALSE ]android.scaler.availableStreamConfigurations (d000a): int32[72][33 160 120 OUTPUT ][35 160 120 OUTPUT ][34 160 120 OUTPUT ][33 176 144 OUTPUT ][35 176 144 OUTPUT ][34 176 144 OUTPUT ][33 320 240 OUTPUT ][35 320 240 OUTPUT ][34 320 240 OUTPUT ][33 352 288 OUTPUT ][35 352 288 OUTPUT ][34 352 288 OUTPUT ][33 640 480 OUTPUT ][35 640 480 OUTPUT ][34 640 480 OUTPUT ][33 800 600 OUTPUT ][35 800 600 OUTPUT ][34 800 600 OUTPUT ]android.scaler.availableMinFrameDurations (d000b): int64[72][33 160 ][120 33333333 ][35 160 ][120 33333333 ][34 160 ][120 33333333 ][33 176 ][144 33333333 ][35 176 ][144 33333333 ][34 176 ][144 33333333 ][33 320 ][240 33333333 ][35 320 ][240 33333333 ][34 320 ][240 33333333 ][33 352 ][288 33333333 ][35 352 ][288 33333333 ][34 352 ][288 33333333 ][33 640 ][480 33333333 ][35 640 ][480 33333333 ][34 640 ][480 33333333 ][33 800 ][600 33333333 ][35 800 ][600 33333333 ][34 800 ][600 33333333 ]android.scaler.availableStallDurations (d000c): int64[72][33 160 ][120 1000000000 ][35 160 ][120 0 ][34 160 ][120 0 ][33 176 ][144 1000000000 ][35 176 ][144 0 ][34 176 ][144 0 ][33 320 ][240 1000000000 ]
dump出来可以看到生成新的cameraid。
Number of camera devices: 1
Number of normal camera devices: 1
v4l2-ctl -d /dev/video1 --all
查看video1信息
130|console:/ # v4l2-ctl -d /dev/video1 --all
Driver Info:Driver name : uvcvideoCard type : USB2.0 PC CAMERA: USB2.0 PC CAMBus info : usb-fc880000.usb-1.3Driver version : 5.10.189Capabilities : 0x84a00001Video CaptureMetadata CaptureStreamingExtended Pix FormatDevice CapabilitiesDevice Caps : 0x04200001Video CaptureStreamingExtended Pix Format
Media Driver Info:Driver name : uvcvideoModel : USB2.0 PC CAMERA: USB2.0 PC CAMSerial :Bus info : usb-fc880000.usb-1.3Media version : 5.10.189Hardware revision: 0x00000100 (256)Driver version : 5.10.189
Interface Info:ID : 0x03000002Type : V4L Video
Entity Info:ID : 0x00000001 (1)Name : USB2.0 PC CAMERA: USB2.0 PC CAMFunction : V4L2 I/OPad 0x01000007 : SinkLink 0x0200000d: from remote pad 0x100000a of entity 'Processing 2': Data, Enabled, Immutable
Priority: 2
Video input : 0 (Input 1: ok)
Format Video Capture:Width/Height : 640/480Pixel Format : 'YUYV'Field : NoneBytes per Line : 1280Size Image : 614400Colorspace : DefaultTransfer Function : Default (maps to Rec. 709)YCbCr/HSV Encoding: Default (maps to ITU-R 601)Quantization : Default (maps to Limited Range)Flags :
Crop Capability Video Capture:Bounds : Left 0, Top 0, Width 640, Height 480Default : Left 0, Top 0, Width 640, Height 480Pixel Aspect: 1/1
Selection: crop_default, Left 0, Top 0, Width 640, Height 480, Flags:
Selection: crop_bounds, Left 0, Top 0, Width 640, Height 480, Flags:
Streaming Parameters Video Capture:Capabilities : timeperframeFrames per second: 30.000 (30/1)Read buffers : 0brightness 0x00980900 (int) : min=0 max=255 step=1 default=128 value=128contrast 0x00980901 (int) : min=0 max=255 step=1 default=135 value=135saturation 0x00980902 (int) : min=0 max=255 step=1 default=75 value=75hue 0x00980903 (int) : min=-127 max=127 step=1 default=0 value=0gamma 0x00980910 (int) : min=1 max=8 step=1 default=4 value=4power_line_frequency 0x00980918 (menu) : min=0 max=2 default=1 value=1sharpness 0x0098091b (int) : min=0 max=15 step=1 default=5 value=5backlight_compensation 0x0098091c (int) : min=1 max=5 step=1 default=1 value=1
v4l2-ctl -d /dev/video1 --list-formats-ext
查看video1支持的格式和分辨率
console:/ # v4l2-ctl -d /dev/video1 --list-formats-ext
ioctl: VIDIOC_ENUM_FMTIndex : 0Type : Video CapturePixel Format: 'YUYV'Name : YUYV 4:2:2Size: Discrete 640x480Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.067s (15.000 fps)Size: Discrete 352x288Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.067s (15.000 fps)Size: Discrete 320x240Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.067s (15.000 fps)Size: Discrete 176x144Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.067s (15.000 fps)Size: Discrete 160x120Interval: Discrete 0.033s (30.000 fps)Interval: Discrete 0.067s (15.000 fps)
分析:此时打开usbcamera的画面是黑屏,查看hal3 camera框架里面适配的分辨率和视频格式是否支持yuvv,最大的分辨率为640*480.
四.代码修改点亮usbcamera
--- a/rk3588_an13/device/rockchip/common/external_camera_config.xml
+++ b/rk3588_an13/device/rockchip/common/external_camera_config.xml
@@ -7,7 +7,8 @@<!-- See ExternalCameraUtils.cpp for default values of Device configurations below--><Device><!-- Max JPEG buffer size in bytes-->
- <MaxJpegBufferSize bytes="3145728"/> <!-- 3MB (~= 1080p YUV420) -->
+ <!-- MaxJpegBufferSize bytes="3145728"/> --> <!-- 3MB (~= 1080p YUV420) -->
+ <MaxJpegBufferSize bytes="13631488"/> <!-- 13MB 1300w pixel (~= 4k YUV420) --><!-- Size of v4l2 buffer queue when streaming >= 30fps --><!-- Larger value: more request can be cached pipeline (less janky) --><!-- Smaller value: use less memory -->
--- a/rk3588_an13/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h
+++ b/rk3588_an13/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h
@@ -199,11 +199,11 @@ struct Parameters {// Max preview size allowed// This is set to a 1:1 value to allow for any aspect ratio that has// a max long side of 1920 pixels
- static const unsigned int MAX_PREVIEW_WIDTH = 1920;
- static const unsigned int MAX_PREVIEW_HEIGHT = 1920;
+ static const unsigned int MAX_PREVIEW_WIDTH = 640;
+ static const unsigned int MAX_PREVIEW_HEIGHT = 480;// Initial max preview/recording size bound
- static const int MAX_INITIAL_PREVIEW_WIDTH = 1920;
- static const int MAX_INITIAL_PREVIEW_HEIGHT = 1080;
+ static const int MAX_INITIAL_PREVIEW_WIDTH = 640;
+ static const int MAX_INITIAL_PREVIEW_HEIGHT = 480;
--- a/rk3588_an13/hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp
+++ b/rk3588_an13/hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp
@@ -52,7 +52,7 @@ constexpr int MAX_RETRY = 5; // Allow retry v4l2 open failures a few times.constexpr int OPEN_RETRY_SLEEP_US = 100000; // 100ms * MAX_RETRY = 0.5 secondsstatic uint Camera_Resolution[][2] = {{320,240},/*{352,288},*/
- {640,480},{800,600},/*{1280,720},{1280,960},{1920,1080},{2048,1536},{2560,1440},{2592,1944},{2592,1456},*/
+ {640,480},/*{800,600},{1280,720},{1280,960},{1920,1080},{2048,1536},{2560,1440},{2592,1944},{2592,1456},*/{0,0}};} // anonymous namespace
@@ -444,7 +444,8 @@ status_t ExternalCameraDevice::initDefaultCharsKeys(256, 144,240, 160,256, 154,
- 240, 180};
+ 240, 180,
+ 640, 480};UPDATE(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, jpegAvailableThumbnailSizes,ARRAY_SIZE(jpegAvailableThumbnailSizes));
--- a/rk3588_an13/hardware/interfaces/camera/device/3.4/default/RgaCropScale.cpp
+++ b/rk3588_an13/hardware/interfaces/camera/device/3.4/default/RgaCropScale.cpp
@@ -38,6 +38,11 @@ namespace camera2 {#define RGA_ACTIVE_H (2048)#define RGA_VIRTUAL_H (2048)+#define RGA_ACTIVE_W (640)
+#define RGA_VIRTUAL_W (640)
+#define RGA_ACTIVE_H (480)
+#define RGA_VIRTUAL_H (480)
+#endif
相关文章:
RK3568平台 安卓hal3适配usb camera
一.RK安卓hal3 camera框架 Camera hal3 在 android 框架中所处的位置如上图, 对上,主要实现 Framework 一整套 API 接口,响应其 控制命令,返回数据与控制参数结果。 对下, 主要是通 V4l2 框架实现与 kernel 的交互。3a…...
使用 Visual Studio Code 在远程计算机上调试 PostgreSQL
使用 Visual Studio Code 在远程计算机上调试 PostgreSQL 1. 概述 PostgreSQL 是一个功能强大的开源关系数据库管理系统,适用于各种应用程序。在开发过程中,调试 PostgreSQL 对于识别和解决问题至关重要。在本博客中,我们将手把手教你使用客…...
javascript设计模式之建造者
工厂模式不关心过程,只关心结果,这与建造者相反,建造者更关心的是过程, 这里我们创建一个基类,其拥有技能跟爱好两个属性,还有两个实例方法用来获取技能跟爱好 // 基类 let Human function (param {}) …...
安擎科技携手华为云区块链共同打造安全天空
当前,低空经济崛起,无人机多并发、混合运行时引发的网络信息安全、空域安全问题已成行业首要课题。 在2024年1月正式实施的《民用无人驾驶航空器运行安全管理规则》(CCAR-92)第549条中规定,“无人驾驶航空器航行服务提…...
学习数据结构的第一天
结构体 如何定义结构体 1、先定义结构体类型,再定义结构体类型变量 struct student/定义学生结构体类型/ { long number; char name[20]; char sex; int age; float score[3];/三科考试成绩/ }2、定义结构体类型同时定义结构体类型变量 struct student/定义学生结…...
5.electron之主进程起一个本地服务
如果可以实现记得点赞分享,谢谢老铁~ Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 Electron 将 Chromium 和 Node.js 嵌入到了一个二进制文件中,因此它允许你仅需一个代码仓库,就可以撰写支持 Windows、…...
爬取58二手房并用SVR模型拟合
目录 一、前言 二、爬虫与数据处理 三、模型 一、前言 爬取数据仅用于练习和学习。本文运用二手房规格sepc(如3室2厅1卫)和二手房面积area预测二手房价格price,只是练习和学习,不代表任何实际意义。 二、爬虫与数据处理 import requests import cha…...
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之RichText组件
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之RichText组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、RichText组件 鸿蒙(HarmonyOS)富文本组件,…...
7.electron之渲染线程发送事件,主进程监听事件
如果可以实现记得点赞分享,谢谢老铁~ Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 Electron 将 Chromium 和 Node.js 嵌入到了一个二进制文件中,因此它允许你仅需一个代码仓库,就可以撰写支持 Windows、…...
thinkphp6入门(19)-- 中间件向控制器传参
可以通过给请求对象赋值的方式传参给控制器(或者其它地方),例如 <?phpnamespace app\middleware;class Hello {public function handle($request, \Closure $next){$request->hello ThinkPHP;return $next($request);} } 然后在控制…...
Flink Format系列(2)-CSV
Flink的csv格式支持读和写csv格式的数据,只需要指定 format csv,下面以kafka为例。 CREATE TABLE user_behavior (user_id BIGINT,item_id BIGINT,category_id BIGINT,behavior STRING,ts TIMESTAMP(3) ) WITH (connector kafka,topic user_behavior…...
Spring Data Envers 数据审计实战2 - 自定义监听程序扩展审计字段及字段值
上篇讲述了如何在Spring项目中集成Spring Data Envers做数据审计和历史版本查看功能。 之前演示的是业务表中已有的字段进行审计,那么如果我们想扩展审计字段呢? 比如目前对员工表加入了Audited审计,员工表有个字段为dept_id,为…...
一个 SpringBoot 项目能同时处理多少请求?
目录 1 问题分析 2 Demo 3 答案 4 怎么来的? 5 标准答案及影响参数一Tomcat配置 6 影响参数二 Web容器 7 影响参数三 Async 1 问题分析 一个 SpringBoot 项目能同时处理多少请求? 不知道你听到这个问题之后的第一反应是什么? 我大概…...
计算机网络——网络
计算机网络——网络 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU)前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家, [跳转到网站](https://www.captainbed.cn/qianqiu) 无线网络和移动网…...
C语言探索:选择排序的实现与解读
当我们需要对一组数据进行排序时,选择排序(Selection Sort)是一种简单但效率较低的排序算法。它的基本思想是每次从未排序的数据中选择最小(或最大)的元素,然后将其放置在已排序序列的末尾。通过重复这个过…...
Golang 学习(二)进阶使用
二、进阶使用 性能提升——协程 GoRoutine go f();一个 Go 线程上,可以起多个协程(有独立的栈空间、共享程序堆空间、调度由用户控制)主线程是一个物理线程,直接作用在 cpu 上的。是重量级的,非常耗费 cpu 资源。协…...
ubuntu22.04@laptop OpenCV定制化安装
ubuntu22.04laptop OpenCV定制化安装 1. 源由2. 默认配置3. 定制配置4. 定制安装5. 定制OpenCV-4.9.05.1 修改opencv.conf5.2 加载so文件5.3 修改bash环境变量5.4 增加pkgconfig5.5 检查OpenCV-4.9.0安装 6. 总结7. 参考资料 1. 源由 目前,能Google到的代码层次不齐…...
linux系统非关系型数据库redis
redis 介绍redis的特点:缓存 安装安装单机版redisredis的相关工具 介绍 redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库 redis的官网:redis.ioredis的特点: 丰富的数据结构 支持持久化 支持事务 支持主从缓存 类型 …...
【LeetCode: 292. Nim 游戏+ 博弈问题】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
Android 9.0 禁用adb reboot recovery命令实现正常重启功能
1.前言 在9.0的系统rom定制化开发中,在定制recovery模块的时候,由于产品开发需要要求禁用recovery的相关功能,比如在通过adb命令的 adb reboot recovery的方式进入recovery也需要实现禁用,所以就需要了解相关进入recovery流程来禁用该功能 2.禁用adb reboot recovery命…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
