UE 录屏自动化上传阿里云OSS

前言

       最近在做一个功能,然后就发现了一个很有趣的东西,虽然在一定程度上属于偷懒,但是在一些短频快的应用中还是很适用的,下面我就针对于这个测试做一些简单的分享,希望帮助到大家,在实际的开发中获得一些灵感和帮助,具体的实现方式,UE通过Texture2D将每一帧的图片存储到本地,存完以后调用一个本地PythonEXE执行文件进行视频封装和OSS上传,我这里使用的版本UE5.3,大家根据代码自己调试下。

UE开发调试过程

  1. 新建一个带有C++内容的项目,因为有一些代码功能需要用到C++,我这里的名称因为创建过了所以有个提示。
  2. 然后在Edit -> Plugins -> Add点击新建一个BlueprintLibeary的插件,因为我个人写一些封装性功能的时候喜欢用插件,这样其他的项目用到的时候直接导入调用就可以了,如果你想在类里面使用的话创建一个BlueprintFunctionLibrary的类就可以了。
  3. 创建完插件后,会在VistualStudio中提示,直接点全部加载,然后点击全部保存关闭项目,因为有时候有些编译会有问题,在UE和VS都关闭的状态下,在你的工程根目录打开sln的VS主文件,我们直接进行操作
  4. 接下来在插件中TextureVideoBPLibrary.h和TextureVideoBPLibrary.cpp中,我们添加两个功能,打开.h文件将原有的函数进行删除然后添加我们新的函数
    // Copyright Epic Games, Inc. All Rights Reserved.#pragma once#include "Kismet/BlueprintFunctionLibrary.h"
    #include "TextureVideoBPLibrary.generated.h"/* 
    *	Function library class.
    *	Each function in it is expected to be static and represents blueprint node that can be called in any blueprint.
    *
    *	When declaring function you can define metadata for the node. Key function specifiers will be BlueprintPure and BlueprintCallable.
    *	BlueprintPure - means the function does not affect the owning object in any way and thus creates a node without Exec pins.
    *	BlueprintCallable - makes a function which can be executed in Blueprints - Thus it has Exec pins.
    *	DisplayName - full name of the node, shown when you mouse over the node and in the blueprint drop down menu.
    *				Its lets you name the node using characters not allowed in C++ function names.
    *	CompactNodeTitle - the word(s) that appear on the node.
    *	Keywords -	the list of keywords that helps you to find node when you search for it using Blueprint drop-down menu. 
    *				Good example is "Print String" node which you can find also by using keyword "log".
    *	Category -	the category your node will be under in the Blueprint drop-down menu.
    *
    *	For more info on custom blueprint nodes visit documentation:
    *	https://wiki.unrealengine.com/Custom_Blueprint_Node_Creation
    */
    UCLASS()
    class UTextureVideoBPLibrary : public UBlueprintFunctionLibrary
    {GENERATED_UCLASS_BODY()UFUNCTION(BlueprintCallable, meta = (DisplayName = "SavePixtureToFile", KeyWords = "Save Pic To File"), Category = "TextureVideoTesting")static bool SavePicToFile(UTextureRenderTarget2D* rt, const FString& fileDestination);UFUNCTION(BlueprintCallable, meta = (DisplayName = "OpenExeVideo", Keywords = "Open Exe Video"), Category = "TextureVideoTesting")static bool OpenExe(FString URL);
    };
    
  5. 在cpp文件中我们添加以下逻辑,大家看到这里的时候基本已经知道了这两个函数的作用一个是存储图片一个是打开exe
    // Copyright Epic Games, Inc. All Rights Reserved.#include "TextureVideoBPLibrary.h"
    #include "TextureVideo.h"
    #include "Engine/TextureRenderTarget2D.h"
    #include "Misc/FileHelper.h"
    #include <ImageUtils.h>UTextureVideoBPLibrary::UTextureVideoBPLibrary(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer)
    {}bool UTextureVideoBPLibrary::SavePicToFile(UTextureRenderTarget2D* rt, const FString& fileDestination)
    {FTextureRenderTargetResource* rtResource = rt->GameThread_GetRenderTargetResource();FReadSurfaceDataFlags readPixelFlags(RCM_UNorm);TArray<FColor> outBMP;for (FColor& color : outBMP){color.A = 255;}outBMP.AddUninitialized(rt->GetSurfaceWidth() * rt->GetSurfaceHeight());rtResource->ReadPixels(outBMP, readPixelFlags);FIntPoint destSize(rt->GetSurfaceWidth(), rt->GetSurfaceHeight());TArray<uint8> CompressedBitmap;FImageUtils::CompressImageArray(destSize.X, destSize.Y, outBMP, CompressedBitmap);bool imageSavedState = FFileHelper::SaveArrayToFile(CompressedBitmap, *fileDestination);return imageSavedState;
    }bool UTextureVideoBPLibrary::OpenExe(FString URL)
    {FProcHandle ExeHandle = FPlatformProcess::CreateProc(*URL, nullptr, true, false, false, nullptr, 0, nullptr, nullptr);bool ret = FPlatformProcess::IsProcRunning(ExeHandle);return ret;
    }
    
  6. 然后对项目进行清理和重新生成,如果重新编译的过程中出现了报错,别管他,全部保存,然后关闭VS再重新打开再次编译生成即可。编译后打开我们的UE,在UE插件的Content文件中我们可以创建一个BP文件夹放置我们的一些文件,鼠标右键在Texture中创建一个RenderTarget文件用来进行渲染UE画面
  7. 双击打开我们的RenderTarget,将SizeX和SizeY进行调试,这是我们最终生成图片的比例,但是这块,大家要实际和电脑性能进行以下调试,因为图片分辨率越大输出渲染占用的资源就越高,所以这块自己在用的时候要注意下。
  8. 新建一个Actor,我这里用的画面是一个角色,所以我就创建了一个Character类型的Actor,这块根据自己需求不需要的话,就创建一个基础的Actor就可以,打开新建的Actor,在Add中添加一个SceneCaptureComponent2D组件,我这里都在一起所以我直接就调整了它们之间的位置关系,如果你这块是不需要的话,那你直接把Actor拖拽到场景中调整位置关系即可,然后点击SceneCaptureComponent2D组件,细节中的TextureTarget设置为刚才创建的RenderTarget
  9. 现在插件功能开发和基础的设置就已经做完了,接下来我们开始进行调试我们的功能,考虑到后续UE可能进行打包操作,这块的路径我就直接设置为插件路径,在插件目录下创建了一个VideoInDEP的文件下面有三个文件Image;Video;Data,Image和Video就是存放我们的缓存图片和缓存视频,Data是可调整的一个参数文件,EXE为调用执行的文件
  10. 在事件开始运行时,我们对图片还有EXE进行了变量存储,这的SetActorHiddenInGame作用是为了隐藏项目运行可能会出现一个控制器小球,然后ImagePath和VideoPath创建两个字符串的变量进行连接即可
  11. 现在开始图片存储功能通过一个事件委托,我们调用SavePixtureToFile的函数节点,将其进行设置Rt是我们创建的RnderTarget,Timer提示为变量这个变量作用是在关闭的时候断开捕捉存储图片用的,新建一个int变量初始值为0,然后作为图片下标进行使用,接下来你就可以测试第一个功能图片存储,直接调用SaveImage自定义事件,在我们的插件对应的路径下你就会看到你生成的图片,这里time为0.04秒,就是40毫秒,也就是一秒25帧。
  12. 第二个功能打开EXE,这块你可以先随便找个exe进行测试只要路径填写对就可以测试

 Python开发流程

  1. 我这用的最新的Pycharm写的,不会Python的也没关系我后面会把插件还有EXE链接放到下面的直接下载也能用,新建一个工程和一个py文件命名为VideoToOSS,这里oss的包的装以下,直接终端pip install oss2就行,有其他包的环境如果提示没有的话记得也装一下,代码
    #ImageToVideo
    import cv2
    import os
    import sys
    import glob#数据上传
    import oss2
    import jsondataPath = os.path.dirname(os.path.realpath(sys.executable)) + '\\Data\\data.json'def ImageToVideo(ImagePath,VideoPath,Fps,PngImage):print('This is PNG Path:',ImagePath)print('This is Video Path:',VideoPath)fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')  # 设置输出视频为mp4格式# size要和图片的size一样,但是通过img.shape得到图像的参数是(height,width,channel),# 可以实现在图片文件夹下查看图片属性,获得图片的分辨率size = (1024, 768)video = cv2.VideoWriter(VideoPath, fourcc, Fps, size)  # 设置保存视频的名称和路径,默认在根目录下file_lst = os.listdir(ImagePath)count = 0for filename in file_lst:img = cv2.imread(ImagePath + 'TextureImage' + str(count) + '.png')count += 1video.write(img)video.release()delete_all_pngs(PngImage,VideoPath)
    def delete_all_pngs(folder_path,Video_Path):# 使用glob查找文件夹下所有的.png文件png_files = glob.glob(os.path.join(folder_path, '*.png'))# 遍历并删除找到的文件for png_file in png_files:try:os.remove(png_file)#print(f"已删除: {png_file}")except OSError as e:print(f"删除失败: {png_file} - {e.strerror}")print("This set of data has now been deleted!")VideoToOSS(Video_Path)def JsonToStr(JsPath):with open(JsPath, 'r', encoding='utf-8') as file:json_data = json.load(file)return json_dataprint(json_data)def VideoToOSS(VideoPath):access_key_id = JsonToStr(dataPath)['access_key_id']access_key_secret = JsonToStr(dataPath)['access_key_secret']endpoint = JsonToStr(dataPath)['endpoint']bucket_name = JsonToStr(dataPath)['bucket_name']object_name = JsonToStr(dataPath)['object_name']  # OSS上的对象路径和名称local_file = VideoPath# 创建Bucket的句柄auth = oss2.Auth(access_key_id, access_key_secret)bucket = oss2.Bucket(auth, endpoint, bucket_name)# 上传文件bucket.put_object_from_file(object_name, local_file)print(f"文件 {local_file} 已成功上传到 OSS,路径为 {object_name}")if os.path.exists(local_file):os.remove(local_file)print(f"本地缓存文件 {local_file} 已被删除")else:print(f"文件 {local_file} 不存在")# 按装订区域中的绿色按钮以运行脚本。
    if __name__ == '__main__':#本地的图片视频地址信息PathVideo = os.path.dirname(os.path.realpath(sys.executable)) + '\\Video\\result.mp4'PathImage = os.path.dirname(os.path.realpath(sys.executable)) + '\\Image\\'PathDelayImage = os.path.dirname(os.path.realpath(sys.executable)) + '\\Image'FpsPath = JsonToStr(dataPath)['Video_fps']ImageToVideo(PathImage,PathVideo,FpsPath,PathDelayImage)
  2. 这是完整逻辑,函数ImageToVideo用来将图片转为视频的,delete_all_pngs函数作用是将本地图片进行删除的,JsonToStr是用来读取本地设置信息的,VideoToOSS将本地视频提交OSS然后进行删除,main就是调用了,这块东西很简单自己看下就会了,然后把代码进行打包在终端直接打包,运行完成后会在本地生成一个EXE执行文件
    
    Pyinstaller -F VideoToOSS.py
  3. data.json中是我们的oss的配置信息,这块我就不写了,自己找一下配置一下就行,Videofps是视频生成时的帧数
    {"Video_fps": 25,"access_key_id": "<自己的KeyID>","access_key_secret": "<自己的secre>","endpoint": "<自己的服务地址>","bucket_name": "<自己的bucket文件名称>","object_name": "video/object.mp4"
    }

 结语

        确保最终的UE打开EXE名称为VideoToOSS,基本的使用过程就是这样,因为UE直接做视频和OSS需要对于的FFMPEG或者OSS其他库,处理起来很麻烦,很多应用也不一定能找到,通过这种方式可以巧妙的解决掉这个麻烦,如果你觉得exe没有回调的话出现问题时怎么办,可以做一个简单的通信,让UE和这个EXE去协同处理来解决或者通过句柄的方式,但是这块呢大家各自发挥。

链接:https://pan.baidu.com/s/1DI-iWjwAO9Hy4pQGE6FInA 
提取码:8i55 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/624801.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

吴恩达llama课程笔记:第七课llama安全工具

羊驼Llama是当前最流行的开源大模型&#xff0c;其卓越的性能和广泛的应用领域使其成为业界瞩目的焦点。作为一款由Meta AI发布的开放且高效的大型基础语言模型&#xff0c;Llama拥有7B、13B和70B&#xff08;700亿&#xff09;三种版本&#xff0c;满足不同场景和需求。 吴恩…

Jenkins配置windows/linux从节点

背景&#xff1a; 环境&#xff1a;jenkins环境&#xff08;Ubuntu&#xff09; 节点机器&#xff1a;Linux、Windows 前置条件&#xff1a; 节点机器&#xff1a;安装java、allure、python 1 Linux节点管理机器添加 1.1 系统管理->节点列表->New Node 1.2 节点配置…

万兆以太网MAC设计(5)MAC_TX模块设计以及上板带宽测试

文章目录 前言一、模块功能二、实现方式三、仿真四、上板测速 前言 MAC_RX的设计暂时告一段落&#xff0c;本节将开始进行MAC_TX的设计。 一、模块功能 接收上层用户的AXIS数据&#xff0c;将其转换为XGMII进接口的数据发送给IP核。可接受AXIS数据流&#xff0c;可支持数据包…

Spring Boot集成easypoi快速入门Demo

1.什么是easypoi&#xff1f; Easypoi功能如同名字easy&#xff0c;主打的功能就是容易&#xff0c;让一个没见接触过poi的人员就可以方便的写出Excel导出&#xff0c;Excel模板导出&#xff0c;Excel导入&#xff0c;Word模板导出&#xff0c;通过简单的注解和模板语言(熟悉的…

简单3步,OpenHarmony上跑起ArkUI分布式小游戏

标准系统新增支持了方舟开发框架&#xff08;ArkUI&#xff09;、分布式组网和 FA 跨设备迁移能力等新特性&#xff0c;因此我们结合了这三种特性使用 ets 开发了一款如下动图所示传炸弹应用。 打开应用在通过邀请用户进行设备认证后&#xff0c;用户须根据提示完成相应操作&am…

Adobe AE(After Effects)2015下载地址及安装教程

Adobe After Effects是一款专业级别的视觉效果和动态图形处理软件&#xff0c;由Adobe Systems开发。它被广泛用于电影、电视节目、广告和其他多媒体项目的制作。 After Effects提供了强大的合成和特效功能&#xff0c;可以让用户创建出令人惊艳的动态图形和视觉效果。用户可以…

RK3568 学习笔记 : u-boot 千兆网络功能验证

前言 开发板型号&#xff1a; 【正点原子】 的 RK3568 开发板 使用 虚拟机 ubuntu 20.04 编译 RK3568 Linux SDK&#xff0c;生成镜像&#xff0c;烧写后&#xff0c;Linux 系统正常启动 开启后可以使用 CTRLC 进入 u-boot 本篇验证一下 u-boot 下网络功能 【正点原子】 rk…

分类算法——模型选择与调优(三)

交叉验证 交叉验证&#xff1a;将拿到的训练数据&#xff0c;分为训练和验证集。以下图为例&#xff1a;将数据分成4份&#xff0c;其中 一份作为验证集。然后经过4次&#xff08;组&#xff09;的测试&#xff0c;每次都更换不同的验证集。即得到4组模型的 结果&#xff0c;取…

iOS依赖库版本一致性检测:确保应用兼容性

一、背景 在 iOS 应用开发的世界里&#xff0c;每次 Xcode 更新都带来了新的特性和挑战。最近的 Xcode 15 更新不例外&#xff0c;这次升级引入了对 SwiftUI 的自动强依赖。SwiftUI最低是从 iOS 13 开始支持。 这一变化也带来了潜在的兼容性问题。如果您的项目在升级到 Xcode…

Rust 编写的数据框架:多线程、矢量化查询引擎 | 开源日报 No.226

pola-rs/polars Stars: 25.2k License: MIT polars 是使用 Rust 编写的多线程、支持矢量化查询引擎的数据框架。 基于 Apache Arrow 列式内存模型惰性和急切执行多线程处理SIMD 加速计算查询优化功能强大的表达式 API支持混合流式处理&#xff08;适用于大于内存大小的数据集…

盲盒小程序成为收益“法宝”?盲盒线上如何发展

近年来&#xff0c;盲盒在年轻人中掀起了一股潮玩热风&#xff0c;受到了不少年轻人的青睐&#xff0c;盲盒商品更是在不断创新中&#xff0c;收藏价值逐渐提高。随着市场规模的扩大&#xff0c;越来越多的玩家和商家涌入到了市场中&#xff0c;盲盒的商业模式正在加快发展中。…

AppBuilder升级!工作流编排正式上线!AssistantsAPI开放邀测!

>>【v0.5.3版本】 上线时间&#xff1a;2024/4/14 关键发版信息&#xff1a; 低代码态&#xff1a;新增工作流&#xff0c;低代码制作组件 自定义组件&#xff1a;支持用户自定义创建组件&#xff0c;并被Agent自动编排调用
 工作流框架&#xff1a;组件支持流式编排…