unity学习笔记Avpro问题啰嗦一下回到主题问题核心解决思路有关avpro插件使用的一些注意事项Avpro如题,Avpro是使用unity的大神们写的播放视频的插件,使用这个
Avpro 如题,Avpro是使用unity的大神们写的播放视频的插件,使用这个插件可以快捷的对视频进行播放暂停进度条的操作,可以说十分的便利 他的功能在官方的package导入之后有详细的说明,这里就不多说太多 这里就讲一个打包到安卓的注意事项 这个可能可以帮助到很多的兄弟们
问题 啰嗦一下 项目要求在移动端的界面里能够播放视频 以前的流程就是直接通过uniwebview的插件在unity里进行显示 但是老板说这样体验太差了,所以同事在网上搜到了avpro这个插件,将他放在3d的场景中,视觉效果确实提高了很多 但是! 同事做出的demo是在pc上运行的,所以即便能播放本地视频和在线视频都不意味着在安卓里是能一样正常运行的 不过当时我也确实没啥时间去研究这个,而且当时还不确定这个要放在初测的内容里,所以就没多留意 现在确定这个要放在初测里,就得先知道这个插件打包到安卓上是不是能正常跑通
回到主题 打包到安卓的时候发现,诶,好家伙为毛会报错 明明在pc上能正常跑的呀 于是乎在百度搜索了几个小时,期间对问题的逻辑是 1可能是版本问题:于是看了一下百度上的人说的,他们也有这个问题,打包到安卓的时候无法正确显示,但他们是本地的视频,和我在线的好像没太大关联,也没有人说版本(猜测可能是正版太贵了,大家都是在摸索的阶段所以都不去尝试新版本),毕竟这个插件unity官方售价是800美元,rmb就是五千了,并且有的人帖子里版本不高也能播放,所以基本可以排除是版本问题 2配置的参数不对:可能打包到安卓的话需要在插件上修改一下参数,百度了都是一些奇奇怪怪的方法,比如把自动播放和自动打开设为false(讲道理,小弟没嘣住)但还是毅然决然的试了一下这些参数(真香),还是没用(可恶,就不应该相信) 3安卓源码:这个思路的概括有点笼统,大概意思就是在看了这个插件的一些调用逻辑和代码之后,我感觉他的底层其实还是用的安卓去实现的,看到里面的androidobject等等的类就说明还是在安卓里封装好了api,在c#上调用的 那么,顺着这个思路我去as里看手机上跑这个项目的日志,发现出现了和上面报的异常相类似的异常 (提多一嘴)打包成安卓的项目其实在unity里看日志是不太清楚的, 他之后打印简单的异常信息,详细的信息个人建议在as之类的查看比较好,他吐露的信息更多 那么怎么修改呢
问题核心 回到前面,于是我决定定位到"Android 8 and above require HTTPS by default, change to HTTPS or enable ClearText in the AndroidManifest.xml"这个异常上 这个异常还满熟悉的(之前用其他插件和自己的jar包的时候也有出现过),不过一开始我没反应过来,为了证实确实是这个http的问题,于是我在网上找了一个https的在线视频网址,导出打包,发现,诶!可以正常播放了! 这直接说明了就是http和https的锅(本质上安卓版本的问题) 安卓在8后面的更新已经默认要求请求的时候是https了(为了安全),他配置了一个属性去拦截了请求,如果是http开头的话会直接拦截,所以我们需要把这个默认的属性给他修改一下 那么有关http和https的拦截的属性是什么呢
android: usesCleartextTraffic= "true"
就是这个啦
解决思路 将usesCleartextTraffic的属性设置为true 修改unity打包成安卓时的androidmainfest.xml文件 这里有三种情况 第一种是项目里已经开启了相关的权限,就比如我们现在的项目里在前面为了访问图灵的接口和配合另一个接口的http请求,已经在自己写好的jar包里开启了这个权限,所以就可以直接忽略这个问题(这个可以看我之前开启麦克风权限的帖子) 第二种是项目刚刚建出来,啥都没有的时候,需要在项目的assets目录里创建Plugins,在这文件里创建Andriod文件 具体可以参照这个大佬的帖子操作
https://blog.csdn.net/newchenxf/article/details/119423042
然后先把项目设为安卓环境打一次包 打包成功后找到项目的这个路径 Temp\gradleOut\src\main\AndroidManifest.xml 然后把这个xml文件放到前面创建好的Android文件夹里 然后在里面添加前面说的那个属性 添加在哪里呢? 加到红框里的位置即可 然后就可以打包,只要你的路径是正确的就可以正确访问啦
第三种情况:项目里已经有AndroidManifest.xml,这个就更简单了,省了第二种方法的打包拖入的操作,直接打开就可以了 不过这里其实也分了两种情况的 第一种就是为啥你会有这个文件呢,其实就是你用了某一个插件他用到了安卓的内容,如果那个插件需要获得一些权限的话就一定会需要在项目里添加这个文件,所以你的项目里就会有这个文件啦 第二种就是虽然插件他确实需要调用一些权限,也确实是写了开启权限的配置文件 但是吧,他是用反射来实现的(比如uniwebview4),有的插件可能是为了安全还是怎么的通过自己模拟了xml的格式去写了一个c#版本的AndroidManifest.xml去配置那些权限 那么如果是这样的话就只需要照着它的书写方式依样画葫芦的添加你需要的权限就好啦!
至此本篇完结, 哦也 解决问题的感觉真爽,哇哈哈哈哈
2021.10.23更新
有关avpro插件使用的一些注意事项 我使用的是avpro1.11版本,不知道后面更新的版本有没有解决 第一个需要注意的就是有关playersetting里的graphics api的设置 1.11版本的是必须要在opengle的环境下才能正常播放视频的 查了很多的文章和视频,发现好像是插件对视频的解码方法只支持opengles3,自己试了也发现是这样(当然其实插件在使用的时候也会提醒你需要去掉vulkan) 所以如果你的项目里需要播放流媒体,而且不需要使用到vulkan的话,那么就不需要注意这个问题 vulkan在看unity官方视频里说是这个api能很大程度的优化性能,好像大厂用的比较多,unity官方在视频里也有说vulkan是2016年出的,较新的图形处理api,兼容性没那么强 第二就是vulkan的时候需要使用者和开发者共同协调的去配合才能达到优化性能的结果,但对于更多的游戏开发来说,效率和时间意味着一切,所以更多的会直接采用已经很熟悉的opengle 扯远了
那么什么时候会用到vulkan呢,我们的项目里使用了vfx制作特效,而这个特效好巧不巧需要的api就是vulkan(或者说安卓端需要的api需要是vulkan,因为在pc端没有这个问题) 那么怎么能同时满足使用这两个api呢,答案是不知道 avpro官方目前好像还没有做有关vulkan支持的更新,而vfx如果不在vulkan的条件下出来的效果会差很多 以我目前的能力能想到的解决方案就是使用别的插件实现视频播放的效果,保留vulkan 在思考的时候,想起之前使用的uniwebview插件,他可以直接播放网页上的视频,那么其实问题就比较好解决了 通过uniwebview这个插件模拟播放视频的效果就可以了 不过顺着网下想,为什么uniwebview他就支持,而avpro不支持呢 查看相关文章和两个插件的源码的时候,发现他们的底层都是调用了安卓原生的webview去实现的,这样就很奇怪了 但是能力和时间原因没有往下证实自己的一些猜想, 感觉可能是他们使用的场景不一样,uniwebview是在unity里打开了网页,然后在网页里播放的视频,说明网页的框架他是支持通过vulkan,或者说是通过安卓底层的编码格式去解析编码视频的*感觉后者的可能性更大一点,也就是说编码和解码视频的手段uniwebview自己不实现,而是交给安卓本身的webview去实现 而avpro应该是先通过webview去获得视频数据,然后自己去调用opengle的api去把数据显示到unity上的,他比uniwebview更简单粗暴一点,他只负责读取视频,而uniwebview则负责显示网页 当然主要还是两者的领域不同,avpro还能做直播等流媒体的实时处理,可能比uniwebview功能更多,更稳定一些 啰嗦这么多其实就是avpro这个插件目前在安卓环境下还不能兼容vulkan的api格式 如果想在vulkan环境下播放视频的话,要么用uniwebview插件去显示视频,要么自己在安卓里写一个webview的jar或者sdk放在unity里调用,或者自己实现在unity里通过vulkan解析编码解码视频数据…