访问网页中的网络摄像头

2023-11-24

我正在开发一个网络应用程序。

在我的访客注册页面中,我需要访问网络摄像头用于给客人拍照。

我拍摄的图像可以存储在指定位置。

这将是执行此操作的最佳方式。

欢迎使用 java、JSP、html、java 脚本或任何其他方法。


回答自己的问题,因为有更好的方法可以使用 HTML5。

选项 1,从系统访问默认摄像头

HTML

Video Tag
<br/>
<div class="camera">
    <video id="video">Video stream not available.</video>
    <button id="startbutton">Take photo</button>
</div>
<br/>
Canvas
<br/>
<canvas id="canvas"></canvas>

Script

var width = 320;
var height = 0;
var streaming = false;

navigator.mediaDevices.getUserMedia({video: true, audio: false})
        .then(function (stream) {
            video.srcObject = stream;
            video.play();
        })
        .catch(function (err) {
            console.log("An error occured! " + err);
        });

video.addEventListener('canplay', function (ev) {
    if (!streaming) {
        height = video.videoHeight / (video.videoWidth / width);
        video.setAttribute('width', width);
        video.setAttribute('height', height);
        canvas.setAttribute('width', width);
        canvas.setAttribute('height', height);

        streaming = true;
    }
}, false);

startbutton.addEventListener('click', function (ev) {
    takepicture();
    ev.preventDefault();
}, false);

clearphoto();

function clearphoto() {
    var context = canvas.getContext('2d');
    context.fillStyle = "#AAA";
    context.fillRect(0, 0, canvas.width, canvas.height);
}

function takepicture() {
    var context = canvas.getContext('2d');
    if (width && height) {
        canvas.width = width;
        canvas.height = height;
        context.drawImage(video, 0, 0, width, height);

        var dataURL = canvas.toDataURL("image/jpeg", 0.95);
        if (dataURL && dataURL != "data:,") {
            var fileName = generateImageName();
            uploadimage(dataURL, fileName);
        } else {
            alert("Image not available");
        }
    } else {
        clearphoto();
    }
}

function generateImageName() {
    ... generate image name logic here ...
    return imageName;
}

function uploadimage(dataurl, filename) {
    ... upload logic here ...
}

截屏

Screen shot

选项 2,提供系统中可用摄像机的列表,并让用户选择摄像机。

HTML

<select id="videoSelect"></select>
    <button id="startCameraButton">Start Camera</button>
    <br/>
    Video Tag
    <br/>
    <div class="camera">
        <video id="video">Video stream not available.</video>
        <button id="takePictureButton">Take photo</button>
    </div>
    <br/>
    Canvas
    <br/>
    <canvas id="canvas">
    </canvas>

Script

var width = 320;
var height = 0;
var streaming = false;
var localstream = null;

startCameraButton.onclick = start;
takePictureButton.onclick = takepicture;

navigator.mediaDevices.enumerateDevices()
        .then(gotDevices)
        .catch(function (err) {
            console.log("An error occured while getting device list! " + err);
        });

function gotDevices(deviceInfos) {
    while (videoSelect.firstChild) {
        videoSelect.removeChild(videoSelect.firstChild);
    }

    for (var i = 0; i !== deviceInfos.length; ++i) {
        var deviceInfo = deviceInfos[i];
        var option = document.createElement('option');
        option.value = deviceInfo.deviceId;
        if (deviceInfo.kind === 'videoinput') {
            option.text = deviceInfo.label || 'Camera ' + (videoSelect.length + 1);
            videoSelect.appendChild(option);
        }
    }
}

function start() {
    stopVideo();
    clearphoto();
    var videoSource = videoSelect.value;
    var constraints = {
        audio: false,
        video: {deviceId: videoSource ? {exact: videoSource} : undefined}
    };
    navigator.mediaDevices.getUserMedia(constraints).
            then(gotStream).then(gotDevices).catch(handleError);
}



function gotStream(stream) {
    localstream = stream;
    video.srcObject = stream;
    video.play();
    // Refresh button list in case labels have become available
    return navigator.mediaDevices.enumerateDevices();
}

function handleError(error) {
    console.log('navigator.getUserMedia error: ', error);
}

video.addEventListener('canplay', function (ev) {
    if (!streaming) {
        height = video.videoHeight / (video.videoWidth / width);
        video.setAttribute('width', width);
        video.setAttribute('height', height);
        canvas.setAttribute('width', width);
        canvas.setAttribute('height', height);

        streaming = true;
    }
}, false);

clearphoto();

function clearphoto() {
    var context = canvas.getContext('2d');
    context.fillStyle = "#AAA";
    context.fillRect(0, 0, canvas.width, canvas.height);
}

function takepicture() {
    var context = canvas.getContext('2d');
    if (width && height) {
        canvas.width = width;
        canvas.height = height;
        context.drawImage(video, 0, 0, width, height);

        var dataURL = canvas.toDataURL("image/jpeg", 0.95);
        if (dataURL && dataURL != "data:,") {
            var fileName = generateImageName();
            fileName = fileName + ".txt"
            uploadimage(dataURL, fileName);
        } else {
            console.log("Image not available");
        }
    } else {
        clearphoto();
    }
}

    function generateImageName() {
    ... generate image name logic here ...
    return imageName;
}

function uploadimage(dataurl, filename) {
    ... upload logic here ...
}

function stopVideo() {
    if (localstream) {
        localstream.getTracks().forEach(function (track) {
            track.stop();
            localstream = null;
        });
    }
}

截屏

enter image description here

选项3,让用户选择音视频源和音频输出

在选项 2 中,用户可以选择任何特定的摄像机。最重要的是,如果用户还想选择音频源和音频输出源,请修改上面的代码并进行以下更改。

HTML

            audioInputSelect
            <br/>
            <select id="audioInputSelect"></select>
            <br/>
            audioOutputSelect
            <select id="audioOutputSelect"></select>

Script

function gotDevices(deviceInfos) {
    while (videoSelect.firstChild) {
        videoSelect.removeChild(videoSelect.firstChild);
    }

    for (var i = 0; i !== deviceInfos.length; ++i) {
        var deviceInfo = deviceInfos[i];
        var option = document.createElement('option');
        option.value = deviceInfo.deviceId;
        if (deviceInfo.kind === 'audioinput') {
            option.text = deviceInfo.label || 'Microphone ' + (audioInputSelect.length + 1);
            audioInputSelect.appendChild(option);
        } else if (deviceInfo.kind === 'audiooutput') {
            option.text = deviceInfo.label || 'Speaker ' + (audioOutputSelect.length + 1);
            audioOutputSelect.appendChild(option);
        } else if (deviceInfo.kind === 'videoinput') {
            option.text = deviceInfo.label || 'Camera ' + (videoSelect.length + 1);
            videoSelect.appendChild(option);
        }
    }
}

function start() {
    stopVideo();
    clearphoto();
    var audioSource = audioInputSelect.value;
    var videoSource = videoSelect.value;
    var constraints = {
      audio: {deviceId: audioSource ? {exact: audioSource} : undefined},
        video: {deviceId: videoSource ? {exact: videoSource} : undefined}
    };
    navigator.mediaDevices.getUserMedia(constraints).
            then(gotStream).then(gotDevices).catch(handleError);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问网页中的网络摄像头 的相关文章

  • 使用 CSS 显示 div 内容后淡出

    我正在尝试在单击按钮时显示通知 单击按钮实际上会检查电子邮件验证 我知道要显示一个包含错误消息内容的 div 但是 我想淡出错误消息 比如说 5 秒后 我想用CSS来实现它 以下是我的尝试 它只是隐藏了一切 signup response
  • 带有边框半径的CSS中的完美圆不起作用

    圆往往是椭圆形的 我想要的是完美的圆 border radius 100 不起作用我想知道为什么 http jsfiddle net 8gD2m 1 http jsfiddle net 8gD2m 1 badge display inlin
  • -webkit-overflow-scrolling:触摸;无效的属性值

    我不明白为什么这不起作用 我把它放在我的 html 和正文中 它仍然显示无效的属性值并被划掉 我首先尝试在媒体查询中使用它 但它在那里不起作用 有谁知道它对我不起作用的潜在原因 谢谢你 html body width 100 height
  • 父元素的 mousedown 事件中的 offsetX 和 offsetY 错误

    我在 mousedown 上获取 offsetX 时遇到问题 下面是我的代码 div Click the text The mouseDown function is triggered when the mouse button is p
  • JavaFX 8 - 如何在并行相机上设置NearClip和FarClip?

    我所在的团队正在构建一个使用 JavaFX 8 3D 操作视觉模型的应用程序 我们同时使用透视相机和平行相机 透视相机按预期工作 目前正在与isEyeAtCameraZero错误的 这样做是为了最大限度地兼容并行相机 透视相机在以下情况下表
  • 当通过 Jquery 将当前页面的 html 传递到托管 bean 时,primefaces RemoteCommand 标记不起作用

    我正在使用 Jquery 的 html 方法获取当前页面的 HTML 如下所示
  • 是否可以?相机 API ios [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想在应用程序中实现一项功能 当用户
  • 获取要在新浏览器中显示的选择值

    嘿 基本上这是我的代码 运行的第一个脚本允许在 URL 中显示所选值
  • 可编辑的 Div 插入位置

    我有一个可编辑的 div 我正在使用一个按钮将图像插入到该 div 中 现在 我只是在做 document getElementById elementid innerHTML 为了将图像添加到 div 的末尾 我想输入插入符号所在的图像
  • Bootstrap 4 行布局没有响应

    我正在使用 Bootstrap 4 在 MEAN 堆栈上为新闻文章布局创建一个 html 模板 但这应该不重要 对于这种总体布局的要求是 一篇 特色 文章位于其自己的列中 而其他 8 篇文章位于另一列中的两行中 当在较小的屏幕或移动设备上查
  • 如何使用 Angular 2 实现拖放(v2.0.0-beta.15)

    我想以角度实现一个简单的拖放列表 例如我可以更改其顺序的杂货列表 iv 在使用之前实现它https github com akserg ng2 dnd https github com akserg ng2 dnd但我的问题是我使用角度2
  • 我可以在一个变量中拥有多个值吗?

    正如标题 我可以在一个变量中拥有多个值吗 首先 我有这个表格
  • 将 html 源拆分为多个文件

    HTML 是否支持将源代码拆分为多个文件 我正在寻找 C 的等价物 include 或者也许是类似 C 的东西partial 可以采用源路径并在该位置注入文件内容的元素 如果之前有人问过这个问题 我们深表歉意 Google 和 SO 搜索没
  • 使用 jQuery 在元素末尾添加“更多”html?

    我一开始有一个空的 div div div 我知道如何使用 jQuery 第一次将 html 添加到我的空 div 中 mydiv html my html 但我的问题是我不知道如何在非空 div 末尾推送更多 html div my ht
  • 如何解决flash的zindex问题

    在网页中我需要显示div覆盖未使用的 Flash 横幅wmode transparent环境 怎么解决呢 根据我的记忆 你可以将 div 推入 也许使用Javascript 这样你就不会弄乱你的HTML iframe 是像 flash 一样
  • 如何使单词中的每个字母在悬停时发生变化

    假设我的网站上某个段落中有一个单词 IamGreat 我希望它在悬停时更改为 Good4you 但是 我不想更改整个单词 而是希望每个字母单独更改 因此 如果我将鼠标悬停在字母 I 上 它将变成字母 G 字母 r 将变成数字 4 等 这两个
  • Django 未在 404 页面上应用应用程序中的 CSS 文件

    姜戈3 0 8 Python 3 7 x 我有一个包含一些应用程序的 Django 项目 我正在尝试为 400 403 404 500 错误制作一些 默认 错误页面 我已经这样做了 并显示了适当的模板 但没有任何样式或 JS 在 404 错
  • 如何使链接悬停时的背景图像模糊?

    当您用鼠标光标悬停链接时 我想让我的背景图像模糊 5 像素 有什么简单的方法可以实现这一点吗 我有点纠结于类和 id 在这里 pic background url http www metalinjection net wp content
  • 适用于 HTML5 混合应用程序的 CORS

    我读过很多关于 CORS 的文章 以及允许 Access Control Allow Origin 如何成为 Web 服务器的安全漏洞 但没有一篇文章解释了如何允许 HTML5 混合应用程序访问某些不允许使用通配符 的域上托管的 Web 服
  • 透明、无边框文本输入

    如何删除周围的边框

随机推荐

  • Ninject 使用 WCF Web API Preview 5

    有人能为我指出正确的方向 让 Ninject 与 WCF Web API Preview 5 一起使用吗 我已在我的 ASP NET MVC 3 项目以及使用 Ninject Extensions Wcf 库的另一个内部 WCF 服务中成功
  • 如何在 IE 中使用 javascript 从客户端获取文件大小?

    我使用了以下方法 HTML
  • Android,Glide 显示错误图像约一秒

    我正在使用 Glide 库从 URL 加载图像 这是我从 Graph Request Facebook 获得的 它用在 RecyclerAdapter 中 当我滚动时 每个 ImageView 显示错误的图片大约不到一秒 然后纠正一张 这是
  • 如何设置 DT_RPATH 或 DT_RUNPATH?

    在 Linux 上 ld so 8 手册页讨论了动态库的搜索顺序 它说DT RPATH已被弃用 并且还提到DT RUNPATH 没有提到 rpath链接器选项 The ld 1 手册页提到了 rpath and rpath link选项 但
  • 如何用 pandas DataFrame 中的前一个或下一个值替换 NaN?

    假设我有一个 DataFrame 其中包含一些NaNs gt gt gt import pandas as pd gt gt gt df pd DataFrame 1 2 3 4 None None None None 9 gt gt gt
  • 如何将 HTML 和文本复制到剪贴板?

    我试图同时放入 HTML 和纯文本的剪贴板片段 以便支持 HTML 的编辑器可以粘贴 HTML 而其他编辑器可以使用纯文本 Clipboard SetData DataFormats Html htmlWithHeader Clipboar
  • 在其父级边界之外显示用户控件内的控件

    我有一个带有文本框和列表框的用户控件 它使用它们为用户提供自动完成功能 但是 我希望将列表框绘制在用户控件边界之外 以便在必须将列表框绘制在用户控件边缘附近时不会被截断 关于如何做到这一点有什么建议吗 本质上 我想要一个列表框浮动在其容器控
  • Dart 中双数的正则表达式

    从我之前的问题来看 我试图只允许双精度格式的数字进入文本字段 我浏览了整个网络 没有找到 dart 的正则表达式 TextFormField inputFormatters WhitelistingTextInputFormatter Re
  • Android GridView像listview一样添加页眉和页脚

    也许你想打电话addHeaderView or addFooterView in GridView 它没有 我们自然希望将页眉视图或页脚视图添加到GridView 也许你和我一样苦苦寻找了很久 却最终没有找到解决办法 这里我给出一个解决方案
  • BCP 错误“无法打开 BCP 主机数据文件”

    我刚刚在我的 sqlserver 名称导出表中创建了一个新表 现在我尝试使用 cmd bcp 推出 但出现以下错误 SQLState S1000 NativeError 0 错误 Microsoft ODBC 驱动程序 13 对于 SQL
  • 蓝牙 LE 的 txPower 到底是什么以及如何使用它?

    我正在尝试了解 txPower 到底是什么以及如何使用它 因为我计划开发使用 Beacons 的 Android 应用程序 我在网上看到了2个定义 1 信标的发射功率 2 距信标1米处的接收功率 这两个定义有何关系 此外 当使用 Quick
  • 如何找到信号周期(自相关与快速傅里叶变换与功率谱密度)?

    假设有人想要找到给定正弦波信号的周期 从我在网上读到的内容来看 两种主要方法似乎采用傅里叶分析或自相关 我正在尝试使用 python 自动化该过程 我的用例是将这个概念应用于来自绕恒星运行的模拟物体的位置 或速度或加速度 时间序列的类似信号
  • 创建一副纸牌的最佳方法是什么?

    我正在考虑为纸牌游戏制作一副纸牌 我可以列出所有卡片 我并不真正关心花色 但我想知道是否有更简单的方法来做到这一点 cards 1 1 1 1 我确信你可以做一个for循环创建 4 张相同值的卡片并将其添加到列表中 但我想知道这是否是最佳解
  • ggplot2:如何在回归线上绘制小高斯密度曲线?

    我想以图形方式显示线性 以及后来的其他类型 回归的假设 如何在回归线上添加小高斯密度 或任何类型的密度 如下图所示 您可以计算沿拟合线的截面残差的经验密度 然后 只需使用以下方法在每个间隔中您选择的位置绘制线条即可geom path 要添加
  • 修改TFS流程模板以实现Nuget Package Restore

    我已从 MSBuild 包恢复迁移到自动包恢复 它会在构建开始之前恢复包 http docs nuget org docs workflows migration to automatic package restore 根据这篇文章htt
  • 防止 Fluent NHibernate select n+1

    我有一个相当深的对象图 5 6 个节点 当我遍历它的一部分时 NHProf 告诉我我遇到了 选择 N 1 问题 我确实这样做了 我知道的两个解决方案是 渴望负载的孩子 分解我的对象图 和急切加载 我真的不想做其中任何一个 尽管我可能会在以后
  • 具有两列组合的 SQLite 唯一键

    我试图确保当我运行以下查询时仅运行第一个INSERT INTO会起作用的 我知道我必须做slot UNIQUE 槽可以是 0 5 INTEGER 但这并不意味着该表只能接受 6 个表数据行 对于每个匹配的playerHash 它应该只允许6
  • 如何轻松找到Android类的源代码

    我知道我可以从以下位置访问 android 源代码https android googlesource com 但是如果我只知道包和 android 类的名称 就很难选择正确的 git 存储库 有没有办法找到文件https android
  • 如何使用 yuicompressor-maven-plugin 让 Maven 用缩小的文件构建战争

    所以我正在尝试一些我认为相当简单的事情 我基本上希望 maven 在构建战争之前为我缩小所有 js 和 css 文件 我的插件看起来像这样
  • 访问网页中的网络摄像头

    我正在开发一个网络应用程序 在我的访客注册页面中 我需要访问网络摄像头用于给客人拍照 我拍摄的图像可以存储在指定位置 这将是执行此操作的最佳方式 欢迎使用 java JSP html java 脚本或任何其他方法 回答自己的问题 因为有更好