我正在通过WebSocket传输视频,通过以原始ImageData格式发送每个帧(按RGBA顺序每像素4字节)的方式。当我在客户端收到每个帧时(作为ArrayBuffer),我想尽可能高效地直接将该图像绘制到画布上,使用putImageData。
这是我的当前解决方案:
这是我的当前解决方案:
// buffer is an ArrayBuffer representing a properly-formatted image
var array = new Uint8ClampedArray(buffer);
var image = new ImageData(array, width, height);
canvas.putImageData(image, 0, 0);
但是它相当慢。我认为原因有:
数组(大约1MB)被复制了三次,一次进入
Uint8ClampedArray
,一次进入ImageData
,最后每秒30帧复制到画布中。每帧使用
new
两次,这可能会对垃圾收集器造成问题。
这些理论是否正确,如果是,我可以采取什么技巧使其尽可能快?我愿意接受特定于浏览器的答案。
videoElement.captureStream()
方法从 videoElement 获取 MediaStream,目前在 FF 中通过mozCaptureStream
进行前缀处理。然后,您应该能够通过 WebRTC、socket.io 或 WebSocket 发送它。最后,您只需要将客户端 videoElement 的srcObject
设置为发送的 MediaStream 即可。我没有服务器端知识,但这里有一个前端演示,将录制的文件转换为视频流:https://jsfiddle.net/usk05sfs/ - Kaiido