javascript - 无法通过 Flask-socketIO 服务器在 HTML 客户端中显示来自 Python 客户端的视频流

标签 javascript python socket.io opencv3.0 flask-socketio

我想在 HTML 页面中显示来 self 的 jetson nano 的视频流,但似乎我无法使其按我希望的方式工作。 我有一个 python 中的flask-socketIO 服务器, 我有我的 python 客户端,它将每个帧发送到该服务器(这是我的网络摄像头所连接的位置),然后服务器将数据广播到由 Flask-socketIO 渲染的 HTML 客户端 在浏览器控制台中,我可以看到数据,但不显示图像。

我还尝试直接从服务器显示数据而不广播到 HTML,但这是同样的问题。 使用openCV,我无法使用imshow来显示图像,但我可以使用imwrite将帧保存到磁盘上。

这是我的 python 客户端的代码, 基本上,它检索帧,将其转换为字节,然后编码为 Base 64 并使用 socketIO 发出

while(stream):
     ret, frame = cap.read()
     _, buff = cv2.imencode('.jpeg', frame)
     jpg_as_text = base64.b64encode(buff)
     socketIO.emit('my image data', {'image': True, 'buff': jpg_as_text})

这里是服务器端。它只是将数据从 python 客户端广播到 HTML 客户端:

@socketio.on('my image data')
def broadcast_img(data):
    emit('imageStream', data, broadcast=True)

这是由服务器呈现的 HTML 客户端:

var ctx = document.getElementById("myStream").getContext('2d');
var socket = io();
socket.on('imageStream', function(data) {
    console.log(data)
    if(data.image) {
      var img = new Image();
      img.src = 'data:image/jpeg;base64,' + data.buff;
      ctx.drawImage(img, 0, 0);
    }
});

当我打开浏览器并检查控制台时,我可以看到 buff 的值。它以/9j/4AAQ 开头......我认为这是编码图像

有人知道为什么我无法显示图像吗?

提前致谢

最佳答案

data.buff 是一个 ArrayBuffer,您必须将其解码为字符串:

const decoder = new TextDecoder();
img.src = 'data:image/jpeg;base64,' + decoder.decode(data.buff);

此外,您不必对图像数据进行 Base64 解码。您可以只发出二进制数据

_, buff = cv2.imencode('.jpeg', frame)
socketIO.emit('my image data', {'image': True, 'buff': BytesIO(buff).getvalue()})

并在客户端上使用它,如下所示:

const arrayBufferView = new Uint8Array(data.buff);
const blob = new Blob([arrayBufferView], {type: 'image/jpeg'});
img.src = URL.createObjectURL(blob);

关于javascript - 无法通过 Flask-socketIO 服务器在 HTML 客户端中显示来自 Python 客户端的视频流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57425864/

相关文章:

javascript - setState 对象列表中的多个值

python - 如何将 parquet 文件上传到 Azure ADLS 2 Blob

python - 是否可以在 Flask 和 Python 3 中使用 websockets?

node.js - Socket.io授权发送了错误的cookie?

javascript - 使用 Node.js 解析 CodeIgniter cookie

javascript - 如果窗口窄于,则隐藏 DIV 并替换为 DIV

javascript - 将变量从 thymeleaf 传递给 javascript 函数?

javascript - JavaScript 的合理大小是多少?

python - numpy reshape()和transpose()之间有交互规则吗?

python - 导入命名空间