tencent cloud

文档反馈

画面录制器

最后更新时间:2024-03-04 23:01:18

    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。
    
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持