js 实现自拍

498 阅读2分钟

developer.mozilla.org/zh-CN/docs/…

image.png

步骤

1.用navigator.mediaDevices 和 navigator.mediaDevices.getUserMedia判断浏览器是否支持

2.用navigator.mediaDevices.getUserMedia()方法获取媒体流

3.将获取的媒体流赋给video标签的srcObject属性

4.使用cnavas元素从video中获取某一帧的数据,并将数据处理后赋给img

5.关闭媒体流的所有轨道

html部分
  <span>打开相机</span>
  <span>拍照</span>
  <span>关闭相机</span>
  <video src=""></video>
  <canvas style="display: none;"></canvas>
  <img src="" alt="">
基础js部分
  let spanStart = document.querySelectorAll('span')[0]
  let spanClick = document.querySelectorAll('span')[1]
  let spanEnd = document.querySelectorAll('span')[2]
  spanStart.addEventListener('click',function(){
    
  })
  spanClick.addEventListener('click',function(){

  })
  spanEnd.addEventListener('click',function(){

  })
判断浏览器是否支持
    let spanStart = document.querySelectorAll('span')[0]
    let spanClick = document.querySelectorAll('span')[1]
    let spanEnd = document.querySelectorAll('span')[2]
    spanStart.addEventListener('click',function(){
      if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia){

      }
      else console.log('浏览器不支持');
    })
    spanClick.addEventListener('click',function(){

    })
    spanEnd.addEventListener('click',function(){

    })
getUserMedia获取媒体流
    let spanStart = document.querySelectorAll('span')[0]
    let spanClick = document.querySelectorAll('span')[1]
    let spanEnd = document.querySelectorAll('span')[2]
    spanStart.addEventListener('click',function(){
      if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia){
        navigator.mediaDevices.getUserMedia({audio: true,video: true}).then( stream =>{
          
        }).catch( err => {
          console.log(err);
        })
      }
      else console.log('浏览器不支持');
    })
    spanClick.addEventListener('click',function(){

    })
    spanEnd.addEventListener('click',function(){

    })
将媒体流注入到video标签的srcObject中,并让视频播放

!!!video的src 是播多媒体文件的;srcobj 是实时流

    let spanStart = document.querySelectorAll('span')[0]
    let spanClick = document.querySelectorAll('span')[1]
    let spanEnd = document.querySelectorAll('span')[2]
    let video = document.querySelector('video')
    spanStart.addEventListener('click',function(){
      if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia){
        navigator.mediaDevices.getUserMedia({audio: true,video: true}).then( stream =>{
          video.srcObject = stream      // src 是播多媒体文件的;srcobj 是实时流
          video.play()
        }).catch( err => {
          console.log(err);
        })
      }
      else console.log('浏览器不支持');
    })
    spanClick.addEventListener('click',function(){

    })
    spanEnd.addEventListener('click',function(){

    })
从流中捕获帧

使用canvas从video中获取某一帧的数据,显示在img中

    let spanStart = document.querySelectorAll('span')[0]
    let spanClick = document.querySelectorAll('span')[1]
    let spanEnd = document.querySelectorAll('span')[2]
    let video = document.querySelector('video')
    let canvas = document.querySelector('canvas')
    let img = document.querySelector('img')
    spanStart.addEventListener('click',function(){
      if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia){
        navigator.mediaDevices.getUserMedia({audio: true,video: true}).then( stream =>{
          video.srcObject = stream      // src 是播多媒体文件的;srcobj 是实时流
          video.play()
        }).catch( err => {
          console.log(err);
        })
      }
      else console.log('浏览器不支持');
    })
    spanClick.addEventListener('click',function(){
      let context = canvas.getContext('2d')
      context.drawImage(video, 0, 0, 300, 150)
      let data = canvas.toDataURL('image/png');
      img.setAttribute('src', data)
    })
    spanEnd.addEventListener('click',function(){

    })
关闭媒体流,并将video标签关闭
    let spanStart = document.querySelectorAll('span')[0]
    let spanClick = document.querySelectorAll('span')[1]
    let spanEnd = document.querySelectorAll('span')[2]
    let video = document.querySelector('video')
    let canvas = document.querySelector('canvas')
    let img = document.querySelector('img')
    let mediaStream = null
    spanStart.addEventListener('click',function(){
      if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia){
        navigator.mediaDevices.getUserMedia({audio: true,video: true}).then( stream =>{
          mediaStream = stream
          video.style = "display: inline_block"
          video.srcObject = stream      // src 是播多媒体文件的;srcobj 是实时流
          video.play()
        }).catch( err => {
          console.log(err);
        })
      }
      else console.log('浏览器不支持');
    })
    spanClick.addEventListener('click',function(){
      let context = canvas.getContext('2d')
      context.drawImage(video, 0, 0, 300, 150)
      let data = canvas.toDataURL('image/png');
      img.setAttribute('src', data)
    })
    spanEnd.addEventListener('click',function(){
      mediaStream.getTracks().forEach(track => {
        track.stop()           // 关闭媒体流的所有轨道
        video.style = "display: none"
      });
    })