h***@jdsn.com.cn
h***@jdsn.com.cn
  • 发布:2025-10-21 11:02
  • 更新:2025-10-21 11:02
  • 阅读:423

【报Bug】华为、nova手机调用uni.compressVideo,报错 compressVideo:fail start failed

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Mac

PC开发环境操作系统版本号: 15.6.1 (24G90)

HBuilderX类型: 正式

HBuilderX版本号: 4.75

手机系统: Android

手机系统版本号: Android 12

手机厂商: 华为

手机机型: MGZ-BD00

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

示例代码:

代码调用顺序:

  1. 选择视频(selectAndUploadVideo函数)
  2. 校验视频时长(validateVideoDuration函数)
  3. 保存视频到相册(saveFile函数)
  4. 压缩视频(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”

bug描述:

  • 手机品牌:ptac
  • 手机机型:MGZ-BD00
  • 操作系统:android
  • 操作系统版本:11
  • Android系统API库版本:30
  • rom名称:Android
  • rom版本:11

问题描述:代码中调用uni.compressVideo,该方法的fail回调函数中捕获到错误,错误信息如下:

{"errMsg":"compressVideo:fail start failed","errCode":-99,"code":-99}

实际过程中,不止这一个型号的手机出现这种问题,如下型号的手机也有问题,且报错信息都是{"errMsg":"compressVideo:fail start failed","errCode":-99,"code":-99},据观察,基本都是华为系手机

  • "设备品牌":"huawei","设备型号":"NCO-AL00","操作系统":"android","操作系统版本":"12","Android系统API库版本":31,"rom名称":"HarmonyOS","rom版本":"4.2.0"

  • "设备品牌":"huawei","设备型号":"GOA-AL80","操作系统":"android","操作系统版本":"12","Android系统API库版本":31,"rom名称":"HarmonyOS","rom版本":"4.2.0"

  • "设备品牌":"huawei","设备型号":"CET-AL60","操作系统":"android","操作系统版本":"12","Android系统API库版本":31,"rom名称":"HarmonyOS","rom版本":"4.2.0"

  • "设备品牌":"huawei","设备型号":"RTE-AL00","操作系统":"android","操作系统版本":"12","Android系统API库版本":31,"rom名称":"HarmonyOS","rom版本":"4.2.0"

  • "设备品牌":"huawei","设备型号":"CET-AL60","操作系统":"android","操作系统版本":"12","Android系统API库版本":31,"rom名称":"HarmonyOS","rom版本":"4.2.0"

以上设备信息,均通过 uni.getSystemInfo 获取

2025-10-21 11:02 负责人:DCloud_App_Array 分享
已邀请:

要回复问题请先登录注册