js 大佬进,如何使用视频流来重写 navigator.mediaDevices.getUserMedia

2023-06-13 18:27:38 +08:00
 NouveauNom
想实现的功能,写一个扩展,将 navigator.mediaDevices.getUserMedia 获取摄像头,改为视频流输入,网上找到代码
await page.evaluate(() => {
const video = document.createElement("video");

video.setAttribute('id', 'video-mock');
video.setAttribute("src", 'https://woolyss.com/f/spring-vp9-vorbis.webm');
video.setAttribute("crossorigin", "anonymous");
video.setAttribute("controls", "");

video.oncanplay = () => {
const stream = video.captureStream();

navigator.mediaDevices.getUserMedia = () => Promise.resolve(stream);
};

document.querySelector("body").appendChild(video);
});

但是没有成功
400 次点击
所在节点    问与答
3 条回复
jifengg
2023-06-14 08:58:27 +08:00
不清楚具体原理,不过,你的 navigator.mediaDevices.getUserMedia 覆写 是在 video canplay 之后,是否这期间其他 js 代码已经调用 navigator.mediaDevices.getUserMedia 了呢?
NouveauNom
2023-06-14 10:25:24 +08:00
@jifengg 把代码改为
<!DOCTYPE html>
<html>
<head>
<title>摄像头实时预览</title>
<style>
#video-preview {
width: 100%;
height: auto;
}
</style>
</head>
<body>
<video id="video-preview" autoplay></video>

<video id="video-preview2" autoplay></video>


<div id="container"></div>
<button onclick="click2()"> click2</button>
<script>
// 获取视频流
let video;
async function playVideo(url) {

video = document.createElement("video");
video.setAttribute('id', 'video-mock');
video.setAttribute("src", url);
// video.setAttribute("crossorigin", "anonymous");
// video.setAttribute("controls", "");

video.oncanplay = async () => {

};

video.onplay = async () => {
const stream = video.captureStream();
navigator.mediaDevices.getUserMedia = () => Promise.resolve(stream);



};

videoCreated = true;
}



// 在页面中创建一个按钮,并绑定点击事件
const playButton = document.createElement('button');
playButton.textContent = '点击播放视频';
playButton.addEventListener('click', startVideoPlayback);

// 将按钮添加到页面中的某个元素上
const container = document.getElementById('container');
container.appendChild(playButton);
playVideo("test.mp4");
// 用户点击按钮后调用此函数
function startVideoPlayback() {
video.play();

}

function click2()
{
// 获取视频流
navigator.mediaDevices.getUserMedia({ video: true })
.then(function(stream2) {
var videoElement = document.getElementById('video-preview2');
videoElement.srcObject = stream2;
})
.catch(function(error) {
console.error('访问摄像头失败:', error);
});
}
</script>
</body>
</html>


似乎 Chrome ,只是似乎可用,safari 直接报错了
NouveauNom
2023-06-14 16:40:35 +08:00
已经实现此功能,此贴结束。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/948438

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX