使用Flask+OpenCV实现浏览器/微信小程序的视频流传输

这篇具有很好参考价值的文章主要介绍了使用Flask+OpenCV实现浏览器/微信小程序的视频流传输。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用Flask+OpenCV实现浏览器和微信小程序的视频流传输

目录

前言
一、 Flask+浏览器实现
二、 Flask+微信小程序实现
三、Flask+uni-app小程序实现
后记

前言

近期在做的东西涉及到实时视频的处理,碰到一些问题,因此将之记录下来,便于日后翻看,同时也希望能给遇到同样问题的小伙伴提供帮助。

一、Flask+浏览器实现

实现代码如下:

分为 app.py 和index.html。

1. Flask代码示例

# -----------------------------
# app.py
# -----------------------------
from flask import Flask, render_template, Response
import cv2

class VideoCamera(object):
    def __init__(self):
        # 通过opencv获取实时视频流
        self.video = cv2.VideoCapture(0) 
    
    def __del__(self):
        self.video.release()
    
    def get_frame(self):
        success, image = self.video.read()
        # 因为opencv读取的图片并非jpeg格式,因此要用motion JPEG模式需要先将图片转码成jpg格式图片
        ret, jpeg = cv2.imencode('.jpg', image)
        return jpeg.tobytes()

app = Flask(__name__)

@app.route('/')  # 主页
def index():
    # jinja2模板,具体格式保存在index.html文件中
    return render_template('index.html')

def gen(camera):
    while True:
        frame = camera.get_frame()
        # 使用generator函数输出视频流, 每次请求输出的content类型是image/jpeg
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')

@app.route('/video_feed')  # 这个地址返回视频流响应
def video_feed():
    return Response(gen(VideoCamera()),
                    mimetype='multipart/x-mixed-replace; boundary=frame')   

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

2. 浏览器HTML代码示例

<!-- ———————————————————————— -->
<!-- index.html -->
<!-- ———————————————————————— -->
<html>
  <head>
    <title>Video Streaming Demonstration</title>
  </head>
  <body>
    <!-- 使用Jinja2模板,指向路由video_feed -->
    <img src="{{ url_for('video_feed') }}">
  </body>
</html>

此处需要注意的是,cv2这个库的版本有很多,如果出现一些bug一直解决不了,建议降低版本试试。

pip install opencv-python== 3.4.8.29

二、 Flask+微信小程序实现

微信小程序支持展示以下几种格式的视频流:

  1. FLV格式:FLV(Flash Video)是一种Adobe Flash技术中使用的视频流格式,通常使用在Web播放器和一些视频网站上。微信小程序中可以通过live-player组件来展示FLV格式的视频流。
  2. HLS格式:HLS(HTTP Live Streaming)是一种苹果公司开发的视频流协议,通过分割视频流为短片段,利用HTTP协议传输,实现了较好的稳定性和兼容性。微信小程序中可以通过live-player组件来展示HLS格式的视频流。
  3. RTMP格式:RTMP(Real Time Messaging Protocol)是Adobe公司开发的一种视频流协议,广泛应用于直播领域。微信小程序中可以通过live-player组件来展示RTMP格式的视频流。

需要注意的是,展示视频流需要满足微信小程序的一些要求,例如视频流地址需要使用https协议、服务器需要支持CORS跨域等。如果使用的是自己的服务器来提供视频流,需要确保服务器满足这些要求。

在微信小程序中展示实时视频流,可以使用小程序自带的live-player组件。live-player组件支持播放RTMP、HLS、FLV等格式的实时视频流。需要将实时视频流的地址传递给live-player组件的src属性,并设置一些其他的属性,例如modeautoplaymuted等,来控制视频的播放行为。

1. 微信小程序前端代码示例

前端中调用视频流服务:在微信小程序的前端中,可以使用live-player组件来播放视频流。在live-player组件的src属性中,设置Flask应用程序的视频流服务地址即可。

<live-player src="https://your_flask_server.com/video_feed" mode="live"></live-player>

2. 后端Flask代码示例:

import cv2
from flask import Flask, Response
from flask_cors import CORS

app = Flask(__name__)
# 进行跨域处理
CORS(app)

# 用于不断地读取摄像头或视频文件中的帧,并将其转换成JPG格式的图片
def generate_frames():
    camera = cv2.VideoCapture(0)  # 打开摄像头
    while True:
        success, frame = camera.read()
        if not success:
            break
        ret, buffer = cv2.imencode('.jpg', frame)
        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():
    # 这是一种特殊的HTTP响应格式,用于在响应数据中分隔多个数据块。
    # Flask应用程序会将这些数据块发送给客户端,客户端可以将它们转换成视频流进行播放。
    return Response(generate_frames(),
                    mimetype='multipart/x-mixed-replace; boundary=frame')

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

三、Flask+uni-app小程序实现

上面第二部分提到的,是针对Flask和微信小程序的视频流展示方式,如果要在uni-app小程序中展示实时视频流,需要使用uni-app提供的组件来实现。

在uni-app中,可以使用live-pusherlive-player组件来实现视频流的推送和播放。

1. uni-app代码示例

live-pusher组件用于推送实时视频流到服务器(前端视频流—>服务器),需要在小程序中使用微信开发者工具提供的摄像头API获取摄像头的视频流,并将其传递给live-pusher组件。下面是一个简单的示例代码:

<live-pusher url="rtmp://your_server.com/live/stream" mode="RTC"></live-pusher>

在上面的代码中,url属性设置了视频流推送的地址,mode属性设置了推送模式,这里使用的是RTC模式。可以根据自己的实际情况设置这些属性。

live-player组件用于播放服务器端推送过来的视频流(服务器视频流—>前端),在小程序中将服务器端的视频流地址传递给live-player组件即可。下面是一个简单的示例代码:

<live-player src="http://your_server.com/live/stream" mode="live"></live-player>

在上面的代码中,src属性设置了视频流的地址,mode属性设置了播放模式,这里使用的是live模式。可以根据自己的实际情况设置这些属性。

需要注意的是,在实际应用中,可能需要对视频流进行编码、解码、压缩等处理,以便在网络上高效地传输。

2. Flask代码示例

import cv2
from flask import Flask, Response
from flask_cors import CORS

app = Flask(__name__)
# 进行跨域处理
CORS(app)

# 用于不断地读取摄像头或视频文件中的帧,并将其转换成JPG格式的图片
def generate_frames():
    camera = cv2.VideoCapture(0)  # 打开摄像头
    while True:
        success, frame = camera.read()
        if not success:
            break
        ret, buffer = cv2.imencode('.jpg', frame)
        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():
    # 这是一种特殊的HTTP响应格式,用于在响应数据中分隔多个数据块。
    # Flask应用程序会将这些数据块发送给客户端,客户端可以将它们转换成视频流进行播放。
    return Response(generate_frames(),
                    mimetype='multipart/x-mixed-replace; boundary=frame')

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

是的没错,看完你会发现其实第三和第二的Flask代码示例是一样的,为什么呢?

因为后端的代码并不关心前端使用的是什么框架,它只需要根据标准的HTTP协议接收和响应请求即可。因此,无论使用什么前端框架来展示视频流,后端的Flask代码都是不需要修改的。


后记

本人也是第一次接触,如有错误之处,请各位指教,我们共同探讨进步。文章来源地址https://www.toymoban.com/news/detail-735446.html

到了这里,关于使用Flask+OpenCV实现浏览器/微信小程序的视频流传输的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • PC端浏览器如何访问微信小程序

    小程序通过扫描二维码可以在手机浏览器打开,但用电脑浏览器访问同样的url却不能正常访问。 通过F12打开 开发调试工具,点击toggle device toolbar(如下图)即可。 =================================================================================== 注:获取小程序url 通过网络封包分析软件抓包获

    2024年02月11日
    浏览(62)
  • uniapp新建项目后,如何在浏览器和微信小程序运行

    第一步:新建项目 参考uni-app官网提供了HBuilderX可视化创建和vue cli命令两种方式创建项目,由于HBuilder和它都是DCloud公司的产品,使用它创建项目可以很方便的下载插件什么的。 新建项目很简单: https://uniapp.dcloud.net.cn/quickstart-hx.html 下载HBuilderX,然后参照这个文档点两下选择

    2024年02月03日
    浏览(62)
  • CSS:浏览器设置placeholder样式 / 微信小程序设置placeholder样式

    一、web 设置placeholder 设置浏览器的placeholder样式 二、微信小程序设置placeholder 在小程序中设置placeholder样式需要使用组件的内置属性。可以通过以下方式设置input和textarea的placeholder样式: 在上面的示例中,placeholder-style属性被设置为一个字符串,包含了CSS样式。在这个字符串

    2024年02月04日
    浏览(63)
  • 从短信,H5页面浏览器跳转到微信小程序指定页面

     在H5页面或者短信链接中要进行小程序跳转,所以需要通过生成具体页面的链接进行跳转 1、参考链接生成接口,详见微信官方文档地址:urllink.generate | 微信开放文档      重点参数如图:       2、后端调用api进行生成  请求完的结果: 3、前端页面入口  4、编写一个中间

    2024年02月11日
    浏览(76)
  • 微信小程序下web-view和浏览器下的iframe详解

    一、微信小程序web-view通信及使用   1、web-view在微信小程序下始终保持全屏(功能区要在链接下完成) 2、微信小程序向web-view传参只能通过url地址拼接 3、web-view向微信小程序传惨可通过特定的时机传参 链接  二、iframe使用 1、可通过css自定义样式大小 2、可通过url问号拼接

    2024年02月06日
    浏览(47)
  • H5接入到微信小程序或者微信浏览器打开相机界面会白屏刷新

    最近开发的一个需求是H5项目,并嵌入到小程序中,其中有模块用到了拍照功能。 前端同事们开发这个功能嵌入到小程序后会有bug,只要打开相机拍照后返回界面,界面会白屏刷新并且返回到了上一级,前端同事查询微信论坛或者其他地方的问答都说是手机内存不足或者运行

    2024年02月04日
    浏览(55)
  • 创建一个uni-app项目并运行再浏览器及微信小程序

    第一步: 打开HBuilder X 点击文件列表 新建 项目 第二步: 如图所示(根据项目所需要的进行选择) 第三步: 创建完成之后项目文件的(介绍以及作用) 第四步: 如何将uni-app项目运行到不同的浏览器,我在这里运行的是微信小程序 (1) 点击运行可以查看到项目的多种运行方式 (2

    2024年02月12日
    浏览(74)
  • 夜神模拟器抓包微信小程序(进入浏览器,弹出安全警告(安全证书有问题解决方法)

    1. 声明:本文仅限学习研究讨论,切忌做非法乱纪之事! 即使按照其它教程的安装证书,也只是把证书安装到了用户下面,然而安卓高版本(7.0)之后呢,app可以只信任指定证书和系统内置的证书,后续用户安装的证书是不生效的。(如果你已经安装到用户下面了,弹出安全

    2024年02月07日
    浏览(137)
  • 什么是无头浏览器?如何使用Golang实现无头浏览器截图?

    在Web开发中,有时需要对网页进行截图,以便进行页面预览、测试等操作。 而使用无头浏览器来实现截图功能,可以避免手动操作的繁琐和不稳定性。 这篇文章将介绍: 使用Golang进行无头浏览器的截图,轻松实现页面预览、测试和模拟用户操作。 这篇文章发完,有朋友在朋

    2024年02月05日
    浏览(57)
  • 基于selenium实现多个脚本只打开一次浏览器(重复使用浏览器)

    本文思路来源【Selenium】控制当前已经打开的 chrome浏览器窗口(高级版)_是小菜欸的博客-CSDN博客 selenium 自动打开Chrome浏览器且重复使用已打开的Chrome实例_飞扬的箭的博客-CSDN博客 但是这一篇文章的方式对于我来说有一个缺点,即每一次都需要新创建一个浏览器,或者需要

    2024年02月16日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包