前言:该教程用于UE4制作的vr作品导出全景图,再将序列帧的全景图合成全景360视频。为了加快渲染速度,修改了部分插件源码。
分享:先上一段测试合成的demo,15s。
youtube翻墙享用:https://youtu.be/AgOrS_F7SqA
准备工作:
1、UE4.18官方插件StereoPanorama,找到引擎安装位置(我这里的是E:\UnrealEngine\UE_4.18\Engine\Plugins\Experimental),将目录底下的StereoPanorama插件拷贝到工程Plugins目录下。如果是纯蓝图工程,可以在工程中新建一个c++类,然后生成sln文件,复制到创建的Plugins目录,vs2015/2017均可打开。将该插件备份,为了防止冲突并删除引擎下的该插件。
2、修改插件源码:由于插件自动渲染了左右眼,一般情况下,渲染一帧的画面需要30s,左右眼就是需要1分钟左右。我们在合成的时候,一般只需要左眼渲染出的图像,所以修改插件只渲染出左眼,提高效率。默认输出为PNG格式,修改为JPG。
下面会给出修改过后的插件源码链接,可以直接下载使用。
链接:https://pan.baidu.com/s/1ZbC4kXtjUzhtrzt3XumWdQ
提取码:aee7
也可自行修改,具体修改如下:Visaul Studio打开StereoPanorama\Source\StereoPanorama\Private\SceneCapturer.cpp
SceneCapturer.cpp在当前文档查找全部“righteye”,注释相关代码。
在当前文档查找全部“EImageFormat”(修改3处)
//TSharedPtr<IImageWrapper> ImageWrapper = ImageWrapperModule.CreateImageWrapper( EImageFormat::PNG);
修改为:
TSharedPtr<IImageWrapper> ImageWrapper = ImageWrapperModule.CreateImageWrapper( EImageFormat::JPEG );
在当前文档查找全部"CaptureName"
//FString CaptureName = OutputDir / Timestamp / Folder / TickString + TEXT( ".png" );
修改为:
FString CaptureName = OutputDir / Timestamp / Folder / TickString + TEXT( ".jpg" );
3、编译
打开Plugins\StereoPanorama\Source\StereoPanorama\StereoPanorama.Build.cs
添加代码:PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
StereoPanorama.Build.cs打开工程源码中\Source\TUKTAKMAN\TUKTAKMAN.Build.cs(我这里工程名是TUKTAKMAN),添加StereoPanorama模块。
TUKTAKMAN.Build.cs编译成功即可!
开始渲染
1、打开UE4工程,启用插件,需要重启工程。
启用插件2、渲染会根据场景中的摄像机位置进行360°渲染,所以可以配合sequencer或者Matinee使用,达到自动控制镜头的效果。
打开关卡蓝图,添加以下节点:
指定保存图片路径--开始渲染从0-30帧,30fps的话,大概就1s。默认输出为4096*2048的图片,如有需要可以根据情况添加如下命令
SP.OutputDir C:\Users\zhj\Desktop\Test //设置保存路径
SP.HorizontalAngularIncrement 2.0 //一张全景图,每次采集水平方向间隔
SP.VerticalAngularlncrement 30.0 //一张全景图,每次采集垂直方向间隔
SP.ConcurrentCaptures 6
SP.CaptureHorizontalFOV 90.0 //fov视角
SP.StepCaptureWidth 1024 //图片质量
SP.PanoramicMovie 0 120 //渲染帧数0-120帧,开始执行点为第0帧
说明:一般视频30fps,这里0-30帧指从开始执行渲染为0帧,并不是指程序运行的总帧。开始渲染会卡住,这个时候不要管它,一帧大概需要30s。可以看下保存路径下是否有输出图片。如果有,恭喜你成功了。如你需要渲染1分钟视频,帧率30fps.
修改为:SP.PanoramicMovie 0 1800
那么你需要时间大概为:30*60*30/3600=15H。
Capture蓝图你也可以根据官方教程(https://www.unrealengine.com/zh-CN/tech-blog/capturing-stereoscopic-360-screenshots-videos-movies-unreal-engine-4)修改,但是亲测官方给的节点,渲染效果不如默认如下:
3、打开项目设置Project Settings,将帧率锁定在30
Project Settings打开编辑器设置Editor Perferences,去掉勾选,这样挂机渲染的时候不会因为各种异常弹窗影响效率。
Editor Perferences合成全景视频:
1、渲染完成后,文件名会是这样连续的,注意一定是要连续的,等会我们用合成软件不连续(如:Left_00000.jpg,Left_00002.jpg),合成软件会报错说找不到Left_00001.jpg的图片。如果是在不同的主机渲染不同的片段(最后会讲)文件名重复,可以用批量重命名软件(最后会讲)。
渲染图片2、下载软件:ffmpeg
链接:https://pan.baidu.com/s/1iws0btpEQ4tzzERTIoqjeg
提取码:88jq
解压后,添加环境变量E:\ffmpeg\bin,我这里解压到E:\ffmpeg
环境变量3、测试ffmpeg
打开cmd,输入命令ffmpeg -version,显示如下图安装成功!
测试4、开始合成(亲测,6分钟视频大约需要合成30-40分钟)
可能也跟电脑配置有关系,自行评估,合成过程中会出现cpu 100%的情况
配置cmd输入命令:
ffmpeg.exe -framerate 30 -i E:\Capture\Left_%5d.jpg -c:v libx264 -profile:v high -level 4.2 -r 30 -pix_fmt yuv420p -crf 18 -preset slower E:\Capture\MyMovie.mp4
以上命令将E:\Capture\下命名以Left_00000.jpg为规则的图片,根据命名规则按顺序帧合成视频。这里也就是为什么前面说一定要按照命名规则必须连续的原因。
输出为30帧率,输出视频文件为MyMovie.mp4。
期待你的成果!
5、由于渲染效率的问题,需要多台机器合成。我这边的操作是分段计算出渲染帧数,每台机器开始渲染提前1S,渲染帧数加30帧。这样保留前后的30帧数,在合成之前先确定好衔接位置,然后用批量命名根据刚才说的命名规则进行连续命名后合成。
这里推荐用ACDSee9相片管理器,好用真香。可以自行在官网下载,也可直接用以下链接。
批量命名 批量命名ACDSee9相片管理器链接:https://pan.baidu.com/s/170wuOmfXRMSft-XzaQa_Hg
提取码:p2ux
资料:https://www.unrealengine.com/zh-CN/tech-blog/capturing-stereoscopic-360-screenshots-videos-movies-unreal-engine-4
https://www.jianshu.com/p/ddafe46827b7
网友评论