在浏览器中使用摄像头和麦克风DEMO
在浏览器中使用摄像头和麦克风DEMO
刚好这几天改公司项目的UI
,接触了公司的某个浏览器在线视频会议系统,有点类似牛客网面试的在线视频对话。
主要感兴趣的就是浏览器如何使用电脑的摄像头和麦克风。
经过一番摸索,发现了相关的API
。
navigator.mediaDevices
对象
在navigator
挂载了一个只读的MediaDevices
对象
MDN上对该对象的解释:
接口提供访问连接媒体输入的设备,如照相机和麦克风,以及屏幕共享等。它可以使你取得任何硬件资源的媒体数据。
mediaDevices.getUserMedia
方法
getUserMedia
可以通过传递特定的参数来请求获取相应的媒体设备。
比如我们想获取摄像头,可以这么写:
1 | const p = navigator.mediaDevices.getUserMedia({ |
然后把这段代码放到一个普通的html
页面中,跑一下,就会有如下的效果:
点击允许之后:
可以看到浏览器就已经获取到摄像头了。
不过这也看不出来什么效果,所以我们需要把摄像头捕捉的画面放到页面中来看一下。
这里就需要我们用到video
标签,以及需要了解MediaStream
这个类。
MediaStream
简单地翻译就是媒体流,可以理解为是各类媒体的一个集合或者说是一个容器。
比一个视频,它有视频轨,音频轨,可能还有字幕轨等等。
那么这个视频可以理解成一个MediaStream
的实例对象。
而它包含的这些轨道,也就是MediaStreamTrack
实例对象,即媒体流轨道对象。
我们可以打印MediaStream
对象和它的所有MediaStreamTrack
轨道对象。
1 | const p = navigator.mediaDevices.getUserMedia({ |
可以发现只有一个轨道对象,它的类别是video
,设备的名字是HD Webcam (5986:069e)
,这个名字就是我电脑的前置摄像头的名字。
video
标签
通常情况下,我们都是通过src
来指定video
的播放地址,从而使得video
标签展示视频的内容。
事实上,video
标签同样可以接收MediaStream
对象来播放对应的内容,不过不是通过src
属性去指定,而是通过srcObject
属性来指定一个MediaStream
对象。
目前srcObject
在MDN
上被标注为一个实验性质的功能。不过得益于微软放弃IE
,全面布局EDGE
来看,离全部支持应该也不远了。
srcObject
不仅支持MediaStream
对象,也支持以下的类型:
Blob
File
MediaSource
前两者比较常见,比较兼容的写法是通过URL.createObjectURL
转成一个URL
对象,然后附加到src
上进行播放。
MediaSource
也是一个实验性质的功能,个人理解是对于视频流进行更加细微的控制,比如分段加载,部分加载,码率切换等等,一个很重要的应用就是直播平台。
相关的文章可以看这: 使用 MediaSource 搭建流式播放器 - 知乎
似乎跑偏了,梳理一下就是给video
对象的srcObject
挂载这个MediaStream
对象即可。
整个HTML
文件如下
1 |
|
然后丢到浏览器中,就可以看见自己帅气的脸颊了~
当然getUserMedia
不仅可以使用摄像头,也可以使用麦克风,只要指定参数audio
为true
即可。
1 | const p = navigator.mediaDevices.getUserMedia({ |
把上面的HTML
中的相关代码改造成上面这样,带上耳机,就能自己和自己说话啦。
PS:如果摄像头或者麦克风被占用的话,那么返回的Promise
会被拒绝reject
。
reject
的error
有如下几种
AbortError
中止错误NotAllowedError
拒绝错误NotFoundError
找不到错误NotReadableError
无法读取错误OverConstrainedError
无法满足要求错误SecurityError
安全错误TypeError
类型错误
错误相关的详细解释可以在MDN
上getUserMedia
这个页面上查看
后记
你问我为什么只有半个头?
因为我太帅气了,怕影响到你的自信,哈哈哈哈哈哈哈。