一个超简单的直播方案使用flask实现代码不到100行 我真的服了

前言

注意提前安装一下flask 和opencv-python
命令如下:
pip install opencv-python
pip install flask

要安装 cv2(即 OpenCV 的 Python 绑定),你可以使用 Python 的包管理器 pip。在你的终端或命令提示符中运行以下命令:

pip install opencv-python

对于 index.html 文件的位置,当使用 Flask 框架时,你应该将 HTML 文件放置在 Flask 项目的 templates 目录中。Flask 默认会在这个目录下寻找并渲染模板。

Flask 应用结构大致如下:

my_flask_app/
│
├── app.py          # Flask 应用的主文件
└── templates/      # 存放 HTML 模板的目录
    └── index.html  # 你的 HTML 文件

在这个结构中,app.py 是你的 Flask 应用主文件,templates 是存放模板的目录。index.html 应该放在 templates 目录下。

确保在你的 Flask 应用中正确地设置了这个结构,这样 Flask 就能找到并渲染 index.html 文件了。当你在 Flask 应用中使用 render_template('index.html') 函数时,Flask 会自动在 templates 文件夹中查找名为 index.html 的文件。

在这里插入图片描述
一个app.py
一个templates目录下的
index.html

首先上python部分代码

实现 Flask 中的实时流媒体通常涉及到以下步骤:

捕获视频流:使用如 OpenCV 这样的库来捕获视频流。
生成流:将视频流分割成一系列连续的帧,并将每一帧编码为 JPEG 或其他格式。
通过 Flask 传输:使用 Flask 的路由和响应对象来连续发送这些帧。
下面是一个使用 Flask 实现实时视频流的基本示例:

from flask import Flask, Response, render_template
import cv2

app = Flask(__name__)


def generate_frames():
    camera = cv2.VideoCapture(0)  # 使用摄像头

    while True:
        success, frame = camera.read()  # 读取每一帧
        if not success:
            break
        else:
            ret, buffer = cv2.imencode('.jpg', frame)  # 将帧编码为 JPEG
            frame = buffer.tobytes()
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')  # 生成帧


@app.route('/video_feed')
def video_feed():
    return Response(generate_frames(),
                    mimetype='multipart/x-mixed-replace; boundary=frame')


@app.route('/')
def index():
    return render_template('index.html')


if __name__ == '__main__':
    app.run(debug=True, port=4488)

python代码详细解释:

这段代码是使用 Flask 框架和 OpenCV 库来创建一个简单的视频流应用程序的 Python 脚本。我将逐行解释这段代码的功能和目的:

  1. from flask import Flask, Response, render_template: 导入 Flask 框架的几个关键组件。

    • Flask:用于创建 Flask 应用实例。
    • Response:用于构造 HTTP 响应。
    • render_template:用于渲染 HTML 模板。
  2. import cv2: 导入 OpenCV 库,这是一个处理图像和视频的强大库。

  3. app = Flask(__name__): 创建一个 Flask 应用实例。

  4. def generate_frames(): 定义一个名为 generate_frames 的函数,用于生成视频帧。

    • camera = cv2.VideoCapture(0): 使用 OpenCV 打开摄像头。0 表示默认摄像头。
    • while True: 开始一个无限循环,用于连续捕获帧。
    • success, frame = camera.read(): 从摄像头读取一帧。如果读取成功,success 为 True。
    • if not success: 如果读取失败,跳出循环。
    • ret, buffer = cv2.imencode('.jpg', frame): 将捕获的帧编码为 JPEG 格式。
    • frame = buffer.tobytes(): 将 JPEG 图像转换为字节。
    • yield ...: 生成并返回一个多部分响应体,每一部分都是一个 JPEG 图像帧。
  5. @app.route('/video_feed'): 定义一个路由 /video_feed,当访问这个 URL 时,会调用下面的 video_feed 函数。

    • def video_feed(): 定义一个函数处理视频流。
    • return Response(generate_frames(), ...): 返回一个 HTTP 响应,内容是由 generate_frames 函数生成的视频帧流。
  6. @app.route('/'): 定义根 URL 的路由。

    • def index(): 定义一个处理根 URL 的函数。
    • return render_template('index.html'): 当访问根 URL 时,渲染并返回 index.html 模板。
  7. if __name__ == '__main__': 当脚本直接运行时,执行以下代码块。

    • app.run(debug=True, port=4488): 启动 Flask 应用,开启调试模式,并设置端口为 4488。

总的来说,这个脚本创建了一个 Flask web 应用,它可以从摄像头捕获视频流,并通过 /video_feed 路径提供这个视频流。当用户访问根 URL 时,应用会显示一个 HTML 页面(index.html),这个页面可以嵌入视频流。

index.html代码如下:

<!DOCTYPE html>
<html>
<head>
    <title>实时视频流</title>
</head>
<body>
<h1>实时视频流</h1>
<img src="{{ url_for('video_feed') }}"/>
</body>
</html>

html代码详细解释

这段代码是一个 HTML 页面的源代码,用于展示从 Flask 应用获取的实时视频流。我将逐行解释这个 HTML 页面的结构和功能:

  1. <!DOCTYPE html>: 这行声明了文档类型和 HTML 版本,这里指定为 HTML5。

  2. <html>: HTML 文档的根元素开始。

  3. <head>: 文档头部的开始标签。<head> 区域主要包含关于文档的元数据。

  4. <title>实时视频流</title>: 设置了这个 HTML 页面的标题,这在浏览器的标签页上显示为“实时视频流”。

  5. </head>: 文档头部的结束标签。

  6. <body>: 文档的主体部分开始。这是所有可见内容的容器。

  7. <h1>实时视频流</h1>: 在页面上定义一个大标题,内容是“实时视频流”。

  8. <img src="{{ url_for('video_feed') }}"/>: 插入一个图片。这里的图片源(src)是通过 Flask 的 url_for 函数动态生成的,指向 Flask 应用中定义的 video_feed 路由。这意味着这个 <img> 标签将显示从 /video_feed 路由返回的内容,即实时视频流。

    • {{ url_for('video_feed') }}: 是 Flask 的模板语法,用于生成 video_feed 函数对应的 URL。在 Flask 中,url_for 函数用于构建指向特定函数的 URL,这里是指向那个生成实时视频帧的函数。
  9. </body>: 文档主体部分结束。

  10. </html>: HTML 文档的根元素结束。

总的来说,这个 HTML 页面的目的是展示一个标题,并在页面上嵌入一个实时视频流。视频流的来源是 Flask 应用中的 /video_feed 路径,这个路径由之前提到的 Python 脚本中定义的函数提供视频帧。当用户访问这个页面时,他们将看到一个标题和一个实时展示视频流的图片区域。

直接运行

在这里插入图片描述

访问

给大家看我的 虾缸
在这里插入图片描述

这个直播太简单 。 我的蒙圈了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈钇谷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值