摄像头功能实现
可以通过 <camera> 组件实现摄像头预览和拍照功能,以下是相关代码示例及说明:
Page({
data: {
devicePosition: 'back', // 初始使用后置摄像头
flash: 'off', // 闪光灯默认关闭
photoPath: '' // 照片路径
},
onLoad() {
// 检查摄像头权限
wx.getSetting({
success: (res) => {
if (!res.authSetting['scope.camera']) {
// 申请摄像头权限
wx.authorize({
scope: 'scope.camera',
success: () => {
console.log('摄像头权限已获取');
},
fail: () => {
wx.showToast({
title: '请授予摄像头权限',
icon: 'none'
});
}
});
}
}
});
},
// 切换摄像头
switchCamera() {
this.setData({
devicePosition: this.data.devicePosition === 'back'? 'front' : 'back'
});
},
// 切换闪光灯
toggleFlash() {
this.setData({
flash: this.data.flash === 'on'? 'off' : 'on'
});
},
// 拍照
takePhoto() {
const ctx = wx.createCameraContext();
ctx.takePhoto({
quality: 'high',
success: (res) => {
this.setData({
photoPath: res.tempImagePath
});
},
fail: (err) => {
console.error('拍照失败', err);
wx.showToast({
title: '拍照失败',
icon: 'none'
});
}
});
},
// 保存图片到相册
savePhoto() {
wx.saveImageToPhotosAlbum({
filePath: this.data.photoPath,
success: () => {
wx.showToast({
title: '保存成功'
});
},
fail: (err) => {
console.error('保存失败', err);
wx.showToast({
title: '保存失败',
icon: 'none'
});
}
});
},
// 摄像头错误处理
onCameraError(e) {
console.error('摄像头错误', e.detail);
wx.showToast({
title: '摄像头打开失败',
icon: 'none'
});
}
});
录音功能实现
使用 wx.getRecorderManager()
实现录音功能,代码示例及说明如下:
Page({
data: {
isRecording: false,
recordPath: '',
recordDuration: 0,
timer: null
},
onLoad() {
// 获取录音管理器
this.recorderManager = wx.getRecorderManager();
// 监听录音结束
this.recorderManager.onStop((res) => {
this.setData({
recordPath: res.tempFilePath,
isRecording: false
});
clearInterval(this.data.timer);
});
// 监听录音错误
this.recorderManager.onError((err) => {
console.error('录音错误', err);
wx.showToast({
title: '录音失败',
icon: 'none'
});
});
},
// 开始录音
startRecord() {
// 检查录音权限
wx.getSetting({
success: (res) => {
if (!res.authSetting['scope.record']) {
wx.authorize({
scope: 'scope.record',
success: () => {
this.startRecording();
},
fail: () => {
wx.showToast({
title: '请授予录音权限',
icon: 'none'
});
}
});
} else {
this.startRecording();
}
}
});
},
// 实际开始录音
startRecording() {
// 配置录音参数
const options = {
duration: 60000, // 最长录音时间,单位ms
sampleRate: 44100,
numberOfChannels: 1,
encodeBitRate: 192000,
format: 'mp3',
frameSize: 50
};
this.recorderManager.start(options);
this.setData({
isRecording: true,
recordDuration: 0,
timer: setInterval(() => {
this.setData({
recordDuration: this.data.recordDuration + 1
});
}, 1000)
});
},
// 停止录音
stopRecord() {
this.recorderManager.stop();
},
// 保存录音
saveRecord() {
wx.saveVideoToPhotosAlbum({
filePath: this.data.recordPath,
success: () => {
wx.showToast({
title: '保存成功'
});
},
fail: (err) => {
console.error('保存失败', err);
wx.showToast({
title: '保存失败',
icon: 'none'
});
}
});
},
onUnload() {
// 页面卸载时清理定时器
if (this.data.timer) {
clearInterval(this.data.timer);
}
}
});
视频拍摄功能实现
结合 <camera> 组件和 wx.createCameraContext()
实现视频拍摄,相关代码如下:
Page({
data: {
isRecording: false,
videoPath: ''
},
onLoad() {
this.cameraContext = wx.createCameraContext();
},
// 开始拍摄视频
startVideo() {
// 检查摄像头和录音权限
wx.getSetting({
success: (res) => {
if (!res.authSetting['scope.camera'] ||!res.authSetting['scope.record']) {
wx.authorize({
scope: ['scope.camera', 'scope.record'],
success: () => {
this.startRecordingVideo();
},
fail: () => {
wx.showToast({
title: '请授予摄像头和录音权限',
icon: 'none'
});
}
});
} else {
this.startRecordingVideo();
}
}
});
},
// 开始录制视频
startRecordingVideo() {
this.cameraContext.startRecord({
success: () => {
this.setData({
isRecording: true
});
wx.showToast({
title: '开始录制',
icon: 'none'
});
},
fail: (err) => {
console.error('录制失败', err);
wx.showToast({
title: '录制失败',
icon: 'none'
});
}
});
},
// 停止拍摄视频
stopVideo() {
this.cameraContext.stopRecord({
success: (res) => {
this.setData({
videoPath: res.tempVideoPath,
isRecording: false
});
},
fail: (err) => {
console.error('停止录制失败',
err);
wx.showToast({
title: '停止录制失败',
icon: 'none'
});
}
});
},
// 保存视频到相册
saveVideo() {
wx.saveVideoToPhotosAlbum({
filePath: this.data.videoPath,
success: () => {
wx.showToast({
title: '保存成功'
});
},
fail: (err) => {
console.error('保存失败', err);
wx.showToast({
title: '保存失败',
icon: 'none'
});
}
});
}
});
注意事项
权限处理
多媒体功能需要用户授权,必须在使用前检查并请求权限:
摄像头权限:scope.camera
录音权限:scope.record
保存到相册权限:scope.writePhotosAlbum
性能优化
不需要使用摄像头时及时关闭,减少资源消耗。
录制视频时注意控制时长,避免占用过多存储空间。
处理大文件时考虑分片上传。
兼容性
不同设备可能有不同的表现,做好异常处理。
使用 wx.canIUse
检查API兼容性。
用户体验
提供清晰的操作反馈。
处理各种异常情况并给出提示。