【发布时间】:2020-03-14 20:14:23
【问题描述】:
我正在尝试构建一个客户端服务器架构,在该架构中我使用 getUserMedia() 从用户的网络摄像头捕获实时视频。现在,我不想直接在<video> 标签中显示视频,而是想将其发送到我的烧瓶服务器,对帧进行一些处理并将其返回到我的网页。
我使用 socketio 来创建客户端-服务器连接。 这是我的 index.html 中的脚本。请原谅我的错误或任何错误的代码。
<div id="container">
<video autoplay="true" id="videoElement">
</video>
</div>
<script type="text/javascript" charset="utf-8">
var socket = io('http://127.0.0.1:5000');
// checking for connection
socket.on('connect', function(){
console.log("Connected... ", socket.connected)
});
var video = document.querySelector("#videoElement");
// asking permission to access the system camera of user, capturing live
// video on getting true.
if (navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia({ video: true })
.then(function (stream) {
// instead of showing it directly in <video>, I want to send these frame to server
//video_t.srcObject = stream
//this code might be wrong, but this is what I want to do.
socket.emit('catch-frame', { image: true, buffer: getFrame() });
})
.catch(function (err0r) {
console.log(err0r)
console.log("Something went wrong!");
});
}
// returns a frame encoded in base64
const getFrame = () => {
const canvas = document.createElement('canvas');
canvas.width = video_t.videoWidth;
canvas.height = video_t.videoHeight;
canvas.getContext('2d').drawImage(video_t, 0, 0);
const data = canvas.toDataURL('image/png');
return data;
}
// receive the frame from the server after processed and now I want display them in either
// <video> or <img>
socket.on('response_back', function(frame){
// this code here is wrong, but again this is what something I want to do.
video.srcObject = frame;
});
</script>
在我的 app.py -
from flask import Flask, render_template
from flask_socketio import SocketIO, emit
app = Flask(__name__)
socketio = SocketIO(app)
@app.route('/', methods=['POST', 'GET'])
def index():
return render_template('index.html')
@socketio.on('catch-frame')
def catch_frame(data):
## getting the data frames
## do some processing
## send it back to client
emit('response_back', data) ## ??
if __name__ == '__main__':
socketio.run(app, host='127.0.0.1')
我也想过通过 WebRTC 来做这件事,但我只是获取点对点的代码。
那么,谁能帮我解决这个问题? 提前感谢您的帮助。
【问题讨论】:
-
您分享的脚本的哪一部分需要帮助?请添加有关此代码不起作用的详细信息。
-
我在尝试使用
socket.emit('catch-frame', { image: true, buffer: getFrame() });将流发送到服务器的部分遇到问题。当我尝试像这样frame = data获取catch_frame(data)中的流时,我没有收到任何帧。此外,我必须在处理后将帧从服务器发送回客户端。但由于没有框架,我在socket.on('response_back', function(frame)中没有得到任何框架,我可以从那里将其源到<video>标签。 -
那么
data的值是多少? -
它给了我一个价值
{image: true, buffer: "data:,"}的对象。没有框架 -
您是否在客户端打印了
data以确认它实际上包含图像数据?最明显的解释是您的客户端正在发送"data:,",我猜这是一个空帧的数据URL。
标签: javascript python flask webrtc flask-socketio