华为 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)
  1. 选择视频代码:

    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);  
        },  
      });  
    }
    
  2. 校验视频时长函数:

    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('读取视频信息失败');  
          },  
        });  
      });  
    }
    
  3. 压缩视频函数:

    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);  
      }  
    }
    
  4. 保存视频到相册

    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

1 回复

更多关于华为 nova手机调用uni-app uni.compressVideo报错 compressVideo fail start failed的实战教程也可以访问 https://www.itying.com/category-93-b0.html


从代码和错误信息来看,华为nova手机调用uni.compressVideo报错"compressVideo:fail start failed"可能是以下几个原因导致的:

  1. 文件路径问题:在videoCompression函数中,compressSrc使用了savedFilePath(永久路径)或res.tempFilePath(临时路径)。华为设备对文件路径访问权限较严格,临时文件可能已被清理或权限不足。

  2. 文件格式兼容性:华为设备录制的视频格式可能与uni.compressVideo的压缩引擎不兼容。可以尝试在uni.chooseVideo中设置camera参数为’back’或’front’,明确指定摄像头。

  3. 存储权限限制:虽然已授予权限,但华为EMUI系统对应用存储管理较严格,建议检查是否开启了"允许修改系统设置"权限。

  4. 压缩资源占用:视频时长30-50秒,文件较大,压缩时可能因内存不足导致启动失败。可以尝试:

    • 先压缩较短视频测试
    • 降低压缩质量参数

建议修改videoCompression函数,直接使用临时路径:

const compressSrc = res.tempFilePath; // 跳过保存到相册步骤

同时添加错误详细信息收集:

fail: err => {
  console.log('压缩失败详情:', JSON.stringify(err));
  uni.getSystemInfo({
    success: sysRes => {
      console.log('设备信息:', sysRes);
    }
  });
}
回到顶部