RK3528 V4L2 框架 UVC 接口自动获取 H.264 / MJPEG / YUYV 格式:从内核采集到硬解分发

RK3528 V4L2 框架 UVC 接口自动获取 H.264 / MJPEG / YUYV 格式:从内核采集到硬解分发

关键词:RK3528、V4L2、UVC、USB Video Class、视频采集框架、H.264、MJPEG、YUYV、MPP、硬件解码、直播采集


目录

  • [一、为什么 V4L2 是直播采集的总入口](#一、为什么 V4L2 是直播采集的总入口)
  • [二、V4L2 框架技术解析](#二、V4L2 框架技术解析)
    • [2.1 什么是 V4L2:统一视频设备抽象](#2.1 什么是 V4L2:统一视频设备抽象)
    • [2.2 五系统调用 + ioctl 目录的设计哲学](#2.2 五系统调用 + ioctl 目录的设计哲学)
    • [2.3 标准采集状态机:从打开设备到拿到一帧](#2.3 标准采集状态机:从打开设备到拿到一帧)
    • [2.4 格式协商的真相:S_FMT 返回的是"实际生效"](#2.4 格式协商的真相:S_FMT 返回的是"实际生效")
  • [三、UVC 与 V4L2:免驱摄像头如何变成 /dev/videoX](#三、UVC 与 V4L2:免驱摄像头如何变成 /dev/videoX)
    • [3.1 uvcvideo 类驱动把 UVC 暴露为 V4L2 采集节点](#3.1 uvcvideo 类驱动把 UVC 暴露为 V4L2 采集节点)
    • [3.2 三种 UVC 载荷格式与 V4L2 四字码](#3.2 三种 UVC 载荷格式与 V4L2 四字码)
    • [3.3 自动枚举:VIDIOC_ENUM_FMT 列出摄像头能力](#3.3 自动枚举:VIDIOC_ENUM_FMT 列出摄像头能力)
  • [四、RK3528 上的 V4L2 采集链路](#四、RK3528 上的 V4L2 采集链路)
    • [4.1 采集节点与 MPP / RGA 的衔接](#4.1 采集节点与 MPP / RGA 的衔接)
    • [4.2 三格式各自的落地路径](#4.2 三格式各自的落地路径)
    • [4.3 带宽账:高分辨率为什么必须压缩](#4.3 带宽账:高分辨率为什么必须压缩)
  • [五、MEDAI V2 实战:UVC 自动获取三格式](#五、MEDAI V2 实战:UVC 自动获取三格式)
    • [5.1 物理接入:USB 3.0 专属通道](#5.1 物理接入:USB 3.0 专属通道)
    • [5.2 UVC 配置:2160P / 1080P 双档位](#5.2 UVC 配置:2160P / 1080P 双档位)
    • [5.3 信号配置:指定 UVC 为主输入源](#5.3 信号配置:指定 UVC 为主输入源)
    • [5.4 系统状态:确认 UVC 接入规格](#5.4 系统状态:确认 UVC 接入规格)
    • [5.5 自动识别与路由逻辑](#5.5 自动识别与路由逻辑)
  • 六、三格式对比与选型建议
  • 七、排障速查表
  • 八、总结

一、为什么 V4L2 是直播采集的总入口

做直播第一件事往往是插上一台 USB 摄像头。UVC 协议让这件事"免驱即插即用",但很多人没意识到:UVC 解决的是"摄像头如何被操作系统识别",而真正把视频流一帧帧搬进应用内存的,是 Linux 内核里的 V4L2 框架。

换句话说,UVC 让摄像头"被看见",V4L2 让摄像头"被采集"。在 MEDAI V2 这类基于 RK3528 的嵌入式直播设备里,这条链路的起点一定是 V4L2:内核的 uvcvideo 驱动把 UVC 摄像头注册成一个标准的 V4L2 视频节点(典型如 /dev/video0),应用层再通过 V4L2 接口把这路信号拉起来、协商格式、取走每一帧。

而 UVC 摄像头对外能提供的格式通常就三种:H.264(摄像头端已编码)、MJPEG(帧内压缩)、YUYV(未压缩原始 YUV)。本文要讲清楚的就是:V4L2 框架如何用一套固定的 ioctl 状态机,把这三种格式"自动枚举、协商、获取"下来,并交给 RK3528 的硬件(VPU/MPP 与 RGA)完成解码与色彩转换,最终变成可加工、可推流的画面。

二、V4L2 框架技术解析

2.1 什么是 V4L2:统一视频设备抽象

V4L2(Video for Linux 2)是 Linux 内核为视频设备提供的统一用户态接口框架 。它的设计目标是:让应用程序无需关心底层是 USB 摄像头、MIPI 摄像头、采集卡还是电视 tuner,只要设备遵循 V4L2 规范,应用就能用同一套 open / ioctl / mmap 把它驱动起来。

在 MEDAI V2 上,UVC 摄像头、甚至部分内部视频源,最终都表现为 V4L2 设备节点。应用(采集进程)与内核驱动之间,所有"发现能力、设置格式、申请缓冲区、取帧"的交互,都通过一个 ioctl() 系统调用 + 不同的请求码(request code)完成。

2.2 五系统调用 + ioctl 目录的设计哲学

V4L2 一个常被称道的设计是:整套用户态接口只有 5 个系统调用 ------open、close、ioctl、mmap、read/write。之所以能用这么少的入口覆盖千差万别的设备,是因为几乎所有"设备相关的差异"都被塞进了 ioctl() 的参数结构体里,而不是新增系统调用。

ioctl() 携带的请求码构成了一份"目录",常见的几类如下:

请求码 作用
VIDIOC_QUERYCAP 查询设备能力(是不是视频捕获设备、支持哪些缓冲方式)
VIDIOC_ENUM_FMT 枚举设备支持的像素格式(H.264 / MJPEG / YUYV ...)
VIDIOC_ENUM_FRAMESIZES / VIDIOC_ENUM_FRAMEINTERVALS 枚举某格式下的分辨率与帧率
VIDIOC_S_FMT / VIDIOC_G_FMT / VIDIOC_TRY_FMT 设置 / 读取 / 试设像素格式与分辨率
VIDIOC_REQBUFS / VIDIOC_QUERYBUF 申请 / 查询内核缓冲区
VIDIOC_QBUF / VIDIOC_DQBUF 缓冲区入队 / 出队(取走一帧)
VIDIOC_STREAMON / VIDIOC_STREAMOFF 启动 / 停止数据流(驱动 DMA 引擎)

这正是 V4L2 "小而稳"的精髓:应用开发者只要记住这套固定顺序,就能对接任意厂商的摄像头,无需为每种硬件写专用代码。

2.3 标准采集状态机:从打开设备到拿到一帧

一个最典型的 V4L2 采集程序,遵循如下固定状态机:

c 复制代码
int fd = open("/dev/video0", O_RDWR);          // 1. 打开 V4L2 采集节点
struct v4l2_capability cap;
ioctl(fd, VIDIOC_QUERYCAP, &cap);              // 2. 查询能力,确认是 VIDEO_CAPTURE

struct v4l2_fmtdesc f = { .type = V4L2_BUF_TYPE_VIDEO_CAPTURE };
while (ioctl(fd, VIDIOC_ENUM_FMT, &f) == 0) {  // 3. 枚举摄像头支持的格式
    printf("format: %s\n", f.description);     //    依次得到 H264 / MJPEG / YUYV
    f.index++;
}

struct v4l2_format fmt = { .type = V4L2_BUF_TYPE_VIDEO_CAPTURE };
fmt.fmt.pix.width  = 1920;
fmt.fmt.pix.height = 1080;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;  // 4. 请求 MJPEG(或 H264 / YUYV)
ioctl(fd, VIDIOC_S_FMT, &fmt);                 //    驱动返回"实际生效"格式
// 务必读回 fmt.fmt.pix.pixelformat 确认协商结果

struct v4l2_requestbuffers req = {
    .count = 4, .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, .memory = V4L2_MEMORY_MMAP };
ioctl(fd, VIDIOC_REQBUFS, &req);               // 5. 申请 4 个 mmap 缓冲区
// ... VIDIOC_QUERYBUF 查询 + mmap 映射到用户空间 ...

struct v4l2_buffer buf;
ioctl(fd, VIDIOC_QBUF, &buf);                  // 6. 缓冲区入队
ioctl(fd, VIDIOC_STREAMON, &buf.type);         // 7. 启动数据流(驱动开始 DMA 写帧)

while (capturing) {
    ioctl(fd, VIDIOC_DQBUF, &buf);             // 8. 出队,取走一帧
    process_frame(buf);                        //    H264/MJPEG → MPP 硬解;YUYV → 直处理
    ioctl(fd, VIDIOC_QBUF, &buf);              // 9. 处理完重新入队
}

要点:

  • 缓冲区一般申请 4 个(mmap 方式)。太少容易丢帧,太多增加延迟,4 个是嵌入式场景的经验值;
  • VIDIOC_STREAMON 只是启动驱动的 DMA 引擎,之前必须已把所有缓冲区 QBUF 入队 ,否则驱动无处写帧,首个 DQBUF 会一直阻塞;
  • 取帧用 mmap 而非 read/write,避免每帧一次内存拷贝,这也是几乎所有现代 V4L2 驱动的内部实现方式。

2.4 格式协商的真相:S_FMT 返回的是"实际生效"

V4L2 有一个反直觉但极其关键的细节:你不显式设格式,驱动就用默认格式 (往往不是你想要的,比如 640×480 的 YUYV);而即便你显式 VIDIOC_S_FMT,驱动返回的也未必等于你请求的。

原因是驱动可能在内部做格式对齐、分辨率裁剪,甚至格式转换。所以规范做法是:

  1. 调完 S_FMT 后必须读回 结构体里的 pixelformat / width / height,以"实际生效值"为准;
  2. 或用 VIDIOC_TRY_FMT 先探一下(不真正改变设备状态),确认能被接受再 S_FMT。

经典踩坑:请求 1920×1080 的 MJPEG,结果驱动返回了 1920×1080 的 YUYV(内部转码),程序还按 MJPEG 去解,画面直接花屏。因此 MEDAI V2 的采集进程在协商完成后,会依据"实际生效格式"决定后续走硬解还是直处理路径------这正是"自动获取"一词的工程含义。


三、UVC 与 V4L2:免驱摄像头如何变成 /dev/videoX

3.1 uvcvideo 类驱动把 UVC 暴露为 V4L2 采集节点

UVC(USB Video Class)是 USB-IF 制定的视频设备类标准,把"视频设备的通用语言"固化进操作系统。只要摄像头按规范描述自己能出哪些分辨率、帧率、格式,Windows / macOS / Linux / Android 的通用 UVC 驱动就能直接识别,免装任何第三方驱动。

在 Linux 内核里,这台摄像头由 uvcvideo 驱动 接管,并被注册成一个标准的 V4L2 视频捕获节点 (如 /dev/video0)。此时应用层完全不必关心"这是一台 OBSBOT 还是大疆",它面对的只是一个标准的 V4L2 capture 设备------这就是 UVC 与 V4L2 的衔接点。

3.2 三种 UVC 载荷格式与 V4L2 四字码

UVC 摄像头内部原始传感器数据是 Bayer/RAW,对外封装成几种标准载荷。在 V4L2 体系中,每种载荷对应一个四字码(FourCC):

UVC 载荷 V4L2 四字码 宏定义 数据形态 是否需要硬解
H.264 'H264' V4L2_PIX_FMT_H264 摄像头端已编码的压缩流(UVC 1.1+) 是 → VPU / MPP 解码
MJPEG 'MJPG' V4L2_PIX_FMT_MJPEG 每帧独立 JPEG 压缩(帧内) 是 → VPU / MPP JPEG 解码
YUYV 'YUYV' V4L2_PIX_FMT_YUYV 未压缩 YUYV 4:2:2,16 bit/像素 否 → 直处理或 RGA 转 NV12

在命令行里用 v4l2-ctl -d /dev/video0 --list-formats-ext 查询一台真实 UVC 摄像头,输出往往就是这三行:

复制代码
[0]: 'YUYV' (YUYV 4:2:2)
[1]: 'MJPG' (Motion-JPEG, compressed)
[2]: 'H264' (H.264, compressed)

3.3 自动枚举:VIDIOC_ENUM_FMT 列出摄像头能力

所谓"自动获取三格式",第一步就是 VIDIOC_ENUM_FMT:应用从 index=0 开始逐个枚举,直到驱动返回错误,即可拿到这台摄像头完整支持的格式清单。

这一步的本质是读取 UVC 描述符里摄像头自己上报的能力。兼容性由此确定------能出 4K 的摄像头,不代表主机一定收 4K,双方协商出彼此都支持的最高规格。MEDAI V2 正是先枚举出摄像头能力,再结合用户选择的 2160P/1080P 档位,自动挑定走 H.264 / MJPEG 还是 YUYV。


四、RK3528 上的 V4L2 采集链路

4.1 采集节点与 MPP / RGA 的衔接

RK3528 是一颗面向边缘多媒体设备的 SoC,内部与视频相关的硬件模块至少三块,各司其职:

模块 职责 在采集链路中的角色
VPU 视频编/解码硬件加速 H.264/H.265/MJPEG 硬解(解码端 4K@60)
GPU 图形渲染、OpenGL 特效 绿幕着色器、图像合成
RGA 2D 硬件加速 缩放、色彩空间转换(YUYV→NV12)、旋转镜像

应用通过 V4L2 把 UVC 码流/帧拉到用户态后,并不直接吃下它,而是交给上述硬件:

  • 压缩流(H.264 / MJPEG) → 经 MPP(Media Process Platform,瑞芯微用户态媒体框架) 驱动 VPU 硬件解码;
  • 原始帧(YUYV) → 经 RGA 做色彩空间转换(YUYV→NV12),或直接进入后续处理。

MPP 是夹在"应用程序"和"内核 VPU 驱动"之间的用户态框架,屏蔽芯片差异、提供统一 MPI 接口。解码时核心就是 mpp_init(MPP_CTX_DEC, ...) 后循环 decode_put_packet → decode_get_frame,输出默认 NV12 原始帧。

4.2 三格式各自的落地路径

把 V4L2 采集与 RK3528 硬件连起来,三种格式各自走一条清晰路径:

复制代码
[UVC 摄像头]
   │ USB 3.0 等时传输(协商出 H.264 / MJPEG / YUYV 之一)
   ▼
[ Linux uvcvideo + V4L2 采集 ]  → /dev/videoX
   │  VIDIOC_ENUM_FMT 枚举 → VIDIOC_S_FMT 协商(自动获取三格式之一)
   │
   ├─ H.264  ('H264') ──┐
   │                    ├──► [ RK3528 VPU 硬件解码 ] ◀── MPP(CodingAVC / CodingMJPEG)
   ├─ MJPEG  ('MJPG') ──┘         │  MppFrame (NV12)
   │                              │
   └─ YUYV  ('YUYV') ──► [ RGA 色彩转换 ] ──► NV12
                              (或直入后续处理)
                   └──────────────┬──────────────┘
                                  ▼
                        [ NV12 原始帧统一汇入处理 ]
                   Scaler 缩放 → 叠加/绿幕/水印 → VPU 重新编码 H.264/H.265
                                  │
              ┌───────────────────┼────────────────────────┐
              ▼                   ▼                        ▼
        [RTMP/RTSP/        [本地 MP4 录制]          [NDI / HDMI 输出]
         SRT/HLS/
         HTTP/NDI
         六协议服务]

图1:V4L2 采集节点自动枚举并协商 H.264 / MJPEG / YUYV,压缩流经 VPU/MPP 硬解、原始帧经 RGA 转换,最终统一为 NV12 帧进入处理链路

要点归纳:

  • decode_put_packet() 消费压缩码流,decode_get_frame() 产出解码帧,二者通过 MPP 内部队列异步衔接,硬解几乎不占 CPU、延迟仅单帧到数帧(十毫秒级);
  • YUYV 是唯一无需解码的格式,但数据量巨大,通常只在低分辨率或 USB 2.0 场景出现;
  • 无论哪条路径,最终都收敛到 NV12------这是视频处理与编码链路最喜欢的 4:2:0 半平面格式,且 MPP 输出常由 DMA-BUF 支撑,可零拷贝交给 RGA / 编码端 / GPU。

4.3 带宽账:高分辨率为什么必须压缩

YUYV 每像素 2 字节,带宽账一算便知:

复制代码
1080P@30 YUYV = 1920×1080×2×30 ≈ 1.5 Gbps
4K@30   YUYV = 3840×2160×2×30 ≈ 6.0 Gbps
对照:USB 2.0 = 480 Mbps,USB 3.0 = 5 Gbps

结论非常清晰:

  • USB 2.0 上未压缩 YUYV 最多跑 720P30;想传 1080P 必须切 MJPEG;
  • 4K@30 未压缩约 6 Gbps,已超出 USB 3.0 的 5 Gbps,4K UVC 摄像头几乎都以 MJPEG / H.264 传输 4K,把带宽压到数百 Mbps 甚至十几 Mbps;
  • 黄金法则:高分辨率场景,一看主机是不是 USB 3.0 口,二看摄像头是否支持 MJPEG / H.264 压缩格式------而这恰好决定了 V4L2 拿到的是哪一路,以及后续是否要硬解。

五、MEDAI V2 实战:UVC 自动获取三格式

5.1 物理接入:USB 3.0 专属通道

MEDAI V2 在接口规划上把 UVC 摄像头放在最高优先级通道:设备背面的 USB 3.0 接口专门用于接入 UVC 摄像头,USB 2.0 接口则留给无线 MIC 和 U 盘,4K 摄像头务必确认插的是 USB 3.0 口------插错 USB 2.0 口,轻则只能协商到低分辨率,重则无法出图。

5.2 UVC 配置:2160P / 1080P 双档位

进入 USB 配置 → UVC 配置 页面,可按摄像头能力选择 2160P(4K)或 1080P 两档:

图3:2160P/1080P 双档位,页面下半部分实时回显当前摄像头画面,所见即所得

  • USB 摄像头为 4K 时,选择 2160P,此时获取到的 UVC 信号为 3840×2160 分辨率;
  • 选择 1080P 时,获取到的 UVC 信号为 1920×1080 分辨率;
  • 可据实际需求选择要拉起的分辨率。

⚠️ 注意:切换分辨率后需重启设备生效 ,目的是让设备按新规格重新完成 UVC 协商握手,并重新执行 V4L2 的格式枚举与 S_FMT。

5.3 信号配置:指定 UVC 为主输入源

进入 编码配置 → 信号配置 ,在"视频输出"中选择 UVC 为输入源;音频输入可"跟随视频"(摄像头自带麦克风)或切到无线 MIC:

图4:信号配置中将 UVC 指定为视频输入源,音频可跟随视频或切无线 MIC

5.4 系统状态:确认 UVC 接入规格

UVC 是否被正确识别、协商到了什么规格,在系统状态主页输入状态 区的 UVC 卡片一目了然,显示连接状态与接入分辨率(如 1920x1080@30,绿点表示已连接):

图5:UVC 卡片显示当前分辨率与帧率,指示灯 + 分辨率 + 画面三者互证,排障不再靠"猜"

页面底部预监区实时显示 UVC-IN 画面,确认信号已进入编码链路(此时画面已是经 VPU/MPP 解码或 RGA 转换后的统一 NV12 帧):

图6:预监 UVC-IN 实时画面,证明采集帧已成功进入处理链路

5.5 自动识别与路由逻辑

把前面几章串起来,MEDAI V2 上"UVC 自动获取三格式"的内部逻辑就是:

  1. 枚举 :摄像头插入后,uvcvideo 注册 V4L2 节点,采集进程用 VIDIOC_ENUM_FMT 读回摄像头能力清单(H.264 / MJPEG / YUYV);
  2. 协商 :结合用户选择的 2160P/1080P 档位与摄像头能力,自动 VIDIOC_S_FMT 挑定一档传输格式------高分辨率优先 H.264/MJPEG 以压住 USB 带宽,低分辨率/USB2.0 才可能落 YUYV;
  3. 路由 :
    • 拿到 H.264 / MJPEG → 送 VPU/MPP 硬件解码 → NV12;
    • 拿到 YUYV → 送 RGA 色彩转换(或直接进处理)→ NV12;
  4. 统一加工:所有路径收敛到 NV12,经 Scaler 缩放 → 叠加/绿幕/水印 → VPU 重新编码 H.264/H.265 → 六协议服务 + 5 路 RTMP + 本地 MP4 多端分发。

对用户而言,这套"枚举---协商---路由"全自动完成,只需插上摄像头、选好分辨率、指定 UVC 主输入源即可。这正是 V4L2 框架"统一抽象 + 格式协商"价值在 MEDAI V2 上的落地。


六、三格式对比与选型建议

维度 H.264(压缩) MJPEG(帧内压缩) YUYV(原始)
V4L2 四字码 V4L2_PIX_FMT_H264 V4L2_PIX_FMT_MJPEG V4L2_PIX_FMT_YUYV
USB 带宽占用 最低(约 3~12 Mbps@1080P) 低(约 100~200 Mbps@1080P) 极高(1080P≈1.5 Gbps)
主机处理开销 VPU 硬解(CPU≈0) VPU 硬解(CPU≈0) 无解码,但需 RGA 转 NV12
支持分辨率上限 USB 3.0 可稳跑 1080P/4K USB 3.0 可稳跑 1080P/4K USB 2.0 仅 720P
画质 轻微损失(可接受) 轻微损失(可接受) 最佳(无损)
典型场景 4K/高码率远程推流 绝大多数会议/示教直播 短距离高画质特写

经验法则:要上 1080P/4K 或线长受限,就让摄像头出 H.264/MJPEG,交给 VPU 硬解;只在短距离高画质、且 USB 3.0 仍塞得下原始数据时,才用 YUYV。


七、排障速查表

现象 可能原因 处理路径
UVC 卡片红色/无识别 未插 USB 3.0 口、摄像头非标准 UVC 换到 USB 3.0 口;PC 上先验证 UVC 兼容性
分辨率低于预期(如 4K 只出 1080P) UVC 配置档位不对 / 未重启 选 2160P 并重启设备;确认摄像头支持 4K
切分辨率后无画面 未重启生效 保存后重启设备重新协商
高分辨率黑屏但低分辨率有 USB 带宽不足 / 摄像头只支持 MJPEG 的 4K 确认 USB 3.0 + 摄像头开启 MJPEG/H.264 压缩
协商到 YUYV 后带宽爆 USB 2.0 上请求了高分辨率原始流 改选 MJPEG/H.264;或换 USB 3.0
画面花屏/颜色异常 误把 YUYV 当 MJPEG 解(S_FMT 未读回实际值) 以 VIDIOC_G_FMT 实际格式为准路由
画面卡顿/掉帧 解码后处理过载(叠加+编码并发) 降低输出分辨率/帧率;关闭非必要特效
预监有画面但推流无画面 编码/推流未启用或地址错误 检查信号配置与 RTMP 推流地址

八、总结

UVC 协议让千差万别的 USB 摄像头"免驱被识别",而真正把视频流一帧帧搬进应用内存的,是 V4L2 框架 ------它用"五系统调用 + ioctl 目录"的统一抽象,把摄像头变成 /dev/videoX,再用 VIDIOC_ENUM_FMT → VIDIOC_S_FMT 的固定状态机完成格式枚举与协商。

在 MEDAI V2 上,这套机制直接回答了"UVC 接口如何自动获取 H.264 / MJPEG / YUYV 三格式":

  • H.264 / MJPEG(压缩流) :V4L2 拉起后送 RK3528 VPU 经 MPP 硬件解码成 NV12(CPU 几乎零负担,延迟十毫秒级);
  • YUYV(原始帧) :送 RGA 色彩转换或直接进处理,同样收敛到 NV12;
  • 三路最终统一为 NV12 原始帧 → Scaler 缩放 → 叠加/绿幕/水印 → VPU 重新编码 H.264/H.265 → 六协议服务 + 5 路 RTMP + 本地 MP4 多端分发。

从底层看,这条链路的稳定核心就是 V4L2 的格式协商 + VPU/RGA 的硬件处理:它让四核 A53 级别的嵌入式设备,也能从容把任意 UVC 摄像头的三种格式,实时变成"可加工、可分发"的直播素材。


相关推荐
171320330计算机毕设编程1 小时前
计算机毕业设计 基于YOLO改进算法的车辆特征识别系统设计与实现--lw
java·大数据·python·sql·算法
badhope1 小时前
Spring AI Alibaba停更:Java程序员的信任,还能被辜负几次?
java·spring
const_qiu1 小时前
第一章 1.1-1.2:基础模型调用与 TypeScript 入门 —— Java 开发者的视角
java·javascript·typescript
Wang's Blog1 小时前
Java 项目实战: 交友项目 - Dubbo 负载均衡策略与实战验证
java·dubbo·交友
睿智の男孩2 小时前
MIG IP核对DDR3的输出时序分析记录
网络·网络协议·tcp/ip
SL_staff2 小时前
销售知识库7天落地实践:面向业务侧的零代码嵌入方案
java·开源·产品
艾芯微科技2 小时前
高充放电流锂电充放 SoC:ETA9885E10,便携储能、小移动电源 BOM 选型笔记
网络·单片机·嵌入式硬件·集成测试·51单片机
GreatSQL社区2 小时前
主从复制SQL线程中断——字符集砸出的坑
java·数据库·算法