当前位置: 首页 > news >正文

FRP驱动本地摄像头实现远程图传

1. 后端代码 (server.py)

from flask import Flask, Response, render_template_string
import cv2
import threading

app = Flask(__name__)

# 全局变量控制摄像头开关
camera_active = False
camera = None

def generate_frames():
    global camera
    while camera_active:
        success, frame = camera.read()
        if not success:
            break
        # 将帧转换为 JPEG 格式
        ret, buffer = cv2.imencode('.jpg', frame)
        if not ret:
            break
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + buffer.tobytes() + b'\r\n')

@app.route('/')
def index():
    return render_template_string('''
        <h1>你好啊世界</h1>
        <button onclick="toggleCamera()" id="camBtn">开启摄像头</button>
        <br><br>
        <img id="video" src="" style="display:none; width:640px;">
        
        <script>
            let isCameraOn = false;
            function toggleCamera() {
                const btn = document.getElementById('camBtn');
                const video = document.getElementById('video');
                
                if (!isCameraOn) {
                    fetch('/control?action=start').then(() => {
                        video.src = "/video_feed";
                        video.style.display = 'block';
                        btn.innerText = '关闭摄像头';
                        isCameraOn = true;
                    });
                } else {
                    fetch('/control?action=stop').then(() => {
                        video.src = '';
                        video.style.display = 'none';
                        btn.innerText = '开启摄像头';
                        isCameraOn = false;
                    });
                }
            }
        </script>
    ''')

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

@app.route('/control')
def control():
    global camera_active, camera
    action = request.args.get('action')
    
    if action == 'start' and not camera_active:
        camera = cv2.VideoCapture(0)
        if camera.isOpened():
            camera_active = True
            return "摄像头已启动", 200
        else:
            return "摄像头打开失败", 500
    
    elif action == 'stop' and camera_active:
        camera_active = False
        camera.release()
        return "摄像头已关闭", 200
    
    return "无效操作", 400

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

2. 安装依赖
pip install flask opencv-python

核心功能说明

  1. 交互逻辑

    • 访问 http://你的IP:3344 会显示文字、按钮和隐藏的视频区域

    • 点击按钮发送请求控制摄像头开关

    • 实时视频流通过 MJPEG 格式传输(类似监控摄像头)

  2. 技术细节

    • 使用 multipart/x-mixed-replace 实现实时流

    • 全局变量控制摄像头状态

    • 前端通过 JavaScript 动态切换视频显示


使用步骤

  1. 运行程序

    python server.py
  2. 手机访问

    • 在手机浏览器输入 http://你的本地IP:3344(确保手机和电脑在同一网络)

    • 点击按钮即可开启/关闭摄像头


注意事项

  1. 硬件要求

    • 仅限本地设备运行(云服务器通常无物理摄像头)

    • 确保摄像头驱动正常(Windows/Mac/Linux 需权限)

  2. 网络配置

    • 本地测试需关闭电脑防火墙或允许 3344 端口

    • 公网访问需配置端口转发(建议搭配 frp 内网穿透)

相关文章:

  • js异步机制
  • Unity3D多线程与协程优化分析
  • 【资料分享】瑞芯微RK3506(3核ARM+Cortex-A7 + ARM Cortex-M0)工业核心板选型资料
  • 【KWDB 创作者计划】_ruby基础语法
  • JVM虚拟机篇(七):JVM垃圾回收器全面解析与G1深度探秘及四种引用详解
  • C语言【输出字符串中的大写字母】
  • Codeforces Round 1016 (Div. 3)
  • vue3前一月/年+后一月/年
  • 基于springcloud的“微服务架构的巡游出租管理平台”的设计与实现(源码+数据库+文档+PPT)
  • 【Linux】jumpserver开源堡垒机部署
  • 【时时三省】(C语言基础)选择结构的嵌套
  • Linux 时间同步工具 Chrony 简介与使用
  • Java学习——day25(多线程基础与线程创建方式)
  • idea 安装 proxyai 后的使用方法
  • DAPP实战篇:使用web3.js连接合约
  • java设计模式-模板方法模式
  • 【JavaSE】异常
  • OSPF基础入门篇②:OSPF邻居建立篇-网络设备的“社交礼仪“
  • Android里蓝牙使用流程以及问题详解
  • 深度强化学习基础 0:通用学习方法
  • 建设网站需要虚拟空间/宁国网络推广
  • 做最漂亮的网站/网上在哪里打广告最有效
  • 本地人wordpress怎么同步到服务器/济南seo外贸网站建设
  • 如何判断网站有cdn加速/搜索引擎营销案例有哪些
  • 做网站需要到哪些部门登记/百度seo优化工具
  • 律师怎样做网站/游戏代理平台