Part1前言

在虚幻引擎程序运行时,如果将画面保存为mp4的文件?通过InVideo插件的一个函数即搞定。本文主要介绍其实现思路。

Part2UGameViewportClient

游戏视区(FViewport)是平台特定渲染、音频和输入子系统的高级抽象接口。GameViewportClient是引擎与游戏视口的接口。为每个游戏实例创建一个GameViewportClient。我们能看到的画面都可以通过重载Draw函数进行获取。

virtual void Draw(FViewport* InViewport, FCanvas* SceneCanvas) override;

获取画面的宽高,通过如下方法

int BitmapX = InViewport->GetSizeXY().X;int BitmapY = InViewport->GetSizeXY().Y;

获取画面的rgb数据,通过如下方法

SceneViewport->ReadPixels(Bitmap, FReadSurfaceDataFlags());

Part3opencv保存mp4

这里我们将获取到的rgb数据,先转成cv::Mat,在通过cv::VideoWriter进行写mp4。虚幻的图像数据转成cv::Mat格式如下

int length = Bitmap.Num() * 3;m_ImageBuf = new char[length];int count = 0;for (int i = 0; i < Bitmap.Num(); i++){m_ImageBuf[count] = Bitmap[i].B;m_ImageBuf[count + 1] = Bitmap[i].G;m_ImageBuf[count + 2] = Bitmap[i].R;count += 3;}cv::Mat img(m_ImageY,m_ImageX,CV_8UC3, (unsigned char*)m_ImageBuf);

这里需要特别注意,在生成Mat的时候需要设置为CV_8UC3格式。因为我们是rgb三种颜色。Mat不会重新创建一段内存,会复用之前的m_ImageBuf内存空间。如果要用Mat的内部内存管理机制,需要自己重新深拷贝一份。

auto newImg = img.clone();

有了Mat格式之后,我们就可以保存视频了,流程如下
先调用open

m_WrapOpenCv->m_VideoWriter.open(cvFilePath, cv::VideoWriter::fourcc('X', 'V', 'I', 'D'), m_Fps, cv::Size(m_ImageX, m_ImageY));

之后每一帧过来,都写进去

m_WrapOpenCv->m_VideoWriter.write(img);

结束之后,调用关闭命令

m_WrapOpenCv->m_VideoWriter.release();

Part4存在问题

上面的做法,是在游戏线程进行mp4文件的录制,这样最大的问题是会影响游戏的帧率,因为视频编码其实是一个非常耗费资源的事情,所以我们需要将其移植到子线程来。
这里引入了FRunnable和TQueue。FRunnable用来实现一个子线程,TQueue用来实现一个多线程安全的队列,方便我们进行数据在多线程的传递。
创建线程如下:

m_Thread = FRunnableThread::Create(this, TEXT("SceneRecord Thread"));

增加数据到队列

m_WrapOpenCv->m_ImageQueue.Enqueue(newImg);

子线程取出数据并处理

if (false == m_WrapOpenCv->m_ImageQueue.IsEmpty()){cv::Mat img;m_WrapOpenCv->m_ImageQueue.Dequeue(img);m_WrapOpenCv->m_VideoWriter.write(img);continue;}

Part5总结

本文主要实现了如何在运行时保存虚幻引擎的画面成mp4,考虑到视频编码对性能的消耗较大,我们将整个mp4视频的保存放到了子线程中进行,这样会游戏线程的帧率几乎没有影响。github地址如下:https://github.com/inveta/InVideo/ 欢迎点赞分享。

Part6关于IN VETA

IN VETA是一支由建模、美术、UE5组成的年轻团队。

我们的开源项目:
https://github.com/inveta

我们致力于三维数字孪生技术分享与研发。
欢迎与各界朋友一起探讨技术与商务合作,一起推动数字孪生的发展。

视频无法输出?来一键安装InVideo插件相关推荐

  1. ubuntu18.04 下firefox 不能 播放视频,因为默认未安装FLASH插件。(当然只是原因之一)

    ubuntu18.04 下firefox 不能 播放视频,默认未安装FLASH插件 终端输入: sudo apt-get install flashplugin-nonfree

  2. python一键安装所有插件_python 离线安装插件包

    利用 pip install 包名.wql 安装插件包 1.首先安装pip cd pip1.5.5 python setup.py install [root@wireless-hadoop01 wa ...

  3. pr抖动插件_某宝价值135元的PS/AE/PR全套插件合集,一键安装,大神必备这一套就够了【第10期】...

    大家好我是万能的爱丽丝酱 AE.PR.PS一键安装插件合集是一款AE PR的全套插件一键安装包,一键安装AE插件.pr插件.ps插件,插件在学习中是必备的!能大大提高你的工作和学习效率!然而日常安装比 ...

  4. 全新C4D必备插件合集他来啦傻瓜式一键安装

    C4D相信大家都不陌生了!就像是摄影界的视频领域,是设计界的最新视觉表达形式!现在几乎所有电商.电影.海报等等都会用到他! C4D也和PS一样拥有非常丰富的插件群来完成诸如建模,材质,灯光,绑定,动画 ...

  5. mac磨皮插件_Adobe Pr 黑科技插件合集,一键安装,Mac+Win

    今天再给大家带来一套PR全套插件合集包,视频剪辑后期必备,加倍提升工作效率,你见过的听过的,它都有,总共9000+款,拥有神器小白也能轻松剪出大神范!大家可以按需安装 支持WIN系统 :PR CC20 ...

  6. ae导出gif插件_AE脚本-一键快速输出GIF动图格式插件脚本 GifGun 1.7.15 Win/Mac 支持AE 2020...

     [脚本简介] 还记得以前AE能直接输出GIF动画格式,但软件更新到 AE CS5 后就取消了直接输出GIF的功能,其实很多时候还是会用到输出GIF格式的这个格式.GifGun 脚本可以一键输出G ...

  7. 一键安装lamp之php插件

    #!/bin/sh ##一键优化lamp之php #安装eaccelerator缓存加速器 cd /home/lvnian/tools tar jxf eaccelerator-0.9.6.tar.b ...

  8. CentOS Firefox播放视频--安装Flash插件

    在CentOS中自带的火狐浏览器不能在线看视频.听音乐,一般是因为没有安装flash插件, 下面是在网上找的配置步骤,备用. 1.下载flash插件(选择.tar.gz版本): http://down ...

  9. android 播放网络Flash视频 ,需要手机已安装Adobe Flash插件

    private void useAdobeFlashPlayVideo(String url){if( ! checkAdobeInstall()){Toast.makeText(this, &quo ...

最新文章

  1. 旷视MegEngine基本概念
  2. mysql init-file参数中语句限制
  3. 谁说LINQ复杂查询不支持返回实名类型~复杂结果集中再使用复杂结果集
  4. 鼠标绘图 c语言,c语言高级编程技术教程 图形显示方式与鼠标输入.doc
  5. Oracle数据类型与.NET中的对应关系
  6. invalid substring parameter in My Opportunity account determination
  7. 怎么查看java的引用类_一段代码看 Java 引用类型
  8. python按行读取文件取消空白行_在Python中读取文件时忽略空行的最简单方法
  9. 【今日CV 视觉论文速览】Wed, 6 Feb 2019
  10. 平衡小车之家_人教版高中物理必修一 专题 共点力作用下的动态平衡 公开课优质课课件教案视频...
  11. 【2】puppet笔记 - package、service、user资源
  12. 简析语音识别技术的工作原理
  13. java字符常量_字符常量 java
  14. 中文字体库转换成16X16点阵 另外附上ASCII码转换8X16点阵
  15. X86和X64的区别
  16. EXCEL工作表保护密码破解
  17. NShape(开源矢量图形编辑器) 入门(一)
  18. java文件上传像素限制,JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
  19. 彻底解决Tensorflow2.0 使用tensorflow_datasets出现unbalanced parenthesis错误
  20. 企业微信如何发成绩给家长-Leo老师来教你

热门文章

  1. 单向测径仪的知识介绍
  2. 分析Flex布局空间分配, flex-grow、flex-shrink,flex-basis
  3. 直播技术的祖师爷是谁?| 历史上的今天
  4. vscode 选择python解释器
  5. smarty php5.5,thinkphp5.1使用Smarty模板引擎
  6. 【SEO工具】抓取百度关键词相关关键词挖掘工具
  7. Win11系统安装flashcs6无法使用解决方法
  8. js正则 匹配 汉字、数字、英文字母、下划线 的 正则表达式
  9. “新基建”呼唤数据中心“整合者”
  10. 使用CMD满速下载百度云