ios18 以上系统调用uni-app uni.compressVideo方法压缩视频压缩失败会走到fail回调

ios18 以上系统调用uni-app uni.compressVideo方法压缩视频压缩失败会走到fail回调

开发环境 版本号 项目创建方式
Mac 12.1 HBuilderX

示例代码:

uni.compressVideo({  
    src: params.src,  
    quality: "low",  
    resolution: resolution,  
    success: (res) => {  
        console.log("callBack_compressVideo: ", JSON.stringify(res));  
        videoPath = res.tempFilePath;  
        _this.uploadVideoFile(videoPath, params);  
    },  
    fail: (err) => {  
        $toast("压缩失败");  
    },  
});

操作步骤:

  1. uni.chooseVideo选择视频
  2. 成功后uni.compressVideo压缩视频

预期结果:

uni.compressVideo压缩视频能正常走到success回调

实际结果:

uni.compressVideo压缩视频走到了fail 报错信息:{"errMsg":"compressVideo:fail [object Object]"}

bug描述:

调用uni.chooseVideo 选择视频 若compressed设置为true 则选择视频失败,compressed这是为false 可以正常选择 调用uni.compressVideo方法进行视频压缩失败 该问题在ios 18和ios26系统中存在


更多关于ios18 以上系统调用uni-app uni.compressVideo方法压缩视频压缩失败会走到fail回调的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

这是一个已知的 iOS 系统兼容性问题,在 iOS 18 及以上版本中 uni.compressVideo 方法可能出现压缩失败的情况。建议采取以下解决方案:
对于 uni.chooseVideo 方法,避免直接使用 compressed:true 参数,改为先获取原始视频后再单独调用压缩方法
尝试调整压缩参数,特别是 iOS 专有参数: uni.compressVideo({
src: ‘原视频路径’,
quality: ‘medium’, // 尝试不同质量等级
bitrate: 2000, // 调整码率
resolution: 0.5 // 降低分辨率比例
}) 如问题持续存在,可以考虑使用 插件市场 中的第三方视频压缩插件作为替代方案。
更多参数说明参考:uni.compressVideo 文档
内容为 AI 生成,仅供参考

更多关于ios18 以上系统调用uni-app uni.compressVideo方法压缩视频压缩失败会走到fail回调的实战教程也可以访问 https://www.itying.com/category-93-b0.html


该bug反馈内容基本完整但存在关键缺失:描述了iOS 18+系统调用uni.compressVideo失败的现象,提供了代码示例和复现步骤,但未说明具体错误信息(err对象内容)、视频格式/大小等关键信息,且混淆了核心概念。
经分析,该问题主要源于概念误解:

uni.chooseVideo的compressed参数在App平台(iOS/Android)根本不支持(知识库明确说明该参数仅微信/抖音/快手等小程序支持),用户设置compressed=true导致选择失败属于预期行为,非bug
正确的视频压缩流程应为:先用chooseVideo(false)选视频,再单独调用compressVideo进行压缩
用户反馈的compressVideo失败问题可能真实存在,但反馈中未提供足够诊断信息(如具体错误码、视频参数等)

建议解决方案:

立即修正API使用方式:App平台chooseVideo必须设置compressed=false
检查HBuilderX是否升级至最新版(当前4.87可能未完全适配iOS 18)
若compressVideo仍失败,需提供具体错误信息并参考视频压缩文档排查参数兼容性
iOS 18新系统可能存在临时兼容问题,可关注官方更新或尝试使用插件市场视频压缩插件(插件搜索链接) 内容为 AI 生成,仅供参考

根据你的描述,这个问题很可能与iOS 18及以上系统的权限变更或API限制有关。uni.compressVideo在iOS底层依赖AVAssetExportSession进行视频压缩,而iOS 18可能对某些视频格式或编码方式的处理逻辑进行了调整。

从报错信息{"errMsg":"compressVideo:fail [object Object]"}来看,这是一个原生层返回的未明确解析的错误对象。通常这类问题由以下原因导致:

  1. 输入视频格式问题:iOS 18可能对某些从相册选择的视频编码(如HEVC with Alpha)支持不完善,导致压缩会话初始化失败。
  2. 临时文件权限uni.chooseVideo返回的临时文件路径在iOS 18中可能受到更严格的沙盒限制,压缩时无法读取。
  3. 分辨率/码率不兼容:你设置的resolution参数可能与原视频比例或iOS 18的编码器要求冲突。

建议排查步骤:

1. 捕获详细错误信息:

fail: (err) => {
    console.error('compressVideo失败详情:', err);
    // 尝试访问可能的子属性
    if (err.errMsg) console.log('errMsg:', err.errMsg);
    if (err.code) console.log('错误码:', err.code);
    $toast("压缩失败");
}

2. 检查视频源信息: 在调用compressVideo前,先通过uni.getVideoInfo检查视频的详细参数:

uni.getVideoInfo({
    src: params.src,
    success: (info) => {
        console.log('视频信息:', info);
        // 特别注意orientation、codec、fps等字段
    }
});

3. 尝试固定参数测试: 暂时使用固定的分辨率参数,排除变量影响:

uni.compressVideo({
    src: params.src,
    quality: "low",
    resolution: { width: 640, height: 480 }, // 使用标准4:3比例
    success: (res) => { /* ... */ },
    fail: (err) => { console.error(err); }
});

4. 检查临时文件有效性: 确保params.src在调用时仍然有效,iOS可能清理了临时文件。

临时解决方案:

如果急需上线,可以考虑以下备选方案:

  1. 使用条件编译绕过iOS 18压缩:
// #ifndef APP-PLUS || !(osname === 'iOS' && osversion >= '18.0')
uni.compressVideo({ /* 参数 */ });
// #endif
// 对于iOS 18直接使用原视频
回到顶部