首页 > 编程语言 >python读取rtsp流,并消耗

python读取rtsp流,并消耗

时间:2023-12-15 16:25:50浏览次数:28  
标签:count 读取 python top rtsp cv2 len print stack

1.python读取rtsp流,并消耗(用线程)
import os
import cv2
import gc
import time
import threading
import numpy as np
from PIL import Image

top = 100

stack = []


# 向共享缓冲栈中写入数据:
def write(stack, cam, top: int) -> None:
    """
    :param cam: 摄像头参数
    :param stack: list对象
    :param top: 缓冲栈容量
    :return: None
    """
    print('Process to write: %s' % os.getpid())
    cap = cv2.VideoCapture(cam)
    while True:
        _, img = cap.read()
        if _:
            stack.append(img)
            print(stack)
            # 每到一定容量清空一次缓冲栈
            # 利用gc库,手动清理内存垃圾,防止内存溢出

            if len(stack) >= top:
                del stack[:]
                gc.collect()


# 在缓冲栈中读取数据:
def read(stack) -> None:
    print('Process to read: %s' % os.getpid())
    # 开始时间
    t1 = time.time()
    # 图片计数
    count = 0

    while True:
        if len(stack) != 0:
            # 开始图片消耗
            print("stack的长度", len(stack))
            if len(stack) != 100 and len(stack) != 0:
                value = stack.pop()
            else:
                pass

            if len(stack) >= top:
                del stack[:]
                gc.collect()

            # 格式转变,BGRtoRGB
            frame = cv2.cvtColor(value, cv2.COLOR_BGR2RGB)
            # # 转变成Image
            frame = Image.fromarray(np.uint8(frame))

            print("*" * 100)

            count += 1
            print("数量为:", count)

            t2 = time.time()
            print("时间差:", int(t2 - t1))

            if int(t2 - t1) == 600:
                # 记录 消耗的图片数量
                with open('count.txt', 'ab') as f:
                    f.write(str(count).encode() + "\n".encode())
                    f.flush()

                # count = 0  # 不要置零,计算总数
                t1 = t2


if __name__ == '__main__':
    for i in range(1):
        thread_pro = threading.Thread(target=write, args=(stack, "rtsp://admin:xxxx@[email protected]:554/Streaming/Channels/1 ", top,))
        thread_pro.start()

    for j in range(3):
        thread_con = threading.Thread(target=read, args=(stack,))
        thread_con.start()

2.python读取rtsp流,并消耗(用进程)
注:该代码适合在本机跑,不适合在jetson的小盒子上运行

import os
import cv2
import gc
import time
import numpy as np
from PIL import Image

import multiprocessing
from multiprocessing import Process, Manager


top = 100

# 向共享缓冲栈中写入数据:
def write(stack, cam, top: int) -> None:
    """
    :param cam: 摄像头参数
    :param stack: Manager.list对象
    :param top: 缓冲栈容量
    :return: None
    """
    print('Process to write: %s' % os.getpid())
    cap = cv2.VideoCapture(cam)
    while True:
        _, img = cap.read()
        if _:
            stack.append(img)
            # 每到一定容量清空一次缓冲栈
            # 利用gc库,手动清理内存垃圾,防止内存溢出
            if len(stack) >= top:
                del stack[:]
                gc.collect()


# 在缓冲栈中读取数据:
def read(stack) -> None:
    print('Process to read: %s' % os.getpid())
    # 开始时间
    t1 = time.time()
    # 图片计数
    count = 0

    while True:
        if len(stack) != 0:
            # 开始图片消耗
            print("stack的长度", len(stack))
            if len(stack) != 100 and len(stack) != 0:
                value = stack.pop()
            else:
                pass

            if len(stack) >= top:
                del stack[:]
                gc.collect()

            # 格式转变,BGRtoRGB
            frame = cv2.cvtColor(value, cv2.COLOR_BGR2RGB)
            # # 转变成Image
            frame = Image.fromarray(np.uint8(frame))

            print("*" * 100)

            count += 1
            print("数量为:", count)

            t2 = time.time()
            print("时间差:", int(t2 - t1))

            if int(t2 - t1) == 600:
                # 记录 消耗的图片数量
                with open('count.txt', 'ab') as f:
                    f.write(str(count).encode() + "\n".encode())
                    f.flush()

                # count = 0  # 不要置零,计算总数
                t1 = t2


if __name__ == '__main__':
    multiprocessing.set_start_method('forkserver', force=True)
    # 父进程创建缓冲栈,并传给各个子进程:
    q = Manager().list()
    pw = Process(target=write, args=(q, "rtsp://admin:xxxx@[email protected]:554/Streaming/Channels/1", top))
    pr = Process(target=read, args=(q,))
    # 启动子进程pw,写入:
    pw.start()
    # 启动子进程pr,读取:
    pr.start()

    # 等待pr结束:
    pr.join()

    # pw进程里是死循环,无法等待其结束,只能强行终止:
    pw.terminate()

3.python读取rtsp流,并消耗(普通)
import os
import cv2
import gc
import time
import numpy as np
from PIL import Image


top = 100

stack = []

# 向共享缓冲栈中写入数据:
def write(stack, cam, top: int) -> None:
    """
    :param cam: 摄像头参数
    :param stack: list对象
    :param top: 缓冲栈容量
    :return: None
    """
    print('Process to write: %s' % os.getpid())
    cap = cv2.VideoCapture(cam)

    # 开始时间
    t1 = time.time()
    # 图片计数
    count = 0

    while True:
        _, img = cap.read()
        if _:
            stack.append(img)
            # print(stack)

            # 在缓冲栈中读取数据:
            if len(stack) != 0:
                # 开始图片消耗
                print("stack的长度", len(stack))
                if len(stack) != 100 and len(stack) != 0:
                    value = stack.pop()
                else:
                    pass

                # 格式转变,BGRtoRGB
                frame = cv2.cvtColor(value, cv2.COLOR_BGR2RGB)
                # # 转变成Image
                frame = Image.fromarray(np.uint8(frame))

                print("*" * 100)

                count += 1
                print("数量为:", count)

                t2 = time.time()
                print("时间差:", int(t2 - t1))

                if int(t2 - t1) == 600:
                    # 记录 消耗的图片数量
                    with open('count.txt', 'ab') as f:
                        f.write(str(count).encode() + "\n".encode())
                        f.flush()

                    t1 = t2

            # 每到一定容量清空一次缓冲栈
            # 利用gc库,手动清理内存垃圾,防止内存溢出

            if len(stack) >= top:
                del stack[:]
                gc.collect()


if __name__ == '__main__':
    write(stack, "rtsp://admin:xxxx@[email protected]:554/Streaming/Channels/1", top)

4. 验证 本机 是否支持python rtsp 的GPU 加速
安装以下命令

pip install opencv-contrib-python
1
print(cv2.getBuildInformation())
1

 

5. 代码:python rtsp 的GPU加速
该代码还有问题,后续继续更新

import cv2
pipeline = "rtspsrc location=\"rtsp://login:password@host:port/\" ! rtph264depay ! h264parse ! omxh264dec ! nvvidconv ! video/x-raw, format=(string)BGRx! videoconvert ! appsink"
capture = cv2.VideoCapture(pipeline, cv2.CAP_GSTREAMER)

while capture.isOpened():
    res, frame = capture.read()
    cv2.imshow("Video", frame)
    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
        break
capture.release()
cv2.destroyAllWindows()

标签:count,读取,python,top,rtsp,cv2,len,print,stack
From: https://www.cnblogs.com/kn-zheng/p/17903587.html

相关文章

  • Python实现RTSP流测试
    本文将详细介绍如何使用Python来测试RTSP流。首先,我们需要了解什么是RTSP。RTSP(RealTimeStreamingProtocol)是一种基于文本的IP协议,主要用于控制实时数据的传输,例如音频或视频。在本文中,我们将使用Python中的OpenCV库来测试RTSP流。一、安装OpenCV库在Python中使用OpenCV库需......
  • readline,readlines读取数据,为空原因
     对同一文件同时使用read()和readline()/readlines()函数注意点:使用了read()函数以后,文件流被占用,所以f.readline()和f.readlines()函数读出的结果均为空。使用了readlines()后,在使用readline()得到的也会是空,readlines占用了整个文件流。使用了readline(),再使用readlines(),是......
  • python之typing
    typing介绍Python是一门动态语言,很多时候我们可能不清楚函数参数类型或者返回值类型,很有可能导致一些类型没有指定方法,在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,typing模块可以很......
  • python 脚本的启动模式(python -m以模块方式启动)
    今天再看python的项目时,发现GitHub中给出的python脚本的执行格式是python-mpipinstallsomepackage。于是开始了python模式启动之旅。其中很多相关借鉴了该博客,同时感谢博主:http://www.cnblogs.com/xueweihan/p/5118222.html什么是python启动模块:通过python启动一个库中......
  • python远程关闭window电脑
    背景公司的电脑机器太多,每次关闭的时候需要一台一台的关闭,比较麻烦,因此做一个批量关闭的功能Windows电脑不想liunx有ssh工具,因此需要事前在Windows电脑上面安装一个ssh工具。1、Github上下载OpenSSH包下载地址 https://github.com/PowerShell/Win32-OpenSSH/releases2......
  • python 遍历文件目录下所有的文件夹和文件
    前言一些场景需要查找文件目录下一些文件,一、需要库os二、参考代码#(root,dirs,files)分别为:遍历的文件夹,遍历的文件夹下的所有文件夹,遍历的文件夹下的所有文件importpath="D:\脚本\微信"forroot,dirs,filesinos.walk(path+"/"):#iflen(dirs)==0:print(roo......
  • python连接pgsql&mysql
    1、python连接pgsqlimportpsycopg2defconnect_pgsql(list_sql):conn=psycopg2.connect(host='db_host',user='db_user',password='db_passwd',......
  • pandas.read_excel默认读取第一行为列名 但是 pandas.DataFrame默认没有列名, 第一行
    pandas.read_excel默认读取第一行为列名headerint,listofint,default0Row(0-indexed)touseforthecolumnlabelsoftheparsedDataFrame.Ifalistofintegersispassedthoserowpositionswillbecombinedintoa MultiIndex.UseNoneifthereisnoheader.......
  • java: 通过URL读取hadoop HDFS
    packagetju;importorg.apache.hadoop.fs.FsUrlStreamHandlerFactory;importorg.apache.hadoop.io.IOUtils;importjava.io.InputStream;importjava.net.MalformedURLException;importjava.net.URL;importjava.net.URLStreamHandlerFactory;publicclassReadF......
  • hadoop:通过Configuration读取hdfs
    packagetju;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FSDataInputStream;importorg.apache.hadoop.fs.FSDataOutputStream;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io......