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
视频下载到本地,测试没问题,压缩正常,未复现上述问题。
更多关于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() 方法时发生了空指针异常。
问题分析:
- 错误根源:当
compressed设置为true时,uni-app 会尝试对选中的视频进行压缩。在压缩处理流程中,框架需要获取视频的某些属性(如输出路径、编码参数等)来构建参数。对于你提供的 576x1280 视频,可能在获取某个关键属性(如mimeType、临时文件路径等)时失败了,导致一个本应为字符串的变量为null,从而在后续的哈希计算或参数组装中崩溃。 - 尺寸差异:两个视频的主要区别在于分辨率(576x1280 vs 448x960)。分辨率更高的视频在压缩时,系统或压缩库可能需要不同的处理参数或更多的内存/计算资源。在这个过程中,如果视频的某些元数据读取异常,或者压缩器对特定分辨率、编码格式的视频兼容性不佳,就可能导致获取必要信息失败。
- 环境特定:此问题可能只在特定 Android 版本或机型上出现,与系统媒体库或硬件编解码器的实现有关。
解决方案:
- 设置
compressed: false:这是最直接的解决方法。不进行压缩,直接返回原始视频文件,可以避免触发压缩流程中的这个错误。如果业务允许,优先考虑此方案。 - 捕获异常并降级处理:在
uni.chooseVideo的fail回调中捕获错误。当检测到此类压缩失败错误时,可以自动重试一次,但将compressed参数设置为false,或给出提示让用户选择未压缩的视频。 - 检查视频文件本身:虽然可能性较低,但可以确认一下 576x1280 视频文件的完整性或编码格式是否特殊。尝试用其他工具重新编码该视频,再测试是否可以选择。
- 更新开发环境:确保你使用的 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);
}
});
}
});

