uni-app uni.chooseVideo 选择视频报错

uni-app uni.chooseVideo 选择视频报错

开发环境 版本号 项目创建方式
Windows 64 HBuilderX

操作步骤:

下载视频地址
https://prod-app-1258456241.cos.ap-guangzhou.myqcloud.com/test/testVideo/飞书20210910-105425.mp4 576x1280
https://prod-app-1258456241.cos.ap-guangzhou.myqcloud.com/test/testVideo/384bbd1336595a1c4fe474da7088e040.mp4 448x960

预期结果:

可以选择

实际结果:

报错

bug描述:

uni.chooseVideo compressed设置true
选择一个视频 576x1280的视频 大小2.8M 会返回 chooseVideo:fail Attempt to invoke virtual method ‘int java.lang.String.hashCode()’ on a null object reference

如果我选择448x960 大小 2.0M 返回成功


更多关于uni-app uni.chooseVideo 选择视频报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

视频下载到本地,测试没问题,压缩正常,未复现上述问题。

更多关于uni-app uni.chooseVideo 选择视频报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html


两个视频都没问题吗

2023/5/24 同样的问题

回复 叫啥好呢: 请问你的问题解决了吗?

回复 3***@qq.com: 没呢

根据你提供的信息,这个问题很可能与视频压缩处理过程中的参数传递有关。Attempt to invoke virtual method 'int java.lang.String.hashCode()' on a null object reference 这个错误表明在 Android 底层代码中,某个应为字符串的对象当前是 null,但在尝试调用其 hashCode() 方法时发生了空指针异常。

问题分析:

  1. 错误根源:当 compressed 设置为 true 时,uni-app 会尝试对选中的视频进行压缩。在压缩处理流程中,框架需要获取视频的某些属性(如输出路径、编码参数等)来构建参数。对于你提供的 576x1280 视频,可能在获取某个关键属性(如 mimeType、临时文件路径等)时失败了,导致一个本应为字符串的变量为 null,从而在后续的哈希计算或参数组装中崩溃。
  2. 尺寸差异:两个视频的主要区别在于分辨率(576x1280 vs 448x960)。分辨率更高的视频在压缩时,系统或压缩库可能需要不同的处理参数或更多的内存/计算资源。在这个过程中,如果视频的某些元数据读取异常,或者压缩器对特定分辨率、编码格式的视频兼容性不佳,就可能导致获取必要信息失败。
  3. 环境特定:此问题可能只在特定 Android 版本或机型上出现,与系统媒体库或硬件编解码器的实现有关。

解决方案:

  1. 设置 compressed: false:这是最直接的解决方法。不进行压缩,直接返回原始视频文件,可以避免触发压缩流程中的这个错误。如果业务允许,优先考虑此方案。
  2. 捕获异常并降级处理:在 uni.chooseVideofail 回调中捕获错误。当检测到此类压缩失败错误时,可以自动重试一次,但将 compressed 参数设置为 false,或给出提示让用户选择未压缩的视频。
  3. 检查视频文件本身:虽然可能性较低,但可以确认一下 576x1280 视频文件的完整性或编码格式是否特殊。尝试用其他工具重新编码该视频,再测试是否可以选择。
  4. 更新开发环境:确保你使用的 HBuilderX 是最新版本,以及 uni-app 编译器的版本也是最新的。有时这类底层兼容性问题会在框架更新中得到修复。

临时应对代码示例:

uni.chooseVideo({
    sourceType: ['album'],
    compressed: true, // 先尝试压缩
    success: (res) => {
        console.log('选择成功', res);
    },
    fail: (err) => {
        console.error('选择失败,尝试不压缩', err);
        // 失败后降级为不压缩选择
        uni.chooseVideo({
            sourceType: ['album'],
            compressed: false,
            success: (res) => {
                console.log('降级选择成功', res);
                // 此处可以添加提示,告知用户返回的是原始视频
            },
            fail: (err2) => {
                console.error('降级选择也失败', err2);
            }
        });
    }
});
回到顶部