网络摄像头rtsp流延迟无法解决,改用Mjpeg流成功保证低延迟稳定传输,并成功解决opencv对Mjpeg流支持问题

这篇具有很好参考价值的文章主要介绍了网络摄像头rtsp流延迟无法解决,改用Mjpeg流成功保证低延迟稳定传输,并成功解决opencv对Mjpeg流支持问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近做的一个小项目,是需要通过一个网络实时将画面传输给后端进行处理。因为涉及到对运动的捕捉,延迟要求较为严格。我的网络摄像头是Z CAM E2 M4,内置了rtsp流。使用rtsp流时总会产生2秒的延迟。直接使用ffmpeg播放依然存在2s延迟。尝试过修改缓冲大小无果。查阅相机文档发现有个mjpeg流,在浏览器中直接打开异常稳定且低延迟。于是尝试换用mjpeg流。

opencv对mjpeg流支持存在问题

当我直接使用opencv对mjpeg流进程读取时,总会出现“边界符未找到”的报错。经查阅这个问题出自opencv底层编译过程中,致使无法对流的编码方式进行更改。

cap = cv2.videocapture("ip Mjpeg url")
cap.read()

#报错:

出现报错:

[mpjpeg @ 000001e35d8c2d40] Expected boundary '--' not found, instead found a line of 15 bytes

[mpjpeg @ 000001e35d8c2d40] Expected boundary '--' not found, instead found a line of 10 bytes

给👴干蒙了。网上有方法说是使用带着gstreamer的opencv就可以实现,但是折腾了4天自己编译opencv最后一堆失败实属绷不住。决定手撕流请求

手动解析Mjpeg流

具体代码参考了这篇文章:

https://blog.csdn.net/Barry_J/article/details/101280263

 效果很好,可以稳定解析mjpeg流

整合到yoloV5项目

项目使用了yolov5进行对目标的监测,并且使用了deepsort进行目标实时跟踪。主体代码是根据github上的开源项目改的:

https://github.com/mikel-brostrom/yolo_tracking

他是使用了yolo5提供的tuils的LoadStream加载器进行视频流加载。对rtsp视频流支持没问题。但是,由于其也是基于opencv写的加载器,对mjpeg支持就会出现问题。为了尽量少的减少对整体项目的修改(我已经把后面的模块写的差不多了重构真的会死人),决定手撕一个类似的加载器。

参考Loadstream的写法,其是通过一个迭代器来完成对视频流的持续读取和更新的。Loadstream可以支持多个流的同时捕获及更新,但我只需要对一个摄像头进行读取就行,因此我删去了处理多个流的部分。

import requests
# _______________________________________________________________________
class LoadStreams_Mjpeg:  # just for mjpeg
    def __init__(self, sources="ip", img_size=640, stride=32):
        self.mode = 'Mjpegstream'
        self.img_size = img_size
        self.stride = stride
        self.imgs = [None]
        self.sources = sources
        self.rect = 1
        cap = cv2.VideoCapture(sources)

        w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
        h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
        self.fps = cap.get(cv2.CAP_PROP_FPS) % 100

        _, self.imgs = cap.read()  # guarantee first frame

        thread = Thread(target=self.update, daemon=True)
        print(f' success ({w}x{h} at {self.fps:.2f} FPS).')
        thread.start()
        
    def update(self):
        r = requests.get(self.sources, stream=True)
        if(r.status_code == 200):
            bytes_arr = bytes()
            frame_count = 0

            for chunk in r.iter_content(chunk_size=1024):
                bytes_arr += chunk
                a = bytes_arr.find(b'\xff\xd8')
                b = bytes_arr.find(b'\xff\xd9')
                if a != -1 and b != -1:
                    jpg = bytes_arr[a:b+2]
                    bytes_arr = bytes_arr[b+2:]
                    i = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
                    self.imgs = i #更新帧
                 
                    # 此处的i就是预测需要用的数据结构,可以将此处i放到共享变量,或者队列中供detect使用
                    # cv2.imshow('i', i)
                    frame_count+=1
                    # print("FPS:",frame_count/(end_time-start_time)
        else:
            print("Received unexpected status code {}".format(r.status_code))

    def __iter__(self):
        self.count = -1
        return self

    def __next__(self):
        self.count += 1
        img0 = [self.imgs.copy()]
        if cv2.waitKey(1) == ord('q'):  # q to quit
            cv2.destroyAllWindows()
            raise StopIteration

        # Letterbox
        img = [letterbox(x, self.img_size, auto=self.rect, stride=self.stride)[0] for x in img0]

        # Stack
        img = np.stack(img, 0)

        # Convert
        img = img[:, :, :, ::-1].transpose(0, 3, 1, 2)  # BGR to RGB, to bsx3x416x416
        img = np.ascontiguousarray(img)

        return self.sources, img, img0, None

    def __len__(self):
        return 0  # 1E12 frames = 32 streams at 30 FPS for 30 years
    
# ___________________

然后要做的,就是在推理函数里使用这个加载器,就能无缝衔接过去啦文章来源地址https://www.toymoban.com/news/detail-724014.html

到了这里,关于网络摄像头rtsp流延迟无法解决,改用Mjpeg流成功保证低延迟稳定传输,并成功解决opencv对Mjpeg流支持问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ESP32-CAM网络摄像头系列-01-基于RTSP协议的局域网视频推流/拉流的简单实现

            由于项目需要,最近开始开坑关于ESP32-CAM系列的RTSP网络摄像头系列,该文章为该系列的第一篇文章。用于记录项目开发过程。         使用ESP32-CAM获取图像数据,并通过RTSP协议将获取到的视频流传输到上位机进行显示。         使用ESP32-CAM进行视频推流,

    2024年02月11日
    浏览(33)
  • 基于FFmpeg+rtsp读取摄像头实时图像

    项目介绍:前端时间做了一个项目用qt 编写软件获取海康摄像头rtsp视频流,实现实时显示。当时采用的是VLC-Qt播放RTSP流这种方式(参考:基于libVLC的视频播放器之二:使用VLC-Qt播放RTSP流_草上爬的博客-CSDN博客_libvlc rtsp)。花了一段时间研究也做出来了,可是发现了一个无法

    2023年04月08日
    浏览(55)
  • 海康威视摄像头播放录像视频(RTSP协议)

    旧URL:rtsp://[username]:[password]@[ipaddress]/[videotype]/ch[number]/[streamtype] 如:rtsp://admin:12345@192.168.25.64:554/h264/ch1/main/av_stream 新URL:rtsp://[username]:[password]@[IP]:554/Streaming/Channels/[channelID][streamID] 如:rtsp://admin:12345@192.168.25.64:554/Streaming/Channels/101 录像机其实和摄像机基本一样,旧URL中摄像

    2024年02月12日
    浏览(55)
  • 2.gstreamer USB摄像头RTSP推流

    目录 1、操作系统版本 2、使用gstreamer播放mp4文件 3、采集USB摄像头视频源,并RTSP推流 4、使用RTSP播放器播放 5、注意事项 使用的虚拟机加ubuntu 20.04 这里需要使用MobaXterm ssh登录,可以正常播放,但是在虚拟机内无法播放,暂时不知道原因 先安装编译gstreamer rtsp需要用到的工具

    2023年04月19日
    浏览(39)
  • 海康威视摄像头的多通道rtsp地址格式

    海康摄像头的rtsp地址通常格式为: “rtsp://username:password@192.168.1.64:554//Streaming/Channels/1” ### 1 代表主流,2代表子流 但在多通道的摄像机,例如红外摄像机,既有rgb图也有红外图,分别在两个通道里,需要独立打开时,就需要指定通道号。 那么可以这样来给rtsp最后的数字串:

    2024年02月13日
    浏览(79)
  • 消除Python OpenCV显示摄像头画面的延迟

    用 Python 通过 OpenCV显示摄像头画面时,如果对视频帧进行一些处理,常常会遇到一个问题,显示的画面比眼睛看到真实场景慢几秒甚至更多,给用户的体验不好。 画面延迟与卡顿的区别 卡顿 是指视频播放时,出现一顿一顿的现象,不流畅,通常每秒播放速率少于10帧就可以

    2024年02月11日
    浏览(34)
  • ffmpeg+nginx实现rtsp协议摄像头web端播放

    nginx(需要安装rtmp模块) ffmpeg 6.0 vlc播放器(本地播放验证) 这些资源已经上传需要的可以自己下载,这个压缩包里的nginx已经安装好所需模块,解压即可使用 下载地址 如果你使用的是海康威视得摄像头构成一般为rtsp://摄像头用户名:密码@摄像头IP:摄像头端口/Streaming/Chann

    2024年02月14日
    浏览(26)
  • NVIDIA DeepStream配置文件解析;摄像头源&&RTSP拉流源输入,RTSP推流输出

    参考: 官方文档 DeepStream Reference Application - deepstream-app 下图为NVIDIA DeepStream 应用程序架构 DeepStream参考应用程序是一个基于GStreamer的解决方案,由一组封装底层api的GStreamer插件组成,以形成一个完整的图。参考应用程序能够接受来自各种源的输入,如摄像头、RTSP输入、编码文

    2024年02月06日
    浏览(29)
  • RTSP 和 RTMP通过ffmpeg实现将本地摄像头推流到RTSP服务器

    一、流媒体:RTSP 和RTMP 1、RTSP 和 RTMP的工作原理 1)RTSP工作原理 用户设备向视频流平台发送 RTSP 请求 视频流平台返回可以操作的请求列表,比如播放、暂停等 用户设备向视频流平台发送具体的请求,比如播放 视频流平台解析请求并调用指定机制启动视频流处理 由于 RTSP 依

    2024年02月05日
    浏览(29)
  • 解决树莓派原装libcamera(csi)摄像头无法通过opencv读取数据的问题

    1.1 硬件 树莓派4B 树莓派原装CSI摄像头IMX219(libcamera Camera Raspberry Pi) 1.2 软件 64位树莓派arrch64,Debian 11(bullseye) Python3.9 OpenCv 此时返回的ret,frame = (False, None) 继续执行下面这条语句 报错如下 若直接执行 则报错如下 出现上述情况,应该是opencv读取不到摄像头数据所致 接下来排

    2024年02月03日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包