webrtc实现简单的移动摄像头调用
navigator.mediaDevices.getUserMedia()函数打开摄像头并输出流
videoEle.srcObject将流媒体数据输出到video中

代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>webRTC摄像头调用</title> <script src="https://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script> <style> #video { width: 100%; max-height: 500px; background-color: black; transform: rotateY(180deg); /*镜像翻转 解决前置摄像头镜像问题*/ } #errorMsg { background-color: chocolate; margin-bottom: 4px; } #tipMsg { background-color: cyan; margin-bottom: 4px; } </style> </head> <body> <div id="container"> 画面:<br> <video id="video" autoplay playsinline></video><br> <p> <button id="showVideo">打开前置摄像头</button> </p> <p> <button id="stopVideo">关闭摄像头</button> </p> <p>点击打开摄像头按钮后,浏览器会询问是否允许,请点击“允许”。</p> <div id="tipMsg"></div> <div id="errorMsg"></div> </div> <script> const constraints = window.constraints = { audio: false, video: { // facingMode: 'environment', //后置摄像头 facingMode: 'user', //前置摄像头 }, }; function showErrMsg(msg, error) { const errorElement = document.querySelector('#errorMsg'); errorElement.innerHTML += `<div>-> ${msg}</div>`; if (typeof error !== 'undefined') { console.error(error); } } function showMsg(msg) { const msgEle = document.querySelector('#tipMsg'); msgEle.innerHTML += `<div>-> ${msg}</div>`; console.log(msg); } //打开摄像头 async function openCamera(e) { try { showMsg('正在打开摄像头'); const stream = await navigator.mediaDevices.getUserMedia(constraints); showMsg('获取到了stream'); gotStream(stream); e.target.disabled = true; } catch (err) { showErrMsg('没有摄像头设备') } } //将视频流输出到video function gotStream(stream) { const videoEle = document.querySelector('#video'); const videoTracks = stream.getVideoTracks(); showMsg(`正在使用的设备: ${videoTracks[0].label}`); window.stream = stream; videoEle.srcObject = stream; } //停止视频流 function stopVideo(e) { showMsg("停止视频"); const videoElem = document.querySelector('#video'); const stream = videoElem.srcObject; document.querySelector('#showVideo').disabled = false; // 允许开启 if (stream == null) { return; } const tracks = stream.getTracks(); tracks.forEach(function (track) { track.stop(); }); videoElem.srcObject = null; } //点击打开前置摄像头 $('#showVideo').click((e) => { openCamera(e) }) //点击关闭摄像头 $('#stopVideo').click(e => { stopVideo(e) }) </script> </body> </html>
博客园作者:herry菌朋友,看到这里,关注作者的公众号吧,不漏掉更新哦
![]()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
2016-11-29 css随笔记(持续更新)