createMediaRecorder
该 API 使用方法为 MediaRecorder wx.createMediaRecorder(Object canvas, Object options)
功能说明:创建 WebGL 画面录制器,可逐帧录制在 WebGL 上渲染的画面并导出视频文件。
参数及说明:
Object canvas,WebGL 对象,通过 SelectorQuery 获取到的 node 对象或通过 wx.createOffscreenCanvas 创建的离屏 WebGL Canvas 对象。
Object options。
属性 | 类型 | 默认值 | 必填 | 说明 |
duration | number | 600 | 否 | 指定录制的时长(s),到达自动停止。最大7200,最小5 |
videoBitsPerSecond | number | 1000 | 否 | 视频比特率(kbps),最小值600,最大值3000 |
gop | number | 12 | 否 | 视频关键帧间隔 |
fps | number | 24 | 否 | 视频 fps |
width | number | canvas.width | 否 | 画布录制宽度 |
height | number | canvas.height | 否 | 画布录制高度 |
返回值:MediaRecorder。
示例代码
// 准备 canvas 对象,可以是 wxml 声明的 node 对象const canvas = await new Promise(resolve => {wx.createSelectQuery().select('#canvas').node(res => resolve(res.node)).exec()})// 也可以是 wx.createOffscreenCanvas 创建的离屏 canvasconst canvas = wx.createOffscreenCanvas()canvas.width = 300canvas.height = 150// 准备一个 canvas 绘制函数,这里使用 three.jsconst THREE = require('threejs-miniprogram').createScopedThreejs(canvas)const camera = new THREE.PerspectiveCamera(70, canvas.width / canvas.height, 1, 1000)const scene = new THREE.Scene()const texture = await new Promise(resolve => new THREE.TextureLoader().load('./test.png', resolve)) // 准备一个图片加载为贴图const geometry = new THREE.BoxBufferGeometry(200, 200, 200)const material = new THREE.MeshBasicMaterial({ map: texture })const mesh = new THREE.Mesh(geometry, material)camera.position.z = 400;scene.add(mesh)const renderer = new THREE.WebGLRenderer({ antialias: false })renderer.setPixelRatio(1)renderer.setSize(canvas.width, canvas.height)// canvas 绘制函数const render = () => {mesh.rotation.x += 0.005mesh.rotation.y += 0.1renderer.render(scene, camera)}// 创建 mediaRecorderconst fps = 30const recorder = wx.createMediaRecorder(canvas, {fps,})// 启动 mediaRecorderawait recorder.start()// 录制 5s 的视频let frames = fps * 5// 逐帧绘制while (frames--) {await recorder.requestFrame()render()}// 绘制完成,生成视频const {tempFilePath} = await recorder.stop()// 销毁 mediaRecorderrecorder.destroy()
低版本异步接口兼容:对基础库2.16.1版本前的 mediaRecorder,所有的接口都没有返回 Promise 对象,若需要兼容低版本,则可采用如下方式的写法:
// 启动 mediaRecorderawait new Promise(resolve => {recorder.on('start', resolve)recorder.start()})// 逐帧绘制while (frames--) {await new Promise(resolve => recorder.requestFrame(resolve))render()}// 绘制完成,生成视频const {tempFilePath} = await new Promise(resolve => {recorder.on('stop', resolve)recorder.stop()})
MediaRecorder
.destroy
该 方法 使用方式为 Promise MediaRecorder.destroy()
功能说明:销毁录制器。
返回值:Promise。
.off
该 方法 使用方式为 MediaRecorder.off(string eventName, function callback)
功能说明:取消监听录制事件。当对应事件触发时,该回调函数不再执行。
参数及说明:
string eventName,事件名。
function callback,事件触发时执行的回调函数。
.on
该 方法 使用方式为 MediaRecorder.on(string eventName, function callback)
功能说明:注册监听录制事件的回调函数。当对应事件触发时,回调函数会被执行。
参数及说明:string eventName,事件名,其合法值为如下。
值 | 说明 |
start | 录制开始事件 |
stop | 录制结束事件 |
pause | 录制暂停事件 |
resume | 录制继续事件 |
timeupdate | 录制事件更新事件 |
.pause
该 方法 使用方式为 Promise MediaRecorder.pause()
功能说明:暂停录制。
返回值:Promise。
.requestFrame
该 方法 使用方式为 Promise MediaRecorder.requestFrame(function callback)
功能说明:请求下一帧录制,在 callback 里完成一帧渲染后开始录制当前帧。
参数及说明:function callback。
返回值:Promise。
.resume
该 方法 使用方式为 Promise MediaRecorder.resume()
功能说明:恢复录制。
返回值:Promise。
.start
该 方法 使用方式为 Promise MediaRecorder.start()
功能说明:开始录制。
返回值:Promise。
.stop
该 方法 使用方式为 Promise MediaRecorder.stop()
功能说明:暂停录制。
返回值:Promise。