如何利用Python构建一个本地局域网视频流服务器?

云婷小哥_5811

云婷小哥_5811

2026-06-12

415人浏览

原创

cv2.videocapture无画面需先检查设备索引与系统权限:macos需授权相机、linux需加入video组、windows注意摄像头启用;可用循环枚举有效索引,必要时指定后端或设置fourcc。

如何利用python构建一个本地局域网视频流服务器?

cv2.VideoCapture 读取摄像头但没画面?先确认设备索引和权限

很多情况下 cv2.VideoCapture(0) 打不开,不是代码问题,而是系统没给访问权。macOS 需在「系统设置 → 隐私与安全性 → 相机」里勾选 Python 或终端;Linux 要确保当前用户在 video 用户组(sudo usermod -aG video $USER);Windows 一般无此限制,但某些笔记本会默认禁用内置摄像头。

设备索引也不一定是 0:USB 摄像头可能映射为 /dev/video1(Linux)或更高编号(Windows/macOS)。可用以下方式枚举:

import cv2
for i in range(5):
    cap = cv2.VideoCapture(i)
    if cap.isOpened():
        print(f"Camera {i} is available")
        cap.release()
  • 如果 cap.isOpened() 返回 False,别急着改逻辑,先查设备是否存在、驱动是否加载
  • 某些 USB 摄像头需指定后端(如 cv2.CAP_V4L2),否则帧率极低或卡死
  • OpenCV 默认使用 MJPEG 压缩时,部分摄像头需手动设置 cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*'MJPG'))

Flask + cv2.imencode 实现实时 MJPEG 流,但浏览器卡顿?注意响应头和缓冲

MJPEG 流本质是不断发送 multipart/x-mixed-replace 响应块,浏览器靠这个维持连接。关键不在“怎么编码”,而在“怎么发不被缓存/截断”。

常见错误是直接用 return Response(gen(), mimetype='multipart/x-mixed-replace; boundary=frame') 却忽略生成器阻塞和响应流控制。必须确保:

  • 每个帧前加完整 HTTP boundary 块(b'--frame\r\nContent-Type: image/jpeg\r\n\r\n' + frame_bytes + b'\r\n'
  • 生成器函数内每帧后调用 time.sleep(0.03)(约 30 FPS),否则 CPU 扛不住,且 Flask 开发服务器不支持长连接流控
  • 生产环境务必换 gunicorn + gevent,或直接用 uvicorn 配合 Starlette,原生支持异步流响应

示例关键片段:

def gen():
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        _, buffer = cv2.imencode('.jpg', frame, [cv2.IMWRITE_JPEG_QUALITY, 70])
        frame_bytes = buffer.tobytes()
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame_bytes + b'\r\n')

局域网其他设备打不开 http://192.168.x.x:5000?检查绑定地址和防火墙

Flask 默认只监听 127.0.0.1,外部设备根本连不上。启动时必须显式指定 host='0.0.0.0'

Shadows Python Sensei
Shadows Python Sensei

Python 最佳实践助手——代码规范、设计模式、性能优化、测试与类型注解。适用于编写或审查 Python 代码。

下载
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=False)

但这只是第一步。Linux/macOS 可能被防火墙拦截(如 ufwfirewalld),Windows 则常因「专用网络 / 公共网络」配置导致入站规则失效。临时验证可关掉防火墙,但正式部署必须添加放行规则:

  • Linux:sudo ufw allow 5000
  • macOS:「系统设置 → 网络 → 防火墙选项 → + 添加 Python 进程」
  • Windows:控制面板 → Windows Defender 防火墙 → 允许应用通过防火墙 → 勾选 Python.exe(注意区分“专用”和“公用”)

另外,手机浏览器访问时,有些安卓厂商浏览器(如华为、小米)会强制走代理或拦截非 HTTPS 的媒体流,建议优先用 Chrome 或 Firefox 测试。

想支持多路摄像头或更高并发?别硬扛,用 threading 分离采集与推流

单线程里边读帧边编码边 HTTP 推送,一卡全卡。真实场景下,采集、编码、分发三者必须解耦。

最轻量做法是为每个摄像头起一个独立采集线程,把最新帧存进 queue.Queuethreading.local 维护的字典里,HTTP 响应生成器只负责从共享缓存取帧、编码、推送。这样即使某路流被客户端断开,也不会影响其他路采集。

  • 避免用全局变量直接存 frame,Python GIL 下多线程写同一对象有竞态风险
  • queue.Queue(maxsize=1) 可自动丢弃旧帧,防止推流慢导致内存暴涨
  • 如果并发超 10+ 客户端,HTTP 方案很快见顶,此时该切到 ffmpeg 推 RTMP(用 subprocess 启动),再用 nginx-rtmpJanus 转发,Python 只做信令控制

复杂点从来不在“怎么显示”,而在于“谁在什么时候决定要不要丢帧、降分辨率、切编码参数”。这些决策点必须暴露为可配置项,而不是写死在生成器里。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python flask

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1551

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

3624

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1549

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

20697

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2567

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2627

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1063

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

576

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2023

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程