flask - 使用flask-socketio从网络摄像头流式传输到服务器
问题描述
我正在尝试构建一个 Web 应用程序,其中图像从客户端的网络摄像头流式传输到服务器,服务器对图像执行一些计算,并将这些计算的结果实时发送回客户端。
到目前为止,我已经用flask-socketio尝试过,修改了这段代码:
https://github.com/dxue2012/python-webcam-flask
我认为这又是从这个例子改编而来的:
https://github.com/miguelgrinberg/flask-video-streaming
客户端的相关代码位是:
function sendSnapshot() {
if (!localMediaStream) {
return;
}
ctx.drawImage(video, 0, 0, video.videoWidth, video.videoHeight, 0, 0, 300, 150);
let dataURL = canvas.toDataURL('image/jpeg');
socket.emit('input image', dataURL);
}
navigator.mediaDevices.getUserMedia(constraints).then(function(stream) {
video.srcObject = stream;
localMediaStream = stream;
setInterval(function () {
sendSnapshot();
}, 50);
}).catch(function(error) {
console.log(error);
});
在服务器上:
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
app.config['DEBUG'] = True
socketio = SocketIO(app)
val = 0
@socketio.on('input image', namespace='/test')
def test_message(input):
input = input.split(",")[1]
global val
val = do_stuff(input)
@socketio.on('get value', namespace='/test')
def send_stuff_back():
global val
emit("val ready", val)
除了在 GitHub 示例中,我不需要将图像发送回客户端,只需要小得多的数据。
问题是,即便如此,除非发送到服务器的图像非常小,否则一切都非常滞后,也就是说,它确实违背了首先将它们发送到服务器的目的。
如果跳过图像计算,问题仍然存在,问题似乎在于发送图像。
现在我想知道这是否是这种 canvas/toDataURL 流媒体方法的预期行为,或者我做错了什么。
如果这是意料之中的,也许有人可以为我指明一个更实际的方法来实现我正在尝试做的事情。
(肯定安装了eventlet;我正在使用heroku进行部署以防万一。)
任何帮助表示赞赏!
编辑 1:
我已经增加了“max_decode_packets”,所以这不是问题的根源。
编辑 2:
网络:1
编辑 3:
解决方案
推荐阅读
- c++ - 在 C++ 中逐行读取字符串并且不要以空格停止
- java - IntelliJ/JDK 11:找不到符号名称()接口 java.lang.annotation.Annotation
- imgur - 在韩国上传图片时禁止出现错误 400
- kubernetes - 如何监控gcloud k8s HTTP失败率?
- java - 当 maven 构建运行测试时,Spring Boot 项目抛出 *$$EnhancerBySpringCGLIB 不是 @AspectJ 方面
- react-native - 键盘打开时TextInput不可见Expo React Native
- c - 引用自:/usr/local/opt/glib/lib/libgobject-2.0.0.dylib - 移植到 c (gtk/cairo) 的 bitlib 图形库
- php - 未读消息功能在 Laravel 中不起作用
- ssrs-2012 - SSRS相关的格式化
- json - Qt 从 JSON 文件读取数据以在 .ui.qml 文件中使用