〇、问题描述
做实验验证的时候,需要在CARLA仿真环境中添加一个可以播放视频的功能,查了很多现有的实验,基本都是插入图像,而对于插入视频,实现的方法就很麻烦了。一开始考虑的是直接用射影变换进行叠加,计算出给定时刻的视频的帧,然后用射影变换将帧投影到采集的环境图像中,但是这种投影很难体现出场景中的光照信息,而且标记每一帧的投影矩阵的开销太大了,所以这里尝试了一下用UE4的组件来向CARLA中添加可以播放视频的组件。
一、调试流程
先说一下整个实现的大体流程,首先将需要播放的视频导入到工作目录下,创建媒体播放器组件并测试能否播放该视频,之后利用该媒体播放器生成媒体纹理,再将媒体纹理应用在材质上,最后利用静态网格体或者蓝图类加载这个材质包。
加载视频
打开CARLA后,下方会有一个叫做内容浏览器的界面,这个里面是预设好的一些CARLA的内容,我们可以直接在其中操作。创建文件夹后,点击左上角的导入-导入资产,将需要的视频加载到这个路径下,之后才可以用CARLA读取这个视频。下图中1_converted就是导入的视频。
创建媒体播放器
在内容浏览器中右键媒体-媒体播放器,可以创建一个媒体播放器组件,创建时会弹出一个窗口,提示你同步创建视频纹理,这里要选输出媒体纹理资产,这样就会同步创建好上图中红色的两个组件。
之后双击创建好的媒体播放器,这个界面中会展示你当前目录下所有导入的视频,双击视频可以预览。
需要注意,这里并不是所有的视频都可以加入进来,因为我用的是Ubuntu版本的CARLA,并不是所有的视频插件都安装好了的,查了一圈发现最好还是用webm格式的视频,而且需要调整码率。如果不能播放,打开carla的控制台会提示报错,大体的报错内容就是缺少XX插件,无法播放视频。这里我使用的是FFmpeg 将MP4视频转换为WebM格式,转码可以使用下面的指令。
ffmpeg -i "1.mp4" -c:v libvpx -b:v 1M -c:a libvorbis "1_converted.webm"
成功打开视频后的界面如下,此时选择左上角的保存即可完成媒体播放器的设置,右下角的打开时播放记得勾选,这样子我们可以在加载CARLA场景后就进行视频播放。
生成媒体纹理
双击内容浏览器中的媒体纹理,由于我们刚才勾选了同步生成,所以这里默认的设置是设置好的,只要确定右边的媒体播放器正确一般不会出什么问题。
应用材质文件
接下来我们需要的是将创建好的媒体纹理变成材质包,这样才可以加载到物体上。在内容浏览器中右键创建材质,之后双击进入材质的设置文件中。在材质编辑器中,右键点击空白区域,搜索并添加 Texture Sample 节点,在这个节点的设置细节中,将纹理属性设置为之前保存的媒体属性。
之后将 Texture Sample 节点的 RGB 输出连接到自发光颜色的输入端。这里补充一点,如果直接连接,可能会出现视频效果不清楚的问题,这里的解决方法是放大媒体纹理的RGB输出,添加一个乘法节点。最终的节点连接如下:
设置前后的效果对比如下,左边的发黑的立方体是直接连接的,而右边的立方体是放大150倍之后的效果。
导入到场景
导入到场景其实有两种方法,用实例以及用蓝图,个人的理解是实例需要手动拖到场景中的,而蓝图则可以保存然后用代码导入到场景中。
实例实现起来最简单,从左上方的放置actor中拖一个需要的actor,然后再设置中将材质设置为刚才我们保存的材质,由于在导入视频是我们勾选了自动播放,所以这里可以直接实现启动场景就开启播放视频。
蓝图的实现就要复杂一些了,还是在内容浏览器中右键新建一个蓝图类,之后双击进入蓝图的编辑器。首先在右上角的组件一栏中点击添加组件,选择静态网格体组件,添加好的静态网格体会出现在下方,双击静态网格体,右边会出现具体的属性设置,这里需要修改两项内容:静态网格体和材质。前者是选择添加什么样子的物体,后者则是将我们设置的媒体材质放置在物体表面。
之后为了让视频自动播放,蓝图类需要设置事件图表,具体的原理我也解释不太清楚,这里放一下CHATGPT的推理结果:
这里补充几个容易出问题的地方,首先是汉化问题,如果你的CARLA也是中文版,有些地方会和上图的名称不一样,Open Source对应的中文名叫“打开源”,Play对应的中文名是“播放”,而且是媒体播放器那一栏里面的播放。其次是在搜索组件时,可能会搜不到,这时候需要把搜索栏右边的情景关联关掉,这个东西会过滤掉很多系统认为你用不到的组件,但实际你需要这些组件。最后整个的事件图表如下:
最终测试
完成这一切之后,我们就可以从内容浏览器中拖拽物体到场景中了,点击运行只后找到我们拖拽进去的物体,就可以发现物体的表面就是我们导入到视频,会自动播放。