H5 调用摄像头

WebRTC(Web Real-Time Communication,网页实时通信),是一个支持网页浏览器进行实时语音对话或视频对话的API。 

1、getUserMedia

要播放摄像头的影像,首先需要一个video标签:

1

<video id="video"></video>

获取摄像头影像主要是通过navigator.getUserMedia这个接口,这个接口的支持情况已经逐渐变好了:点这里

不过,使用的时候还是要加上前缀的,兼容代码:

1

2

3

navigator.getUserMedia =  navigator.getUserMedia

                         || navigator.webkitGetUserMedia

                         || navigator.mozGetUserMedia;

1

语法: navigator.getUserMedia(constraints, successCallback, errorCallback);

 参数说明:

  • constraints:Object类型,指定了请求使用媒体的类型
  • succeCallback:启用成功时的函数,它传入一个参数,为视频流对象,可以进一步通过window.URL.createObjectURL()接口把视频流转换为对象URL。
  • errorCallback:启动失败时的函数。它传入一个参数,为错误对象(chrome)或错误信息字符串(Firefox),可能值:

 PERMISSION_DENIED:用户拒绝提供信息。

   NOT_SUPPORTED_ERROR:浏览器不支持硬件设备。

   MANDATORY_UNSATISFIED_ERROR:无法发现指定的硬件设备。

 例如:要启用视频设备(摄像头),可这样:

1

2

3

navigator.getUserMedia({  

  video: true 

});

 如果要同时启用视频设备和音频设备,可这样:

1

2

3

4

navigator.getUserMedia({  

  video: true,  

  audio: true 

});

  2、 获取摄像头

 

1

2

3

4

5

6

7

8

9

var URL = window.URL || window.webkitURL; // 获取到window.URL对象   

navigator.getUserMedia({  

  video: true  

}, function(stream) {  

  video.src = URL.createObjectURL(stream);// 将获取到的视频流对象转换为地址  

  video.play();     

}, function(error) {  

  console.log(error.name || error);  

});

  

3、 截图

除了实时直播外,我们还可以做实时截图效果,这时我们需要利用<canvas>元素来画图,代码如下:

1

2

3

4

5

6

7

8

9

10

<canvas id="canvas"></canvas>

var canvas = document.getElementById('canvas');  

var ctx = canvas.getContext('2d');  

var width = video.width;  

var height = video.height;  

canvas.width = width;  

canvas.height = height;

ctx.drawImage(video, 0, 0, width, height);

  

 

4、 保存图片

当然,截图后,你也可以保存下来:

  

1

2

3

4

<a download='snap.png' id="download">下载图片</a>  

var url = canvas.toDataURL('image/png'); 

document.getElementById('download').src = url;

  5、 完整实例

实例代码(由于安全限制问题,请将代码复制到本地运行):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

<!DOCTYPE html> 

<html>  

  <head>  

    <meta charset="UTF-8">  

    <title></title>  

    <style>

      #canvas,#video {

        float: left;  

        margin-right: 10px;  

        background: #fff;  

      }      

      .box {  

        overflow: hidden;  

        margin-bottom: 10px;  

      }

    </style>

  </head>  

  <body>  

    <div class="box">

      <video id="video" width="400" height="300"></video>

      <canvas id="canvas"></canvas>

    </div>

    <button id="live">直播</button>

    <button id="snap">截图</button>

    <script>  

      var video = document.getElementById('video');

      var canvas = document.getElementById('canvas');  

      var ctx = canvas.getContext('2d');  

      var width = video.width;  

      var height = video.height;  

      canvas.width = width;  

      canvas.height = height;   

      function liveVideo(){  

        var URL = window.URL || window.webkitURL;   // 获取到window.URL对象

        navigator.getUserMedia({  

          video: true  

        }, function(stream){  

          video.src = URL.createObjectURL(stream);   // 将获取到的视频流对象转换为地址

          video.play();   // 播放

          //点击截图     

          document.getElementById("snap").addEventListener('click', function() {  

            ctx.drawImage(video, 0, 0, width, height);  

            var url = canvas.toDataURL('image/png');  

            document.getElementById('download').href = url;  

          });

        }, function(error){  

          console.log(error.name || error);  

        });  

      }  

      document.getElementById("live").addEventListener('click',function(){  

        liveVideo();  

      });    

    </script>  

  </body

</html>

猜你喜欢

转载自blog.csdn.net/weixin_41888813/article/details/82497881