我正在尝试使用websockets和nodejs实时流式传输
到目前为止,我已经完成了以下工作:
我将canvas转换为
我可以通过以下方式获取blob URL:
我通过WebSockets从服务器获取blob URL,以便将其绘制到另一个画布上,以供其他用户查看。
我搜索了如何从blob URL绘制到画布上,但找不到接近我尝试做的事情。
所以我的问题是:
1.这是我尝试实现的正确方法吗?任何优缺点都会很感激。
2.是否有其他更有效的方法来完成这项工作,或者我正在走正确的道路?
提前感谢您的回答。
编辑:
我应该提到在这个项目中我不能使用WebRTC,我必须用我所拥有的一切来完成它。
为了让大家更容易理解我目前的进展,这是我如何使用WebSockets在画布中显示上述blob URL的方式:
问题在于当我在FireFox中运行该代码时,画布始终为空/空白,但我在控制台中看到了blob URL,这让我觉得我所做的事情是错误的。
而在Google Chrome中,我遇到了“不允许加载本地资源:blob:”错误。
第二次编辑:
目前我所处的位置是这样的。
第一个选项:
我尝试通过WebSockets发送整个blob(s)并成功地完成了这一点。然而,由于某种奇怪的原因,我无法在客户端上读取它!
当我查看我的nodejs服务器的控制台时,我可以看到每个我发送到服务器的blob都会出现类似于以下的内容:
html5 canvas
的内容。这个html5 canvas
的内容只是一个视频。到目前为止,我已经完成了以下工作:
我将canvas转换为
blob
,然后获取blob URL
并使用websockets将该URL发送到我的nodejs服务器。我可以通过以下方式获取blob URL:
canvas.toBlob(function(blob) {
url = window.URL.createObjectURL(blob);
});
blob URL是每个视频帧(确切地说,每秒20帧)生成的URL,看起来像这样:
blob:null/e3e8888e-98da-41aa-a3c0-8fe3f44frt53
我通过WebSockets从服务器获取blob URL,以便将其绘制到另一个画布上,以供其他用户查看。
我搜索了如何从blob URL绘制到画布上,但找不到接近我尝试做的事情。
所以我的问题是:
1.这是我尝试实现的正确方法吗?任何优缺点都会很感激。
2.是否有其他更有效的方法来完成这项工作,或者我正在走正确的道路?
提前感谢您的回答。
编辑:
我应该提到在这个项目中我不能使用WebRTC,我必须用我所拥有的一切来完成它。
为了让大家更容易理解我目前的进展,这是我如何使用WebSockets在画布中显示上述blob URL的方式:
websocket.onopen = function(event) {
websocket.onmessage = function(evt) {
var val = evt.data;
console.log("new data "+val);
var canvas2 = document.querySelector('.canvMotion2');
var ctx2 = canvas2.getContext('2d');
var img = new Image();
img.onload = function(){
ctx2.drawImage(img, 0, 0)
}
img.src = val;
};
// Listen for socket closes
websocket.onclose = function(event) {
};
websocket.onerror = function(evt) {
};
};
问题在于当我在FireFox中运行该代码时,画布始终为空/空白,但我在控制台中看到了blob URL,这让我觉得我所做的事情是错误的。
而在Google Chrome中,我遇到了“不允许加载本地资源:blob:”错误。
第二次编辑:
目前我所处的位置是这样的。
第一个选项:
我尝试通过WebSockets发送整个blob(s)并成功地完成了这一点。然而,由于某种奇怪的原因,我无法在客户端上读取它!
当我查看我的nodejs服务器的控制台时,我可以看到每个我发送到服务器的blob都会出现类似于以下的内容:
<buffer fd67676 hdsjuhsd8 sjhjs....
第二个选项:
所以上面的选项失败了,我想到了另一种方法,即将每个画布帧转换为base64(jpeg),并通过websocket将其发送到服务器上,然后在客户端上显示/绘制这些base64图像到画布上。
我每秒向服务器发送24个帧。
这个方法行得通。但是,在客户端显示这些base64图像的画布非常慢,就像每秒只绘制1个画面。这是我现在遇到的问题。
第三个选项:
我还尝试过在没有画布的情况下使用视频。因此,我使用WebRTC将视频流
作为单个Blob获取。但我不确定如何使用它并将其发送到客户端,以便人们可以看到它。
重要提示:我正在开发的系统不是点对点连接,只是我试图实现的单向流式传输。