- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图用 MediaRecorder API 制作一个基本的媒体记录器这是相当直接的:从 getDisplayMedia 获取流,然后记录它。
问题:这仅记录最大屏幕尺寸,但没有更多。所以如果我的屏幕是 1280/720,它不会记录 1920/1080。
这可能看起来很明显,但我的意图是它应该在较大的分辨率内记录较小的分辨率。例如:
红色矩形代表我的实际屏幕正在录制的内容,周围的黑色矩形只是黑色空间,但整个视频现在具有更高的分辨率,1920/1080,这对 youtube 很有用,因为 youtube 缩小了任何内容在 720 和 1080 分辨率之间,这是一个问题。
无论如何,我尝试简单地将来自 getDisplayMedia 的流添加到视频元素视频 vid.srcObject = stream
,然后制作了一个分辨率为 1920/1080 的新 Canvas ,并在动画循环中做了 ctx.drawImage(vid, offsetX, offsetY)
,并且在制作 MediaRecorder 的循环之外,简单地做了 newStream = myCanvas.captureStream()
根据 documentation of the API ,并将其传递给 MediaRecorder;然而,问题是,由于巨大的 Canvas 开销,一切都非常缓慢,帧率绝对糟糕(没有视频示例,请自行测试)。
那么是否有某种方法可以优化 Canvas 以不影响帧率(尝试查看 OffscreenCanvas 但我找不到从它本身获取流以与 MediaRecorder 一起使用的方法,所以它并没有真正帮助),或者是否有更好的方法来捕获和记录 Canvas ,或者是否有更好的方法在客户端大小的 JavaScript 中以更大的分辨率记录屏幕?如果没有客户端大小的 JavaScript,是否有某种实时视频编码器(ffmpeg 太慢)可以在服务器上运行,并且 Canvas 的每一帧都可以发送到服务器并保存在那里?有没有更好的方法来使用任何类型的 JavaScript 制作视频录像机——客户端或服务器或两者兼而有之?
最佳答案
不知道你的代码是什么样的,但我设法通过这段代码获得了流畅的体验:
(你也可以在这里找到很好的例子:https://mozdevs.github.io/MediaRecorder-examples/)
<!doctype html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="script.js"></script>
</head>
<body>
<canvas id="canvas" style="background: black"></canvas>
</body>
// DISCLAIMER: The structure of this code is largely based on examples
// given here: https://mozdevs.github.io/MediaRecorder-examples/.
window.onload = function () {
navigator.mediaDevices.getDisplayMedia({
video: true
})
.then(function (stream) {
var video = document.createElement('video');
// Use "video.srcObject = stream;" instead of "video.src = URL.createObjectURL(stream);" to avoid
// errors in the examples of https://mozdevs.github.io/MediaRecorder-examples/
// credits to https://stackoverflow.com/a/53821674/5203275
video.srcObject = stream;
video.addEventListener('loadedmetadata', function () {
initCanvas(video);
});
video.play();
});
};
function initCanvas(video) {
var canvas = document.getElementById('canvas');
// Margins around the video inside the canvas.
var xMargin = 100;
var yMargin = 100;
var videoWidth = video.videoWidth;
var videoHeight = video.videoHeight;
canvas.width = videoWidth + 2 * xMargin;
canvas.height = videoHeight + 2 * yMargin;
var context = canvas.getContext('2d');
var draw = function () {
// requestAnimationFrame(draw) will render the canvas as fast as possible
// if you want to limit the framerate a particular value take a look at
// https://stackoverflow.com/questions/19764018/controlling-fps-with-requestanimationframe
requestAnimationFrame(draw);
context.drawImage(video, xMargin, yMargin, videoWidth, videoHeight);
};
requestAnimationFrame(draw);
}
关于javascript getdisplaymedia 以更高分辨率记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61313375/
我试图用 MediaRecorder API 制作一个基本的媒体记录器这是相当直接的:从 getDisplayMedia 获取流,然后记录它。 问题:这仅记录最大屏幕尺寸,但没有更多。所以如果我的屏幕
navigator.mediaDevices.getDisplayMedia({ audio: false, video: true }).then(gotMedia).catch
我的网站具有通过共享屏幕功能截取屏幕截图的功能。在 chrome 和 firefox 上一切正常,但在 safari 上出现错误“必须从用户手势处理程序调用 getDisplayMedia”。是否可以
我正在使用 MediaStream 和 MediaRecorder 录制我的浏览器窗口。 但是需要禁用鼠标光标被记录,所以当我创建我的视频轨道时,我使用以下代码: stream['input'] =
我正在使用 navigator.mediaDevices.getDisplayMedia 在网页上录制我的屏幕。但是当我重新加载页面时,它停止了。我想自动继续录制。可能吗? 也许我可以以某种方式使用本
我正在构建一个在线应用程序,点击一个按钮,我希望能够截取用户在他们的浏览器(我的应用程序)中看到的内容。我已经查看了许多 js 库,例如 html2canvas、CCapture 作为 dom-to-
我有兴趣获得 截图 来自用户,我正在使用 getDisplayMedia 用于捕获用户屏幕的 API: const constraints = { video: true, audio: false
我可以使用getDisplayMedia()吗?在生产中?我有点困惑,因为它说的是 W3C 编辑的草稿。这是什么意思? https://w3c.github.io/mediacapture-scree
我正在尝试在我的网站上实现错误报告程序。我的目标是用户在浏览问题时能够用声音描述问题并记录浏览器选项卡。错误报告将只是一个视频文件,可以通过电子邮件发送给我。 看来提议的navigator.media
我需要将用户显示媒体(屏幕截图)连接到 webRTC 应用程序。 以下代码用于启动屏幕捕获: navigator.mediaDevices.getDisplayMedia({video: true})
我们可以通过 navigator.mediaDevices.getDisplayMedia() 向屏幕或窗口请求媒体流.但是,这会立即提示用户决定使用哪种捕获方式。我需要检查浏览器/平台是否支持屏幕捕
我正在尝试构建一个可以捕获用户桌面的网络应用程序。我发现这个 Web api 应该可以完美地完成这项工作,但我似乎无法让它工作。现在,通过启用标志,最新版本的 Edge 和 Chrome 70 都应该
我想合并 getUserMedia 和 getDisplayMedia 流。我正在使用 MediaRecorder。当我从 getUserMedia 切换到 getDisplayMedia 然后 Me
我目前正在使用 chrome 开发屏幕捕获功能navigator.mediaDevices.getDisplayMedia我只能打开一个用户选择,用户可以从所有给定的显示媒体中进行选择。有没有办法绕过
我正在使用 getDisplayMedia 开发应用程序.当浏览器提示我共享我的屏幕/一个窗口并且我选择一个特定的窗口来共享时,该窗口现在突然聚焦并在我的其他窗口前面(特别是在浏览器窗口前面!)。我在
我可以在不选择要共享的应用程序的情况下关闭 getDisplayMedia({video:true}) 的 native 屏幕选择器吗?据我所知,如果正在共享的轨道停止,它会在 track.stop(
我正在尝试共享用户屏幕并需要使用 getDisplayMedia 但在项目编译期间出现错误 Property 'getDisplayMedia' does not exist on type 'Nav
我正在编写一个脚本来了解我的浏览器是否支持屏幕共享。我的脚本适用于除 Internet Explorer 之外的所有浏览器(Chrome、Opera、Firefox、Edge、Safari),但我不知
在我的 Angular 应用程序中,需要记录屏幕。我使用 navigator.mediaDevices.getDisplayMedia 来捕获屏幕。它在本地工作。但可能会在命令行中看到错误,例如 Pr
我是一名优秀的程序员,十分优秀!