长得好看的人如何用浏览器进行自拍

1、前言

首先这里核心技术是webrtc和canvas
Web Real-Time Communication:网页即时通讯,能够在浏览器进行实时语音或者视频对话的API
Canvas:HTML5中的新元素,能够用来来绘制图形、图标、以及其它任何视觉性图像html

talk is cheap, 上代码,如下示例运行的时候会请求摄像头权限,赞成便可,are you ready,接下来就是见证奇迹的时刻!web

2、示例

1.示例1-打开摄像头

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>打开摄像头</title>
</head>
<body>
<h1>打开摄像头</h1>
<video autoplay playsinline></video>
</body>
</html>

<script>
    const mediaStreamContrains = {
        video: {
            frameRate: {min: 20},
            width: {min: 640, ideal: 1280},
            height: {min: 360, ideal: 720},
            aspectRatio: 16 / 9
        },
        audio: {
            echoCancellation: true,
            noiseSuppression: true,
            autoGainControl: true
        }
    };

    const localVideo = document.querySelector('video');

    function gotLocalMediaStream(mediaStream) {
        localVideo.srcObject = mediaStream;
    }

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

    navigator.mediaDevices.getUserMedia(mediaStreamContrains).then(
        gotLocalMediaStream
    ).catch(
        handleLocalMediaStreamError
    );
</script>

示例2-拍照保存

<html>
<head>
    <meta charset="UTF-8">
    <title>拍照一分钟,P图两小时</title>
</head>

<body>
<section>
    <div>
        <video autoplay playsinline id="player"></video>
    </div>

</section>
<section>
    <div>
        <button id="snapshot">拍照</button>
        <button id="download">下载</button>
    </div>
    <div>
        <canvas id="picture"></canvas>
    </div>
</section>
</body>
</html>


<script>
    'use strict';

    var videoplay = document.querySelector('video#player');

    function gotMediaStream(stream) {
        window.stream = stream;
        videoplay.srcObject = stream;
    }

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

    function start() {
        var constraints = {
            video: {
                width: 1280,
                height: 720,
                frameRate: 15,
                facingMode: 'enviroment'
            },
            audio: false
        }

        navigator.mediaDevices.getUserMedia(constraints)
            .then(gotMediaStream)
            .catch(handleError);
    }


    //拍照
    var snapshot = document.querySelector('button#snapshot');
    snapshot.onclick = function () {
        var picture = document.querySelector('canvas#picture');
        picture.width = 1280;
        picture.height = 720;
        picture.getContext('2d').drawImage(videoplay, 0, 0, picture.width, picture.height);
    };


    //下载
    function downLoad(url) {
        var oA = document.createElement("a");
        oA.download = 'photo';// 设置下载的文件名,默认是'下载'
        oA.href = url;
        document.body.appendChild(oA);
        oA.click();
        oA.remove(); // 下载以后把建立的元素删除
    }

    document.querySelector("button#download").onclick = function () {
        downLoad(picture.toDataURL("image/jpeg"));
    };

    start();

</script>

3、重点功能说明

1.重点方法和参数

  • 方法:avigator.mediaDevices.getUserMedia(constraints);
    返回一个promise对象,调用成功,能够经过promise对象获取MediaStream对象,canvas

  • 参数:mediaStreamContrains
    传入的constraints参数类型为 MediaStreamConstraints,能够指定 MediaStream 中包含哪些类型的媒体轨(音频轨、视频轨),而且可为这些媒体轨设置一些限制。
    视频的帧率最小 20 帧每秒; 宽度最小是 640,理想的宽度是 1280; 高度最小是 360,最理想高度是 720; 宽高比是 16:9; 对于音频则是开启回音消除、降噪以及自动增益功能。promise

2.音频采集的基本概念

  • 摄像头:用于采集图像和视频
  • 麦克风:采集音频数据
  • 帧率:一秒钟采集图像的次数。帧率越高,越平滑流畅
  • 轨:借鉴了多媒体的概念,每条轨数据都是独立的,如MP4中的音频轨、视频轨,是分别被存储的
  • 流:能够理解为容器。在WebRTC中,流能够分为媒体流(MediaStream)和数据流(DataStream)。
  • 分辨率:2K、1080P、720P等,越清晰,占用带宽越多

3.音视频设备的基本原理

  • 音频设备
    音频输入设备主要是采集音数据,而采集音频数据的本质是模拟信号转成数字信号,
    采集到的数据通过量化、编码,最终开成数字信号,这就是音频设备要完成的工做。
    人的听觉范围的频率是20Hz~20kHz之间,平常语音交流8kHz就哆了。
    为了追求高品质、高保真,须要将音频输入设备采样率设置在40kHz上才能完整保留原始信号浏览器

  • 视频设备
    当实物光经过镜头进行摄像机后,它会经过视频设备的模数转换(A/D)模块,即光学传感器,将光转换成数字信号,即RGB数据,得到RGB数据后,再经过DSP进行优化处理,如自动加强、白平衡、色彩饱和等,等到24位的真彩色图片app

模数转换使用的采集定理称为奈奎斯特定理:ide

在进行模拟 / 数字信号的转换过程当中,当采样率大于信号中最高频率的 2 倍时,采样以后的数字信号就完整地保留了原始信号中的信息。优化

相关文章
相关标签/搜索