华为 nova手机调用uni-app uni.compressVideo报错 compressVideo fail start failed
华为 nova手机调用uni-app uni.compressVideo报错 compressVideo fail start failed
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Mac | 15.6.1 | HBuilderX |
| Android | 12 |
示例代码:
代码调用顺序:
- 选择视频(selectAndUploadVideo函数)
- 校验视频时长(validateVideoDuration函数)
- 保存视频到相册(saveFile函数)
- 压缩视频(videoCompression中在保存视频函数saveFile的promise resolve后,调用uni.compressVideo)
-
选择视频代码:
selectAndUploadVideo() { uni.chooseVideo({ sourceType: 'camera', compressed: false, maxDuration: 50, success: res => { // 选择视频后,调用validateVideoDuration校验视频时长是否符合要求 this.validateVideoDuration(res.tempFilePath, 30, 50) .then(() => { // 视频时长校验通过后,压缩视频 this.videoCompression(res); // 调用视频压缩方法 }) .catch(err => { console.log(err) }); }, fail: err => { console.error('选择视频失败:', err); }, }); } -
校验视频时长函数:
validateVideoDuration(filePath, minDuration, maxDuration) { return new Promise((resolve, reject) => { uni.getVideoInfo({ src: filePath, success: res => { const duration = res.duration; // 秒数 if (duration < minDuration) { reject(`视频不能少于 ${minDuration} 秒`); } else { console.log('视频时长验证通过,当前时长', duration); resolve(duration); } }, fail: () => { reject('读取视频信息失败'); }, }); }); } -
压缩视频函数:
async videoCompression(res, addressInfo) { try { let savedFilePath = null; if (res && res.size && res.tempFilePath) { try { // 保存原视频到永久路径并获取savedFilePath savedFilePath = await this.saveFile(res.tempFilePath); console.log('原视频已保存到永久路径:', savedFilePath); } catch (e) { console.warn('保存原视频失败', e); } } uni.showLoading({ title: '压缩中...', mask: true }); const compressSrc = savedFilePath || res.tempFilePath; uni.compressVideo({ quality: 'high', src: compressSrc, success: async _res => { uni.hideLoading(); // 上传视频 this.handleVideoUpload(_res); }, fail: err => { // 视频压缩失败错误信息,nova 10 手机压缩失败的话,是在这里捕获到的错误 console.log(err) uni.showToast({ title: err.message || err.errMsg }); }, }); } catch (error) { console.error('视频压缩异常:', error); } } -
保存视频到相册
saveFile(tempFilePath) { console.log('? 开始保存到相册:', tempFilePath); return new Promise((resolve, reject) => { try { uni.saveFile({ tempFilePath: tempFilePath, success: saveResult => { const savedFilePath = saveResult.savedFilePath; // console.log('视频已保存到:', savedFilePath); uni.saveVideoToPhotosAlbum({ filePath: savedFilePath, success: () => { console.log('视频已保存到系统相册'); resolve(savedFilePath); }, fail: err => { console.error('保存到相册失败:', err); resolve(savedFilePath); }, }); }, fail: err => { console.error('保存视频失败:', err); reject(err); }, }); } catch (error) { console.error('保存视频失败:', error); reject(error); } }); }
操作步骤:
- 使用ptac 手机(MGZ-BD00),使用我提供的测试App 的安装包以及测试的账号登录
- 进入运单页面,任意一个运单,点击“确认装车”,授予权限
- 进入装车页面,点击“上传装货视频”文字下方的 + 图标,拍摄视频,录制30~50秒的视频,点击确定,(无需点击页面最下方的“提交”按钮,只验证视频上传压缩流程即可)
- 页面会自动进入视频压缩流程,页面提示:“compressVideo:fail start failed”
预期结果:
uni.compressVideo可以正常压缩视频,走success回调函数,正常走上传视频流程
实际结果:
uni.compressVideo的fail回调用捕获到错误信息:{“errMsg”:“compressVideo:fail start failed”,“errCode”:-99,“code”:-99},导致页面提示:“compressVideo:fail start failed”
更多关于华为 nova手机调用uni-app uni.compressVideo报错 compressVideo fail start failed的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于华为 nova手机调用uni-app uni.compressVideo报错 compressVideo fail start failed的实战教程也可以访问 https://www.itying.com/category-93-b0.html
从代码和错误信息来看,华为nova手机调用uni.compressVideo报错"compressVideo:fail start failed"可能是以下几个原因导致的:
-
文件路径问题:在videoCompression函数中,compressSrc使用了savedFilePath(永久路径)或res.tempFilePath(临时路径)。华为设备对文件路径访问权限较严格,临时文件可能已被清理或权限不足。
-
文件格式兼容性:华为设备录制的视频格式可能与uni.compressVideo的压缩引擎不兼容。可以尝试在uni.chooseVideo中设置camera参数为’back’或’front’,明确指定摄像头。
-
存储权限限制:虽然已授予权限,但华为EMUI系统对应用存储管理较严格,建议检查是否开启了"允许修改系统设置"权限。
-
压缩资源占用:视频时长30-50秒,文件较大,压缩时可能因内存不足导致启动失败。可以尝试:
- 先压缩较短视频测试
- 降低压缩质量参数
建议修改videoCompression函数,直接使用临时路径:
const compressSrc = res.tempFilePath; // 跳过保存到相册步骤
同时添加错误详细信息收集:
fail: err => {
console.log('压缩失败详情:', JSON.stringify(err));
uni.getSystemInfo({
success: sysRes => {
console.log('设备信息:', sysRes);
}
});
}

