当前位置: 首页 > article >正文

h5 网页测试摄像头

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>H5 摄像头测试</title>
    <script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-100 p-4">
    <div class="max-w-md mx-auto bg-white rounded-lg shadow-md p-4">
        <h1 class="text-xl font-bold mb-4 text-center">摄像头测试</h1>
        
        <div class="space-y-4">
            <!-- 视频预览 -->
            <div class="relative aspect-video bg-black rounded-lg overflow-hidden">
                <video id="video" class="w-full h-full object-cover" autoplay playsinline></video>
            </div>

            <!-- 拍照结果 -->
            <div class="relative aspect-video bg-gray-200 rounded-lg overflow-hidden hidden">
                <canvas id="canvas" class="w-full h-full object-cover"></canvas>
            </div>

            <!-- 控制按钮 -->
            <div class="flex justify-center gap-4">
                <button id="startBtn" class="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition">
                    开启摄像头
                </button>
                <button id="snapBtn" class="px-4 py-2 bg-green-500 text-white rounded hover:bg-green-600 transition" disabled>
                    拍照
                </button>
                <button id="switchBtn" class="px-4 py-2 bg-purple-500 text-white rounded hover:bg-purple-600 transition" disabled>
                    切换摄像头
                </button>
            </div>

            <!-- 状态提示 -->
            <div id="status" class="text-center text-gray-600">
                请点击"开启摄像头"按钮开始测试
            </div>
        </div>
    </div>

    <script>
        const video = document.getElementById('video');
        const canvas = document.getElementById('canvas');
        const startBtn = document.getElementById('startBtn');
        const snapBtn = document.getElementById('snapBtn');
        const switchBtn = document.getElementById('switchBtn');
        const status = document.getElementById('status');

        let stream = null;
        let facingMode = 'user'; // 默认使用前置摄像头

        // 开启摄像头
        async function startCamera() {
            try {
                if (stream) {
                    stream.getTracks().forEach(track => track.stop());
                }

                stream = await navigator.mediaDevices.getUserMedia({
                    video: {
                        facingMode: facingMode
                    }
                });
                video.srcObject = stream;
                
                snapBtn.disabled = false;
                switchBtn.disabled = false;
                status.textContent = '摄像头已开启';
                startBtn.textContent = '关闭摄像头';
            } catch (err) {
                console.error('摄像头访问错误:', err);
                status.textContent = '无法访问摄像头,请确保已授予权限';
            }
        }

        // 关闭摄像头
        function stopCamera() {
            if (stream) {
                stream.getTracks().forEach(track => track.stop());
                stream = null;
                video.srcObject = null;
                snapBtn.disabled = true;
                switchBtn.disabled = true;
                status.textContent = '摄像头已关闭';
                startBtn.textContent = '开启摄像头';
            }
        }

        // 拍照
        function takeSnapshot() {
            const context = canvas.getContext('2d');
            canvas.width = video.videoWidth;
            canvas.height = video.videoHeight;
            context.drawImage(video, 0, 0, canvas.width, canvas.height);
            
            // 显示拍照结果
            canvas.parentElement.classList.remove('hidden');
            status.textContent = '已拍照';
        }

        // 切换摄像头
        function switchCamera() {
            facingMode = facingMode === 'user' ? 'environment' : 'user';
            startCamera();
        }

        // 事件监听
        startBtn.addEventListener('click', () => {
            if (stream) {
                stopCamera();
            } else {
                startCamera();
            }
        });

        snapBtn.addEventListener('click', takeSnapshot);
        switchBtn.addEventListener('click', switchCamera);

        // 检查浏览器是否支持
        if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
            status.textContent = '您的浏览器不支持摄像头API';
            startBtn.disabled = true;
        }
    </script>
</body>
</html>


http://www.kler.cn/a/524963.html

相关文章:

  • 解锁豆瓣高清海报:深度爬虫与requests进阶之路
  • 【单细胞第二节:单细胞示例数据分析-GSE218208】
  • 16、智能驾驶域控的材料回收
  • C++,STL,【目录篇】
  • 8639 折半插入排序
  • 用WinForm如何制作简易计算器
  • MySQL 基础学习(3):排序查询和条件查询
  • C语言编译过程全面解析
  • MySQL知识点总结(十四)
  • 计算机网络 IP 网络层 2 (重置版)
  • 物联网智能项目之——智能家居项目的实现!
  • 网络工程师 (7)进程管理
  • 创建要素图层和表视图
  • 爬虫基础(一)HTTP协议 :请求与响应
  • 剑指 Offer II 007. 数组中和为 0 的三个数
  • 每日一题洛谷P1307 [NOIP2011 普及组] 数字反转c++
  • GitHub Actions定时任务配置完全指南:从Cron语法到实战示例
  • 基于Go语言的三甲医院人机与智能体协同环境系统(上.文章部分)
  • JVM01_概述、跨平台原理、分类、三大商业虚拟机
  • 未来无线技术的发展方向
  • Python 切片(Slicing):列表、元组与字符串的高效操作
  • Python爬虫获取item_fee-获得淘宝商品快递费用接口
  • 通过Ngrok实现内网穿透助力远程开发
  • 25【数组的理解】
  • Vue 3 中的 watch:监视数据的变化
  • lambda 表达式:Python中的极简艺术