uni-app 使用uni.chooseVideo选中IOS里【照片】的由本机拍摄的实际时长和展示时长不一致的视频时,会导致整个APP闪退

uni-app 使用uni.chooseVideo选中IOS里【照片】的由本机拍摄的实际时长和展示时长不一致的视频时,会导致整个APP闪退

示例代码:

uni.chooseVideo({  
    sourceType: ['album', 'camera'],  
    success: res => {  
        console.log('success', res)  
    },  
    fail: err => {  
        console.error('fail', err)  
    },  
});

操作步骤:

  • 用IOS手机(我们称为【手机C】) 拍摄一段视频,检查其播放时长和展示时长是否一致。我们保留放时长和展示时长不一致的视频作为测试数据,此数据我们称作【视频A】。
  • 打包一个可以调用uni.chooseVideo的APP在刚刚这台IOS【手机C】 上。授权使用所有的图片后,
  • 利用该APP调用uni.chooseVideo选择刚刚的测试数据 视频A。

预期结果:

  • 会打印出 success字符串和res , 或 fail字符串和错误err

实际结果:

  • 没有打印出任务的log,APP直接闪退。

bug描述:

  • 使用uni.chooseVideo选中 IOS 里【照片】的由本机拍摄的 实际时长和展示时长不一致的视频时,会导致整个APP闪退。
  • 如选中【图IOS1】展示时长0:01而实际播放【图IOS2】时长是0:04的视频。
  • 必须是 存在于本机【照片】的 由本机拍摄的视频。
  • PS: 当把本机隔空投送到其他手机,在其他手机同一个APP调用uni.chooseVideo是没问题的。此时,该视频在其他手机 实际时长和展示时长是一样的,都是 0:04.
  • 测试设备:iPhone12(ios15.1.1)、iPhone8(ios15.1)
信息类别 信息内容
产品分类 uniapp/App
PC开发环境 Windows
PC操作系统版本 Windows 10 专业版20H2
HBuilderX类型 正式
HBuilderX版本 3.2.16
手机系统 iOS
手机系统版本 iOS 15
手机厂商 苹果
手机机型 iPhone12、iPhone8
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

Image Image Image


更多关于uni-app 使用uni.chooseVideo选中IOS里【照片】的由本机拍摄的实际时长和展示时长不一致的视频时,会导致整个APP闪退的实战教程也可以访问 https://www.itying.com/category-93-b0.html

13 回复

没人解决这个问题 吗

更多关于uni-app 使用uni.chooseVideo选中IOS里【照片】的由本机拍摄的实际时长和展示时长不一致的视频时,会导致整个APP闪退的实战教程也可以访问 https://www.itying.com/category-93-b0.html


题主解决这个问题了没有

题主解决这个问题了没有

是否换一台手机测试过 拍摄的视频
我看你的截图视频信息中 hevc 视频时长 也是0.01

试过,我分别用 iPhone12、iPhone8拍的视频,如果时长和真实的不一致,就会产生这个问题。

你看一下倒数第二张视频截图,播放结束时是 0:04秒时长,这个是正确时长,和 hevc的是不一致的。

我用同一台手机 的微信选取同一个有问题的视频发送给好友,唤起微信 视频选取界面时,能够正常显示0:04这个时长。

而 HBUILDERX 打包的APP视频选取页,显示同一个视频的时长 是 0:01

不遇到根本不知道 题主解决了没有

还没解决吗

回复 b***@bansir.cn: 对啊,后续官方没有回复了。

这是一个已知的iOS系统原生API兼容性问题。当iOS设备拍摄的视频元数据中的展示时长与实际播放时长不一致时,调用系统相册选择器选择此类视频会导致应用崩溃。

问题根源: iOS系统相册选择器在返回视频信息时,会尝试读取视频的元数据。如果视频的实际播放时长与元数据中记录的展示时长存在差异,系统API在处理过程中可能出现异常,导致应用闪退。

解决方案:

  1. 临时规避方案:在调用uni.chooseVideo时,通过compressed参数启用视频压缩。压缩过程会重新编码视频,修正元数据不一致的问题。

    uni.chooseVideo({
        sourceType: ['album', 'camera'],
        compressed: true, // 启用压缩
        success: res => {
            console.log('success', res)
        },
        fail: err => {
            console.error('fail', err)
        }
    });
    
  2. 长期解决方案:建议在用户选择视频后,使用uni.compressVideo对视频进行统一压缩处理。这不仅能避免闪退问题,还能减少视频体积,提升应用性能。

    uni.compressVideo({
        src: videoPath,
        quality: 'medium',
        success: res => {
            console.log('压缩成功', res.tempFilePath)
        }
    });
回到顶部