Open 1169927533 opened 2 years ago
这几天遇到类似的情况,回复一下做记录,给后面的人做下参考吧 2.6.1版本上做的测试,本人的情况 大部分的情况,其实都是因为带音频解析时候,造成的问题 PS:源码使用的soundpool来播放音效,但是安卓系统硬编码只支持1M缓存,大概可以理解成就是svga内置的音频不能超过1M,这个问题可以参考下面这个issue解决,最新版本里面也已经整合了,使用最新版本的api,传入playCallback参数,自己使用mediaplayer去播放音频即可 https://github.com/svga/SVGAPlayer-Android/pull/380
另外我遇到的情况,不知道是因为svga的不规范还是什么原因,解析出来的带音频的svga信息中,音频的totalTime为空,而源码中的SVGAVideoEntity类中有这么一句
if (totalTime.toInt() == 0) { // 除数不能为 0 return item }
就导致也不会调用上述代码之后的playCallback,而导致画面不显示,音频也没有的情况
以上描述的方式,我的处理,是通过将上述的代码行先注释掉,然后在后续的代码中,修改为下列的代码,重点是将totalTime默认为0来进行处理,这样就可以解决我个人的情况 主要是这一行代码修改 *val offset = ((if (totalTime.toInt() == 0) 0 else startTime / totalTime).toInt() length).toLong()** 避免totalTime为null就不回调playCallback的情况
audiosFileMap[audio.audioKey]?.let { file -> FileInputStream(file).use { val length = it.available().toDouble() **val offset = ((if (totalTime.toInt() == 0) 0 else startTime / totalTime).toInt() * length).toLong()** if (SVGASoundManager.isInit()) { item.soundID = SVGASoundManager.load(soundCallback, it.fd, offset, length.toLong(), 1) } else { item.soundID = soundPool?.load(it.fd, offset, length.toLong(), 1) } } }
最后这种方法处理解决成功之后,发现还是会有音频播放只有五六秒的问题,就是前面说的问题了,这里就只能使用mediaplayer,参照上面的issue,使用最新的api传入playCallback就可以了
自己fork按照我上述的修改源码,或者等待作者发布新版本解决即可
还有最后一种甩锅的方案: https://stackoverflow.com/questions/43060791/android-soundpool-can-only-play-6-seconds-mp3 其中的回答,提供了如何让soundpool支持比较长的音频的情况,因为本质是1M缓存的限制,所以svga文件制作时,使用占用量比较小的格式,或者压缩之类的方式,让音频文件低于1M,应该也是可以解决的
至于totalTime为null就不回调也不往下执行,这个暂时不确定是解析问题还是导出的svga文件本身问题,暂时没找到解包工具可以直接解包看文件配置文件的,后续有继续跟进了再补充了
这几天遇到类似的情况,回复一下做记录,给后面的人做下参考吧 2.6.1版本上做的测试,本人的情况 大部分的情况,其实都是因为带音频解析时候,造成的问题 PS:源码使用的soundpool来播放音效,但是安卓系统硬编码只支持1M缓存,大概可以理解成就是svga内置的音频不能超过1M,这个问题可以参考下面这个issue解决,最新版本里面也已经整合了,使用最新版本的api,传入playCallback参数,自己使用mediaplayer去播放音频即可 https://github.com/svga/SVGAPlayer-Android/pull/380
另外我遇到的情况,不知道是因为svga的不规范还是什么原因,解析出来的带音频的svga信息中,音频的totalTime为空,而源码中的SVGAVideoEntity类中有这么一句
就导致也不会调用上述代码之后的playCallback,而导致画面不显示,音频也没有的情况
以上描述的方式,我的处理,是通过将上述的代码行先注释掉,然后在后续的代码中,修改为下列的代码,重点是将totalTime默认为0来进行处理,这样就可以解决我个人的情况 主要是这一行代码修改 *val offset = ((if (totalTime.toInt() == 0) 0 else startTime / totalTime).toInt() length).toLong()** 避免totalTime为null就不回调playCallback的情况
最后这种方法处理解决成功之后,发现还是会有音频播放只有五六秒的问题,就是前面说的问题了,这里就只能使用mediaplayer,参照上面的issue,使用最新的api传入playCallback就可以了
自己fork按照我上述的修改源码,或者等待作者发布新版本解决即可
还有最后一种甩锅的方案: https://stackoverflow.com/questions/43060791/android-soundpool-can-only-play-6-seconds-mp3 其中的回答,提供了如何让soundpool支持比较长的音频的情况,因为本质是1M缓存的限制,所以svga文件制作时,使用占用量比较小的格式,或者压缩之类的方式,让音频文件低于1M,应该也是可以解决的
至于totalTime为null就不回调也不往下执行,这个暂时不确定是解析问题还是导出的svga文件本身问题,暂时没找到解包工具可以直接解包看文件配置文件的,后续有继续跟进了再补充了