View on GitHub

富乎 · 地问


avatar
辗转探寻为富乎?《天问》无解向地问!

<<< 返回主页

摄像头监控应用程序的优化要点

1、背景

本文是对前段时间一个摄像头项目的应用层作一些思路和方向上的整理归纳, 提炼出若干要点(尤其是性能优化方面)以作备忘之用,也供后续同类项目借鉴、复用。

文本以自然语言描述为主,并且由于是商业项目,源码不能公开, 但有部分与具体业务无关的逻辑会陆续封装成通用接口并开源。

2、采集接口

2.1 OpenCV

2.2 V4L2

2.3 GStreamer

待补充。

2.4 FFmpeg

待补充。

3、数据解码

4、数据搬移

4.1 图像数据量的估算

1280x960大小(若无特别说明,后文的所有说明都使用此值)的图像为例:

图像格式 单帧数据量 每秒数据量(假设15fps的速率)
NV12(摄像头原始格式) 1.75MB 26.37MB
RGB(内存格式) 3.52MB 52.73MB
JPEG(储存或传输格式) 48KB 700KB

对于前2种格式,即使降低对尺寸的要求,将宽高均缩减一半变为640x480,则以上数据除以4, 得出的数据量依然很可观,处理器和内存的压力仍然很大,所以在各个环节的处理中, 如无必要,不要随便复制数据。

如果用于储存或传输的格式不采用JPEG其他格式很难同时满足高压缩率低耗时的要求, 最后的结果要么是转换超时,要么是数据量太大致使网卡压力爆棚而频繁丢包,详见后文专门章节的分析。

4.2 内存速率的估算(适用于内存内部的复制操作)

作为小结,这里给出各代内存的(通道)速率范围(数据由某度DeepSeek提供, 不保证绝对准确,但可作为参考):

内存类型 传输速率范围(MT/s 理论带宽范围(GB/s 顺序访问速率范围 随机访问速率范围
DDR1 200~400 1.6~3.2 1.1~2.8 0.05~0.3
DDR2 400~1200 3.2~9.6 2.2~8.5 0.1~0.8
DDR3 800~2133 6.4~17.0 4.5~15 0.2~1.5
DDR4 1600~3200 12.8~25.6 9~25 0.4~3

注意:上表的随机访问速率范围有争议,因为从DDR2开始加入预取Prefetch)机制, 即DDR24位预取,DDR38位预取,以此类推,在特定的场景下确实能实现速率的翻倍, 但预取的数据在CPU分支预测失败或内存地址非连续的情况下会用不上而需要重新获取, 因此在不考虑核心频率的提升以及其他方面的改进的情况下,各代DDR的随机访问速率理应差别不大, 后续若找到更详细的文献再进行更新。

最后还要分清是标压DDRx)内存还是低压内存LPDDRx),因为工艺会影响部分参数指标, 进而影响最终的带宽值,例如DDR4带宽范围一般是12.8GB/s25.6GB/sLPDDR4则为10.6GB/s17GB/s

4.3 内存与显存(或其他专用硬件的储存空间)之间的复制

5、业务处理

6、数据压缩及编码

这一章节的压缩及编码针对的是独立帧,亦即每一帧独立处理,缺失任一帧都不会对其他帧造成影响, 与后面的视频保存章节所用的编码方式不同。

由于压缩及编码极其消耗CPU资源,所以使用不同的芯片,耗时也会不一样。 下面列举几种常见的压缩或编码方式在RK3588中处理尺寸为1280x960的图像得出的结果, 其他芯片可根据其与RK3588的性能差异作出大致估算:

压缩或编码方式 质量参数或压缩率 处理后的尺寸 耗时 编程接口 备注
JPEG 30 44KB 16ms cv::imencode() 数据量及耗时均比较理想,可用
JPEG 90 142KB 19ms cv::imencode() 数据量及耗时偏大但仍可接受
PNG 6 1.05MB 220ms cv::imencode() 数据量及耗时超大,不予考虑
WebP 30 24KB 70ms cv::imencode() 数据量非常理想,但耗时不可接受
WebP 75 34KB 80ms cv::imencode() 同上
ZLIB 6 600KB 90ms compress2() 数据量较大,耗时也很大,不可用
LZ4 1 800KB 17ms LZ4_compress_fast() 耗时较理想,但数据量很大,不可用
LZ4 20 1.01MB 9ms LZ4_compress_fast() 耗时非常理想,但数据量超大,不可用

由上表可知,通用压缩算法用在图像上的效果并不理想,必须使用专门针对图像的编码算法。 而在这些图像编码算法当中,老牌的JPEG毫无悬念胜出,很好地兼顾了数据量和处理耗时; 较新的WebP虽然能产出更少的数据量和更好的图像质量,但目前多数芯片的算力仍未足够强大, 无法进一步压缩耗时,所以暂时无法应用于实时类任务,不过以后应该能慢慢实现。

另外,上表中当JPEG质量参数为30%时,会出现轻微的块状伪影(Blocking Artifacts), 但对于室内图像(较暗、色彩不丰富、区分度不高)的视觉效果影响不大,可以使用。 若有更高要求,可提高到75%,此值在数据量、耗时和图像质量方面均有很好的效果。

7、数据加密

可选项(并非所有场合都需要加密),待补充。

8、网络传输

对于需要在公网传输(链路质量不佳且多变)或者有跨品牌互联需求(需标准化或认证)的产品, 必须支持RTMPRTP协议族,若有安全需求的还要支持SRTP或相关的国标, 因此需要慎重选择成熟的库。

若仅在内网甚至端到端直连使用,且不需与其他品牌互操作,则开发难度和要求大大简化, 就算自定义通信协议、手动组包解包进行收发,都问题不大。以下内容正是重点针对这种场景, 但仍对前一种场景有参考意义:

9、图像显示

10、视频保存

11、其他建议