概念
视频采集(Video Capture) 是指从摄像头、采集卡、屏幕或其他视频信号源中获取原始视频数据帧(Raw Frame)的过程。
其目标是将 物理世界的连续光信号 → 转换为 数字化帧序列(YUV/RGB),供编码器、传输或显示模块使用。
简单理解:
摄像头 → 光电转换 → 数字化 → 驱动层缓存 → 应用层(采集模块)读取帧数据
系统结构(五层模型)
| 层级 | 名称 | 作用 |
|---|---|---|
| 1️⃣ | 光学层 | 镜头聚焦、光圈控制、曝光 |
| 2️⃣ | 传感器层(Sensor) | 将光信号转换为电信号(CMOS / CCD) |
| 3️⃣ | ISP 层(Image Signal Processor) | 图像信号处理(白平衡、降噪、去马赛克、Gamma) |
| 4️⃣ | 驱动层 | 通过接口(USB/UVC、MIPI、PCIe)与系统交互 |
| 5️⃣ | 应用层 | 调用 API(如 DirectShow、V4L2、MediaFoundation)获取帧数据 |
视频采集核心流程
以下是标准视频采集流程图(从硬件到软件):
scss
[Camera Sensor]
↓ 光信号采集
[ISP 芯片]
↓ 图像处理 (去噪, AE/AF/AWB)
[驱动层]
↓ 内核缓冲队列
[系统接口 API (V4L2 / DirectShow / Media Foundation)]
↓
[应用层采集模块]
↓
[YUV / RGB 帧 → 编码器(H.264/H.265) → 推流/存储/显示]
关键数据类型
采集到的视频帧通常是未压缩的原始图像数据:
| 格式 | 特点 | 用途 |
|---|---|---|
| RGB24 / RGB32 | 每像素3或4字节,颜色完整 | 图像处理、UI |
| YUV420 / NV12 / I420 | 压缩比高,亮度分离 | 视频编码常用输入格式 |
| MJPEG / H.264 | 摄像头直接输出压缩数据 | 节省带宽 |
不同平台的采集接口
Windows 平台
- DirectShow:老牌多媒体框架,广泛支持摄像头。
- Media Foundation:微软推荐的新框架(Win7+)。
- Windows SDK 示例:
cpp
IMFActivate **ppDevices = NULL;
IMFMediaSource *pSource = NULL;
MFCreateDeviceSource(ppDevices[0], &pSource);
- 数据格式常见:
MFVideoFormat_NV12,MFVideoFormat_YUY2.
Linux 平台
- V4L2 (Video4Linux2) :标准视频采集接口。
/dev/video0表示一个摄像头设备;- 应用程序通过
ioctl()与内核交互。
工作流程
-
打开设备:
cppint fd = open("/dev/video0", O_RDWR); -
查询能力:
cppioctl(fd, VIDIOC_QUERYCAP, &cap); -
设置格式:
cppioctl(fd, VIDIOC_S_FMT, &fmt); -
内存映射缓冲区:
cppmmap() -
启动采集:
cppioctl(fd, VIDIOC_STREAMON); -
循环取帧并处理。
输出数据一般为 YUYV, NV12, MJPEG 等格式。
macOS / iOS 平台
- 框架:
AVFoundation - 使用
AVCaptureSession、AVCaptureDevice采集视频。
swift
let session = AVCaptureSession()
let device = AVCaptureDevice.default(for: .video)
let input = try AVCaptureDeviceInput(device: device)
session.addInput(input)
session.startRunning()
音视频同步采集
实际项目中常见的需求是同时采集音频和视频(如摄像头 + 麦克风),要保证 AV 同步:
- 视频采集时间戳:
PTS_video = 系统时钟 + 帧间隔 - 音频采集时间戳:
PTS_audio = 系统时钟 + 样本数 / 采样率 - 同步策略:
- 时间戳对齐;
- 缓冲区延时补偿;
- 采样率漂移调整(resample)。
性能与优化要点
| 优化方向 | 方法 |
|---|---|
| 内存拷贝 | 使用零拷贝(mmap / DMA) |
| 帧率控制 | 控制帧间隔、丢帧策略 |
| 颜色转换 | 硬件加速(GPU / ISP / NVENC) |
| 延时控制 | 减少缓冲帧数、线程实时优先级 |
总结
| 阶段 | 关键模块 | 代表接口 |
|---|---|---|
| 信号采集 | CMOS / ISP | Sensor Driver |
| 系统驱动 | V4L2 / UVC / MF | /dev/videoX / IMFMediaSource |
| 应用采集 | FFmpeg / OpenCV | avdevice_register_all() / VideoCapture() |
| 数据处理 | 编码 / 推流 | H.264 / H.265 / RTMP / WebRTC |