ubuntu1804 2020-09-03 10:51 采纳率: 0%
浏览 3020

在python中利用opencv读取rtsp视频流时,延时大的问题

在python中利用opencv读取rtsp视频流时,延时大的问题,但在读取电脑本机摄像头时,延时就小很多,代码是相同的代码。

import threading, cv2
import time


class Stack:

    def __init__(self, stack_size):
        self.items = []
        self.stack_size = stack_size

    def is_empty(self):
        return len(self.items) == 0

    def pop(self):
        return self.items.pop()

    def peek(self):
        if not self.isEmpty():
            return self.items[len(self.items) - 1]

    def size(self):
        return len(self.items)

    def push(self, item):
        if self.size() >= self.stack_size:
            self.items.remove(self.items[0])
        self.items.append(item)

    def clear(self):
        self.items.clear()


def capture_thread(video_path, frame_buffer, lock):
    print("capture_thread start")
    vid = cv2.VideoCapture(video_path)
    print(vid.get(cv2.CAP_PROP_FPS))
    if not vid.isOpened():
        raise IOError("Couldn't open webcam or video")
    while True:
        return_value, frame = vid.read()
        if return_value is not True:
            break
        lock.acquire()
        start_time = time.time()
        print('图像存放时间:', start_time)
        frame_buffer.push([frame, start_time])
        print('存放后列表中有图像的张数:', frame_buffer.size())
        lock.release()
        cv2.waitKey(25)


def play_thread(frame_buffer, lock):
    print("detect_thread start")
    print("detect_thread frame_buffer size is", frame_buffer.size())

    while True:
        if frame_buffer.size() >= 1:
            lock.acquire()
            frame_list = frame_buffer.pop()
            frame = frame_list[0]
            end_time = time.time()
            frame_buffer.clear()
            print('图像取出时间:', end_time)
            print('取出后列表中有图像的张数:', frame_buffer.size())
            print('每张图像显示时间:', end_time - frame_list[1])
            lock.release()
            # TODO 算法
            cv2.imshow("result", frame)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break


# path = 'rtsp://admin:abcd1234@192.168.1.64'
path = 'rtsp://192.168.1.152/chn0'
# path=0
frame_buffer = Stack(3)
lock = threading.RLock()
t1 = threading.Thread(target=capture_thread, args=(path, frame_buffer, lock))
t1.start()
t2 = threading.Thread(target=play_thread, args=(frame_buffer, lock))
t2.start()

哪位大哥能帮忙分析解决一下,谢谢!

  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2020-09-03 12:36
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 ffmpeg音视频同步
  • ¥20 Ubuntu18.04卸载Python2后无可视化界面问题
  • ¥15 php同一个单元格里多选提交,更新表格
  • ¥15 Vue 前端调用本地jar包有什么方法?
  • ¥15 基础的图像处理问题求解答
  • ¥50 全国两定智慧医保接口开发相关业务文档,以及技术实现流程文档
  • ¥15 idea做图书管理系统,要求如下
  • ¥15 最短路径分配法——多路径分配
  • ¥15 SQL server 2022安装程序(英语)无法卸载
  • ¥15 求一个nao机器人跳舞的程序