• Win10 笔记本本地摄像头提供 Rtsp 视频流服务


    1. 安装 FFmpeg

    下载 FFmpeg配置环境,执行 ffmpeg -version 测试安装是否成功。

    2. 下载 EasyDarwin

    下载后解压到本地,双击 EasyDarwin.exe 执行,打开一个 cmd 启动服务端。
    浏览器搜索 http://127.0.0.1:10008/ 进入网页,则安装成功。

    3. 启动本地摄像头

    另打开一个 cmd,键入 ffmpeg -list_devices true -f dshow -i dummy 会打印本机的多媒体设备,找到 video
    在这里插入图片描述
    则左边的就是相机设备的名字,譬如这里是:USB2.0 HD UVC WebCam
    执行 ffmpeg -f dshow -i video="{你的 video 设备名字}" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport tcp -f rtsp rtsp://127.0.0.1/test
    在推流列表中找到源地址:
    在这里插入图片描述

    4. 可视化

    下载 VLC,打开【播放】—【播放】—【网络】,粘贴地址,稍等一会儿即可。
    在这里插入图片描述

    5. Python 接收 RTSP 流

    import threading 
    import cv2 
    
    
    class RTSCapture(cv2.VideoCapture):
        _cur_frame = None 
        _reading = False 
        schemes = ["rtsp://", "rtmp://"]
    
        @staticmethod
        def create(url, *schemes):
            rtscap = RTSCapture(url)
            rtscap.frame_receiver = threading.Thread(target=rtscap.recv_frame, daemon=True)
            rtscap.schemes.extend(schemes)
    
            if isinstance(url, str) and url.startswith(tuple(rtscap.schemes)):
                rtscap._reading = True 
            elif isinstance(url, int):
                pass 
            return rtscap
        
        def isStarted(self):
            ok = self.isOpened()
            if ok and self._reading:
                ok = self.frame_receiver.is_alive()
            return ok 
        
        def recv_frame(self):
            while self._reading and self.isOpened():
                ok, frame = self.read()
                if not ok:
                    break 
                self._cur_frame = frame 
            self._reading = False 
        
        def read2(self):
            frame = self._cur_frame
            self._cur_frame = None 
            return frame is not None, frame 
    
        def start_read(self):
            self.frame_receiver.start()
            self.read_latest_frame = self.read2 if self._reading else self.read 
        
        def stop_read(self):
            self._reading = False 
            if self.frame_receiver.is_alive():
                self.frame_receiver.join()
    
    
    if __name__ == "__main__":
        rtscap = RTSCapture.create(url)
        rtscap.start_read()
        cnt = 0
        while rtscap.isStarted():
            ok, frame = rtscap.read_latest_frame()
            if frame is not None:
                cnt += 1
                if cnt < 1024: # 丢弃前 1024 帧
                    continue 
                cv2.imwrite("./temp.png", frame)
    
        rtscap.stop_read()
        rtscap.release() 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
  • 相关阅读:
    2018.7-2019.7一周年Java进阶架构师技术文章整理 建议收藏
    Hadoop -- NN和2NN的工作机制
    【MyBatis源码分析】二、MyBatis回顾
    mysql 位操作
    Python-print骚操作之rich库
    用wpf替代winform 解决PLC数据量过大页面卡顿的问题
    selenium.chrome怎么写扩展拦截或转发请求?
    ES6 set map初识
    【Power Automate】Power Automate中使用SharePoint caml query for GEQ datetime
    【Vue入门】MVVM数据双向绑定与Vue的生命周期
  • 原文地址:https://blog.csdn.net/WinerChopin/article/details/128051265