基于 HTML5
在 web
端实现摄像、视频录制及重播以及拍照。
-
需要支持且开启摄像头权限
-
需要支持视频录制
MediaRecorder
可以通过 getMediaAuth
来获取摄像头权限:
getMediaAuth()
.then(stream => {
console.log(stream)
})
.catch(err => {
console.error(err)
})
上述 err
有以下几种情况:
-
NOT_SUPPORT
不支持摄像头 -
NOT_SECURE
执行环境不安全 -
NOT_PERMISSION
未授权
可以通过 getRecorderAuth()
来判断客户是否支持视频录制:
if (getRecorderAuth()) {
// ...
} else {
// ...
}
通过 yarn
安装依赖:
yarn add @liuyi_npm/media
如果要使用基础类库的话:
import Media from '@liuyi_npm/media'
const media = new Media()
也可以在 vue
项目中当作插件使用:
import Vue from 'vue'
import { useMediaInVue } from '@liuyi_npm/media'
Vue.use(useMediaInVue)
利用上述 Vue.use
注册之后,会在 Vue.prototype
上挂载 $media
实例。
另外,为了方便查看和上手,该库还内置了可以在 vue
项目中开箱即用的组件(可作 Demo
使用,暂不推荐实际生产直接应用):
import { MediaRecorder } from '@liuyi_npm/media'
import '@liuyi_npm/media/styles/index.css'
Vue.component('MediaRecorder', MediaRecorder)
useMediaInVue
与MediaRecorder
的配置和实例是互相独立的。
可以在 new
实例化或者手动调用实例 create
方法传入 options
:
const media = new Media(options)
// or
media.create(options)
options
支持参数如下:
-
mediaVideo
: 视频video
标签; -
recordVideo
: 视频重播video
标签; -
config
-
video
: 是否支持视频,默认为{ aspectRatio: 4 / 3 }
;移动端IOS
设备上视频流比例存在兼容性问题,笔者在测试中发现设置为4 / 3
有问题,1/ 1
正常。 -
audio
: 是否支持音频,默认为true
; -
mirror
: 是否镜面成像,默认为false
。
-
在日常经验中,我们在一些视频播放 APP
上会发现,是有可选画面尺寸的。譬如:
16:9
4:3
1:1
为了保证视频比例正常,我们一方面可以根据设置的 mediaVideo
宽高比来设置 aspectRatio
。
另一方面也可以通过 getRectWithAspectRatio
方法来设置给定 aspectRatio
下对应的 mediaVideo
元素宽高。
在 HTML5
中,基于 navigator.mediaDevices.getUserMedia
来判断客户端是否支持摄像功能。
我们可以通过 media.open()
方法来开启摄像,该方法基于 getMediaAuth
来判断是否有摄像权限。
media.open()
.then(stream => {
console.log(stream)
})
.catch(err => {
console.error(err)
})
可以通过 err
异常来进行对应场景下的逻辑判断。具体异常见 getMediaAuth
。
可使用 media.close()
方法来关闭摄像。
在 HTML5
中,基于 MediaRecorder
来创建视频流录制。
可使用 media.startRecorder()
来录制实时视频。
视频录制开始后,视频流会存储在 media.recordedBlobs
数组中。
可使用 media.stopRecorder()
来中止实时视频的录制。
视频重播功能需要在 options
中配置 recordVideo
。
在调用 media.playVideo()
时,如果 media.recordedBlobs
存在视频流信息,则 recordVideo
会播放录制完成的视频。
可使用 media.pauseVideo()
来中止实时视频的播放。
调用 media.downloadVideo()
方法,会将 media.recordedBlobs
以 video/webm
的视频格式下载下来。
在 HTML5
中,利用 canvas
以及 Blob
来实现视频图像的截取和转化。
在视频录制的过程中,可以截取某个瞬间的视频照片。
const photo = media.takePhoto({
filename: 'photo.png',
ratio: 2
})
// photo中会包含File类型对象以及Base64图片地址
console.log(photo.file)
console.log(photo.dataUrl)