【发布时间】:2021-06-22 06:09:57
【问题描述】:
我的实际项目是使用webrtc开发一个视频通话应用程序并为NDI SDK传输视频音频帧,NDI输入应该以帧为单位。为此,现在我使用画布完成了此操作,但延迟很高。是否可以直接从摄像头直接获取帧,或者有其他方法将流转为帧?
这是我现在获取帧的示例代码(var frame = this.ctx1.getImageData(0, 0, this.width, this.height);)
var processor = {
timerCallback: function() {
if (this.video.paused || this.video.ended) {
return;
}
this.computeFrame();
var self = this;
setTimeout(function () {
self.timerCallback();
}, 16); // roughly 60 frames per second
},
doLoad: function() {
this.video = document.getElementById("my-video");
this.c1 = document.getElementById("my-canvas");
this.ctx1 = this.c1.getContext("2d");
var self = this;
this.video.addEventListener("play", function() {
self.width = self.video.width;
self.height = self.video.height;
self.timerCallback();
}, false);
},
computeFrame: function() {
this.ctx1.drawImage(this.video, 0, 0, this.width, this.height);
var frame = this.ctx1.getImageData(0, 0, this.width, this.height);
var l = frame.data.length / 4;
for (var i = 0; i < l; i++) {
var grey = (frame.data[i * 4 + 0] + frame.data[i * 4 + 1] + frame.data[i * 4 + 2]) / 3;
frame.data[i * 4 + 0] = grey;
frame.data[i * 4 + 1] = grey;
frame.data[i * 4 + 2] = grey;
}
this.ctx1.putImageData(frame, 0, 0);
return;
}
};
【问题讨论】:
-
此视频是否来自本地摄像头?或者,远端?您如何与 NDI SDK 通信?在任何情况下,请考虑使用
requestAnimationFrame()而不是您的计时器。如果您正在制作自己的浏览器包装器,您可能会挂钩正在绘制视频的任何内容,并将该数据直接发送到 NDI SDK。几年前我已经看到过类似的代码,但现在找不到了。我认为标牌或记分牌公司已经开源了他们的 Chromium 构建...... -
本地相机本身。从本地摄像头到必须获取帧,取决于这个过程,我必须决定如何将帧传输到 NDI,无论是作为远程用户还是套接字本身。谢谢@Brad,我现在正在检查标牌和记分牌。
-
你需要什么格式? Possible duplicate?
-
@arunna 这就是我的想法:github.com/daktronics/cef-mixer 不是你要找的东西,但是如果你想转储整个东西,可以调查一下。但实际上,为什么不直接将相机连接到 NDI 呢?如果你需要一些特别的东西,也许可以通过 GStreamer 或其他东西。
-
所以 WebCodecs 可能确实是一个解决方案,但我自己不知道 NDI,我认为你应该先考虑 Brad 的建议。
标签: javascript webrtc