Skip to content

内置 API

https://developers.weixin.qq.com/miniprogram/dev/api/

音视频 API

音视频文件通常先由客户端选择或录制,再按需压缩并上传。选择、压缩和录音得到的都是本地临时文件;业务服务端应校验文件类型、大小、时长和上传结果。

视频选择与压缩

wx.chooseMedia 可拍摄或从相册选择图片、视频。选择视频后,先根据大小和时长决定是否压缩;不应假定 sizeType: ['compressed'] 已满足业务的体积要求。

js
async function chooseAndCompressVideo() {
  const { tempFiles } = await wx.chooseMedia({
    count: 1,
    mediaType: ['video'],
    sourceType: ['album', 'camera'],
    maxDuration: 30,
    sizeType: ['original'],
  })

  const file = tempFiles[0]
  if (!file || file.fileType !== 'video') {
    throw new Error('未选择视频')
  }

  const { tempFilePath, size } = await wx.compressVideo({
    src: file.tempFilePath,
    quality: 'medium',
  })

  return { tempFilePath, size }
}

wx.compressVideo 支持 lowmediumhigh 三档 quality。若需精细控制,可改用 bitrate(kbps)、fpsresolution(相对原视频的比例,取值为 (0, 1]);传入 quality 时这三个参数会被忽略。返回的 size 单位为 kB,选择媒体返回的 size 单位为 B,比较前需统一单位。

上传与保存

临时路径应尽快上传;不要把本地临时路径直接作为业务数据提交。上传成功仅表示文件传输完成,仍要以服务端的校验与素材记录为准。

js
async function uploadVideo(filePath) {
  const result = await wx.uploadFile({
    url: 'https://api.example.com/media/videos',
    filePath,
    name: 'file',
    formData: { scene: 'post' },
  })

  const body = JSON.parse(result.data)
  if (result.statusCode !== 200 || body.code !== 0) {
    throw new Error(body.message || '视频上传失败')
  }
  return body.data
}

wx.saveVideoToPhotosAlbum 仅支持保存本地 MP4 视频,并需要 scope.writePhotosAlbum 授权。应在用户明确点击“保存到相册”后调用;拒绝授权时可通过 wx.openSetting 让用户自行调整。

视频播放控制

video 组件设置稳定的 id,再用 wx.createVideoContext 获取上下文进行播放、暂停、全屏等控制。自定义组件内需传入当前组件实例。

xml
<video id="preview" src="{{videoUrl}}" controls></video>
<button bindtap="playPreview">播放</button>
js
Page({
  playPreview() {
    wx.createVideoContext('preview', this).play()
  },
})

录音与音频播放

wx.getRecorderManager() 返回全局唯一的录音管理器。注册事件应在开始录音前完成;在 onStop 中取得临时文件并上传,页面卸载时停止仍在进行的录音。

js
const recorder = wx.getRecorderManager()

recorder.onStop(async ({ tempFilePath, duration }) => {
  if (duration < 1_000) return
  await uploadAudio(tempFilePath)
})

function startRecord() {
  recorder.start({ duration: 60_000, format: 'mp3' })
}

function stopRecord() {
  recorder.stop()
}

wx.createInnerAudioContext() 用于短音效或业务音频播放。短且高频的音频可启用 useWebAudioImplement;长音频保持默认实现。该对象不会自动释放,不再使用时必须调用 destroy(),并清理事件监听。

js
const audio = wx.createInnerAudioContext({ useWebAudioImplement: true })
audio.src = 'https://cdn.example.com/notice.mp3'
audio.onError((error) => console.error('音频播放失败', error.errMsg))
audio.play()

// 页面或组件销毁时执行
audio.destroy()

使用边界

  • 使用前检查最低基础库版本,并在真机验证拍摄、压缩和播放差异。
  • 录音、相册保存等能力只在用户触发后调用;取消、拒绝授权和中断属于正常分支。
  • 上传前限制客户端文件大小与时长,服务端仍需重新检测 MIME 类型、实际大小、时长和内容安全。
  • 大文件上传应展示进度并支持取消或重试;不要在主线程反复压缩同一视频。

基于 MIT 许可发布