画面录制器

最近更新时间:2023-11-10 15:39:29

我的收藏

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 创建的离屏 canvas
const canvas = wx.createOffscreenCanvas()
canvas.width = 300
canvas.height = 150

// 准备一个 canvas 绘制函数,这里使用 three.js
const 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.005
mesh.rotation.y += 0.1
renderer.render(scene, camera)
}

// 创建 mediaRecorder
const fps = 30
const recorder = wx.createMediaRecorder(canvas, {
fps,
})

// 启动 mediaRecorder
await recorder.start()

// 录制 5s 的视频
let frames = fps * 5
// 逐帧绘制
while (frames--) {
await recorder.requestFrame()
render()
}

// 绘制完成,生成视频
const {tempFilePath} = await recorder.stop()
// 销毁 mediaRecorder
recorder.destroy()
低版本异步接口兼容:对基础库2.16.1版本前的 mediaRecorder,所有的接口都没有返回 Promise 对象,若需要兼容低版本,则可采用如下方式的写法:
// 启动 mediaRecorder
await 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

功能说明:可通过 wx.createMediaRecorder 创建。MediaRecorder WebGL 画面录制器,可以进行录制相关操作,在结束录制时导出视频文件。

.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。