【发布时间】:2016-07-07 10:46:33
【问题描述】:
我使用navigator.webkitGetUserMedia 每秒捕获一次窗口的屏幕截图,方法是将返回的stream 分配给<video> 并将其复制到<canvas> 并将缓冲区保存到文件中。
我的应用程序中的 CPU 使用率一直很高,我已将其精确定位到该区域。
代码
// Initialize the video, canvas, and ctx
var localStream,
_video = document.querySelector('#video'),
_canvas = document.querySelector('#canvas'),
_ctx = _canvas.getContext('2d'),
sourceName = 'my-window-id';
// Load the stream from navigator.webkitGetUserMedia
navigator.webkitGetUserMedia({
audio: false,
video: {
mandatory: {
chromeMediaSource: 'desktop',
chromeMediaSourceId: sourceName,
minWidth: 1920,
maxWidth: 1920,
minHeight: 1080,
maxHeight: 1080
}
}
}, gotStream, getUserMediaError);
function gotStream(stream) {
// Use the stream in our <video>
_video.src = window.URL.createObjectURL(stream);
// Reference the stream locally
localStream = stream;
}
function captureState() {
var buffer,
dataURL;
// Draw <video> to <canvas> and convert to buffer (image data)
_ctx.drawImage(_video, 0, 0);
dataURL = _canvas.toDataURL('image/png');
buffer = new Buffer(dataURL.split(",")[1], 'base64');
// Create an image from the data
fs.writeFileSync('screenshot.png', buffer);
}
// Capture state every second
setInterval(function() {
captureState();
}, 1000);
这段代码我没有运行,它是我代码中的简化版本,使其在 StackOverflow 上可读。
我尝试过的事情
-
_video.pause()和_video.play()需要时。似乎没有改变 CPU 使用率。 -
_video.stop()。这意味着我必须再次获取流,这会导致 CPU 使用率飙升,而不是保持打开状态。
我现在最好的方法是通过添加以下内容来更改帧速率:
optional: [
{ minFrameRate: 1 },
{ frameRate: 1 }
]
帧速率极低就可以了。但是,我无法确定 frameRate 设置在这种情况下是否有效。 The docs 没有列出,我也没有更新的 mediaDevices.getUserMedia 可用。
是否可以为navigator.webkitGetUserMedia 设置极低的帧速率(或任何帧速率)?
有没有人能够以任何其他方式减少流的 CPU 使用率?
实现相同目标的任何替代方法(间隔状态捕获)也会有所帮助。
谢谢!
旁注
这是在 Windows 上的 Electron 应用程序中使用 DesktopCapturer 获取 chromeMediaSourceId。
CPU 使用率更新
- 运行
stream的成本:6% CPU 使用率 - 每 1000 毫秒调用一次
captureState:5% 的 CPU 使用率
总电流:11%
目前正在根据 Csaba Toth 的建议减少 #2。我应该能够通过更改画布的捕获方式来减少captureState。完成后会更新。
对于 #1,如果我无法避免捕获视频流,我将不得不尝试通过优化 #2 将总 CPU 使用率限制在 6% 以上。
【问题讨论】:
-
你有什么类型的CPU?恕我直言,6% + 5% 不一定太糟糕。如果它是 6-8 个核心,那将完全消耗一个核心。不要期望完全消除#2。也许看看是否可以在没有视频流的情况下截图是个好主意。
-
i5-6500。不,这并不可怕,它现在似乎运行良好。我之前出于另一个原因使用了多个流,但找到了一种解决方法,现在只需要一个流。如果我能让它保持在 10% 以下,我会很高兴,我认为您在下面的建议应该能让我达到目标。
标签: webkit cpu-usage electron getusermedia navigator