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
核心功能说明
-
交互逻辑:
-
访问
http://你的IP:3344
会显示文字、按钮和隐藏的视频区域 -
点击按钮发送请求控制摄像头开关
-
实时视频流通过 MJPEG 格式传输(类似监控摄像头)
-
-
技术细节:
-
使用
multipart/x-mixed-replace
实现实时流 -
全局变量控制摄像头状态
-
前端通过 JavaScript 动态切换视频显示
-
使用步骤
-
运行程序:
python server.py
-
手机访问:
-
在手机浏览器输入
http://你的本地IP:3344
(确保手机和电脑在同一网络) -
点击按钮即可开启/关闭摄像头
-
注意事项
-
硬件要求:
-
仅限本地设备运行(云服务器通常无物理摄像头)
-
确保摄像头驱动正常(Windows/Mac/Linux 需权限)
-
-
网络配置:
-
本地测试需关闭电脑防火墙或允许 3344 端口
-
公网访问需配置端口转发(建议搭配 frp 内网穿透)
-