先评估下多进程传帧的成本,再看看优化手段和可替代方案。
关键分析
- 拷贝开销:Python 的
multiprocessing.Queue/Pipe 会把numpy帧拷贝到共享内存或通过 pickle 序列化,分辨率越高、帧率越高,CPU 开销越大,主频一般会被拖得很明显。 - 系统瓶颈:内存带宽和缓存命中率也受到影响;如果相机多、帧尺寸大(4K 等),单机内存通道压力会比 CPU 运算更早成为瓶颈。
- 同步成本:排队/互斥锁开销虽然不算大,但在高帧率下也是额外的上下文切换。
降本建议
- 共享内存:用
multiprocessing.shared_memory或者Array/RawArray,让子进程直接写共享 buffer,主进程只读指针并在不同 slot 间轮询,避免频繁拷贝。 - 压缩帧:如果网络出口允许,可以在子进程先做轻量压缩(如 JPEG/PNG/WebP),主进程接收后再解压显示,牺牲一点延迟换取 CPU/带宽。
- 零拷贝总线:转向 GStreamer、PyAV、media pipe 这类框架,通过插件或管线传输(例:UDS、shm sink),能借助底层 C/C++ 实现减少 Python overhead。
- 硬件加速:如果有 GPU,考虑 NVDEC/NVENC 或通过 CUDA/OpenCL 直接在显存共享,CPU 负担会大幅降低。
何时保持多进程
- 当每路流都要独立调用 OpenCV GUI 或执行阻塞任务;多进程隔离稳定性更好。
- 如果只是拼图显示,可以改用单进程 + 多协程/线程 + GIL 释放的解码库(PyAV),能减少 IPC 压力。
简而言之,直接用 Queue 传原始帧会有较明显的 CPU 与内存开销,尤其是多路高清流。要么减少拷贝(共享内存/零拷贝管线),要么压缩/降分辨率,或者换成更专业的媒体管线工具,按实际性能目标权衡。