python视频延迟严重_利用多进程降低opencv视频延迟处理rtsp视频流

本文介绍了如何通过Python的多进程处理rtsp视频流,以解决由于处理视频帧导致的延迟问题。利用multiprocessing库创建读取和处理视频的两个进程,通过Manager.list作为进程间传递视频帧的栈,达到实时获取最新帧的效果。同时,通过设置栈容量并定期清理,防止内存溢出和程序崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python多进程opencv

前几天遇到了一个问题,利用opencv程序调取rtsp视频流,因为处理程序要消耗的CPU时间过于长,VideoCapture的read是按帧读取,所以经常导致内存溢出,延时还高得出奇。

所以想到是不是可以利用多进程把读取视频和处理视频分开,这样就可以消除因处理图片所导致的延迟。

所用库

multiprocessing

gc

opencv-python

os

实现方法

一开始是想用多线程,但是因为GIL的存在,像实时处理视频这样的CPU密集型任务多线程等于没用。然后就选择了多进程。

然后要考虑怎样在两个进程中传参的问题:

multiprocessing中有Quaue、SimpleQuaue等进程间传参类,还有Manager这个大管家。

Quaue这一类都是严格的数据结构队列类型

Manager比较特殊,它提供了可以在进程间传递的列表、字典等python原生类型

还要考虑怎样才能达到处理进程可以在读取进程中得到最新的一帧:

其实VideoCapture是一个天生的队列,先进先出。如果要达到实时获得最新帧的目的,就需要栈来存储视频帧,而不是队列。

这样的话,Quaue这一大类就都没有可能了,肯定不能用它来传参。

提到栈突然想到了python的列表,它的append和pop操作完全可以当”不严格“的栈来用。所以顺理成章地multiprocessing.Manager.list就是最好的进程间传参类型。

再就是传参栈自动清理的问题,压栈频率肯定是要比出栈频率高的,时间一长就会在栈中积累大量无法出栈的视频帧,会导致程序崩溃,这就需要有一个自动清理机制:

设置一个传参栈容量,每当达到这个容量就直接把栈清空,再利用gc库手动发起一次python垃圾回收。这样就不会导致严重的内存溢出和程序崩溃。

实现代码

import os

import

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值