svga / SVGAPlayer-Android

Similar to Lottie. Render After Effects / Animate CC (Flash) animations natively on Android and iOS, Web. 使用 SVGAPlayer 在 Android、iOS、Web中播放 After Effects / Animate CC (Flash) 动画。
http://svga.io
Apache License 2.0
3.23k stars 484 forks source link

最新版本的setOnLoadCompleteListener不会回调的问题依旧存在 #441

Open 1169927533 opened 2 years ago

jack-smith commented 1 year 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文件本身问题,暂时没找到解包工具可以直接解包看文件配置文件的,后续有继续跟进了再补充了