关于uniapp小程序压缩视频后上传云点播视频损坏这件事
-
问题起因
公司自研项目 技术栈是 uniapp 开发微信小程序 小程序内有个需要用户录制视频并上传的功能 项目内使用的是 uni.createCameraContext 相机组件进行录制视频的 一开始并没有出现什么问题 可以正常录制及上传 直到需求上多了一个 《视频直接上传过大 需要进行压缩处理再上传》 之后 问题就来了!本以为只是个简单的压缩罢了。想着直接使用uniapp提供的
uni.compressVideo
api就好了 接下来就是一顿操作 简单测试一遍 自信提交!下班!
uni.compressVideo({
src,
quality: 'low',
// bitrate:60000,
// fps: 30,
// resolution:1,
success: (res) => {
//压缩后处理
},
fail: (err) => {
//错误处理
},
});
-
问题初现
第二天到公司后 昨天测试测出问题了 发现压缩后上传的视频 在云点播上是损坏的 基本上播放到十秒左右 就会突然跳到结束 不压缩上传的话 就没有问题
然后就是不停的测,改,测,改,测…
整了一下午还是没搞好。 后来翻 uniapp 文档的时候 看到了在暂停录像api上 还有个属性compressed:启动视频压缩,压缩效果同 chooseVideo
抱着死马当活马医的态度换上了 然后一测 居然好了 那么新的问题又来了 既然文档上说压缩效果同 chooseVideo
为什么一个行一个不行呢。不过现在没时间想这个了 还有个问题就是 视频录制超时的话 是没有这个压缩的 而如果在超时之前自动暂停的话 又会导致录制时间可能不准确。后来经过讨论 还是决定先使用这个方法 只不过要把录制时间多加一两秒 尽量的保持准确。 -
新的问题
又是新的一天 在使用结束录制的compressed
属性暂时解决问题后 新的问题又来了 具体可看微信社区的bug反馈链接:开启compressed后,结束录制CameraContext.stopRecord无返回数据
简单来讲就是 开启了这个属性后 录制视频 第一次录制可以正常返回视频数据 但是从第二次开始 返回的数据就是null的 关闭这个属性后 数据正常
(这个bug现在好像已经修复了)
-
转机
在使用compressed
解决问题失败后 不得不另寻他路 在新建了一份代码片段 并将小程序内的功能在代码片段里实现后 我尝试将压缩后的视频直接在小程序内播放 发现:在想程序内播放 视频并无问题 下载后播放也没问题 将下载下来的视频放点电脑上 从电脑上在云点播后台上传 也没有问题!
从这可以得知 并不是小程序的压缩视频有问题 而是云点播的上传有问题 随后到云点播后台 找了人工客服 花费一下午时间 从客服那边拿到了一个不同版本的 SDK 将项目内的 SDK 替换后 发现问题解决了。
询问客服得知 云点播官方文档内的 SDK 下载链接可能并非是最新版的 最好到git仓库上下载
然后自以为问题解决 收工下班 -
再起波澜–结束
第二天上班时 得知昨天的问题并没完全解决
经过测试发现 压缩过的视频 只要超过8MB 还是会出现上述的视频损坏的问题 8MB之后的视频文件 全部上传不上去 视频直接被截断了 (大概是8MB 差不多两个月前了 有些记不清了)
然后打开昨天从客服那边拿到的新版本 SDK 源码 翻看了下源码 从源码中找到了getCosStrategy
函数 在这个函数内的sourceData
对象 里面的 ChunkSize 参数就是出现问题的地方了 将ChunkSize
参数改为1048576 * 30
问题就解决了 -
结论
视频压缩后上传损坏的问题可以确定是源码内的getCosStrategy函数下的sourceData对象的ChunkSize
值过小造成的将数值改为自己项目需要的大小即可。
最好还是不要改源码 直接在上传函数内传入自己需要的大小即可
VodUploader.start({
...
chunkSize:1024*1024*(MB)
...
})
其实腾讯上传SDK文档内有这个参数的描述
但是描述内写的是分块上传时 每块的大小 并没有写会限制整体上传的大小 所以导致从头到尾都把这个参数忽视了 还是后面翻了源码才找到了这个参数 感觉文档这里写的和实际上的不太一样 也有可能视频被压缩了的问题
总之 问题到此就结束了。
闲来无事 就想记录下这次遇到的问题 好让自己有点印象 不至于转头就忘了。
如果这篇文章有帮助到您 那是我的荣幸。如果没有帮助 那也感谢您能看到最后