虚幻引擎像素流源码解读

news2024/11/18 2:49:00

前言

假期在家把虚幻引擎像素流的源码有研究了一下,进行了一下总结,本文适合有一定使用虚幻引擎像素流经验的人阅读。

源码地址

这里研究的是UE5.1的版本,源码位置如下

C:\Program Files\Epic Games\UE_5.1\Engine\Plugins\Media\PixelStreaming
1930418807b5b67c4ad09b2ceb452608.png

websocket处理

像素流和signal服务之间通过websocket进行通信,处理业务的逻辑在FPixelStreamingSignallingConnection这个类中,处理消息的函数如下

void FPixelStreamingSignallingConnection::OnMessage(const FString& Msg)
{
 FJsonObjectPtr JsonMsg;
 const auto JsonReader = TJsonReaderFactory<TCHAR>::Create(Msg);

 if (!FJsonSerializer::Deserialize(JsonReader, JsonMsg))
 {
  UE_LOG(LogPixelStreamingSS, Error, TEXT("Failed to parse SS message:\n%s"), *Msg);
  return;
 }

 FString MsgType;
 if (!JsonMsg->TryGetStringField(TEXT("type"), MsgType))
 {
  UE_LOG(LogPixelStreamingSS, Error, TEXT("Cannot find `type` field in SS message:\n%s"), *Msg);
  return;
 }

 TFunction<void(FJsonObjectPtr)>* Handler = MessageHandlers.Find(MsgType);
 if (Handler != nullptr)
 {
  (*Handler)(JsonMsg);
 }
 else
 {
  UE_LOG(LogPixelStreamingSS, Error, TEXT("Unsupported message `%s` received from SS"), *MsgType);
 }
}

一共定义了12种类型的消息处理,如下图

d38dd73ec0d633b39cb4551b300f3d7b.png

意外发现,居然还有一个PixelStreamServers工程,可以创建signal服务,这样的话,就可以一个虚幻程序,搞定所有,不再需要再启动一个nodejs的signal服务了。websocket服务监听,代码如下:,调用的是WebSocketNetworking这个模块创建的服务端。

79b165ca4f1f2454a4f4d338726dfa8f.png

相关业务处理逻辑见FSignallingServer这个类,可以管理连接上来的websocket连接。

01c6edf282c62484ba1ce178f27776dc.png

web与UE通信事件

web和UE的通信事件,在FPixelStreamingModule::PopulateProtocol函数中进行定义,每个事件有一个id。

365f348bdbe7ce48f4a0f46549b33a40.png

我们的peerstream里面定义的事件id也是和这里一一对应的。

410b6638741b4181da8d98cd3685ea5a.png

大家可以看到两边的值是一样的,整个通信,实际上就是通过这个id来进行区分。

UE接受web的消息处理函数为FPixelStreamingDataChannel::OnMessage,

d7f8dd203e02188e2c00692986eed2de.png

这里所有接受到的数据,都会丢进游戏线程进行处理。这里第一个字节,表示消息类型,所以最大可以定义255种消息。

接下来,业务逻辑处理的函数在FStreamer::OnDataChannelMessage中进行处理。

408dd0680abca2db86a6410f769b23f2.png通过InputHandler对象进行统一处理,其定义如下

InputHandler = MakeShared<FPixelStreamingInputHandler>(PixelStreamerApplicationWrapper, BaseHandler);

整个业务处理封装在FPixelStreamingInputHandler类中,在其定义中,我们发现了根据不同类型的处理函数。

72f3ee5591b3a4aba78812dc2981f3c5.png

其定义了一个void FPixelStreamingInputHandler::OnMessage(const webrtc::DataBuffer& Buffer)函数,作为统一的消息处理入口。

b946d5962e1baa3634bc464caa22bd11.png

所有的消息处理,都统一丢到了一个消息处理队列中。最后在tick中进行处理,所以UE接受的数据,都是在游戏线程进行业务逻辑的。

e6b5d7b05641f5f94d1069901c1b8b99.png

视频处理

视频处理是单独开启了一个线程来抓取图像,在FVideoSourceGroup类中,

5836463267cce8cc8faab2aef04b8aca.png

根据帧率,定期的调用tick处理函数

9829772f5eb7c0afcfc4edee71ab48d6.png

图像的抓取,在FVideoSource这个类中进行,并通过OnFrame推送给webrtc库

38c34cea4f8c85a7638f5c3bf7f78510.png

整个图像的获取封装在FPixelStreamingVideoInput对象中,但是真正的抓取在FPixelCaptureCapturerMultiFormat类中,这个处理都封装在另外一个插件PixelCapture中,位置如下

495ad111fa6c76a7508845f66ae4e59f.png

视频的读取这一块,还没看明白,还需要再研究研究,如何从虚幻引擎读取画面,并推送到webrtc。

蓝图交互

蓝图的交互封装在UPixelStreamingInput这个对象里面,其继承至UActorComponent。其主要是想了两个函数,一个是回调数据给蓝图,一个是发送数据给web。

498d4ed5fb9f4a89b8a9c090e5d8fd3b.png

然后顺便还实现了json的一些简单操作,这里不做介绍。

相关的事件消息封装在UPixelStreamingDelegates对象中,其继承UObject。用户的连接事件、断线事件都是在这里进行处理。0b9a6a886c681f4e6fc0f370b00eee47.png

总结

本文大概得研究了一下信令的交互流程,由于内容比较多,还有比较多的细节,需要深入研究。

我的知识星球

请关注公众号g0415shenw 加入知识星球。
星球地址 https://t.zsxq.com/15EvfoA7n
星球有本人经验心得全部总结 涵盖音视频,gb28181、虚幻引擎、其他编程工具等等。另外还可以在星球提问,我会尽力答复,等于给您多了一个引路人。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AIGC实战——ProGAN(Progressive Growing Generative Adversarial Network)

AIGC实战——ProGAN 0. 前言1. ProGAN2. 渐进式训练3. 其他技术3.1 小批标准差3.2 均等学习率3.3 逐像素归一化 4. 图像生成小结系列链接 0. 前言 我们已经学习了使用生成对抗网络 (Generative Adversarial Network, GAN) 解决各种图像生成任务。GAN 的模型架构和训练过程具有…

pytest的时候输出一个F后面跟很多绿色的点解读

使用pytest来测试pyramid和kotti项目&#xff0c;在kotti项目测试的时候&#xff0c;输出一个F后面跟很多绿色的点&#xff0c;是什么意思呢&#xff1f; 原来在使用pytest进行测试时&#xff0c;输出中的“F”代表一个失败的测试&#xff08;Failed&#xff09;&#xff0c;而…

Spring源码分析(@Configuration)

文章目录 Spring源码分析&#xff08;Configuration&#xff09;一、ConfigurationClassPostProcessor1、主要作用和特点2、执行的时机3、BeanFactoryPostProcessor4、BeanDefinitionRegistryPostProcessor5、ConfigurationClassPostProcessor1&#xff09;postProcessBeanDefi…

ebpf+perfetto实现调度延迟记录与展示

1.背景 需要分析生产环境的调度问题,如线程的调度延迟有多少,在哪些时间点延迟比较明显,影响其调度的主要原因是什么?其次,我们希望可以比较直观的展示调度延迟情况。最好能对接perfetto的UI和后处理,因为perfetto已经用于分析比较多的性能数据,可以和调度数据进行整合.我们…

聚观早报 | 沃尔沃发布一季度全球销量;苹果将举办财报电话会议

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 4月07日消息 沃尔沃发布一季度全球销量 苹果将举办新财报电话会议 荣耀Magic6支持5.5G通信 特斯拉将建最大超级充…

【计算机网络经典面试题】简述 TCP 三次握手和四次挥手的过程

TCP链接 1.三次挥手2.四次挥手3.拓展说说 TCP 2次握手行不行&#xff1f;为什么要3次 1.三次挥手 1&#xff09;第一次握手&#xff1a;建立连接时&#xff0c;客户端向服务器发送SYN包&#xff08;seqx&#xff09;&#xff0c;请求建立连接&#xff0c;等待确认 2&#xff09…

基于Springboot的Java学习平台

采用技术 基于Springbootjava学习平台的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 系统功能模块 后台管理 用户注册 课程信息 作业信息 资料信息…

【Linux实践室】Linux高级用户管理实战指南:创建与删除用户组操作详解

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;Linux创建用户组命令2.1.1 知识点讲解2.1.2…

MacOS Docker 可视化面板 Portainer

一、简介 Portainer 是一个可视化的容器镜像图形管理工具&#xff0c;使用 Portainer 可以轻松构建、管理和维护Docker 环境。 而且完全免费&#xff08;portainer-ce 是免费的&#xff0c;portainer-ee 是需要授权的&#xff0c;今天安装的是 portainer-ce 版本&#xff09;&…

基于51单片机的尾气检测报警器Proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1DBn8A-p6wmP3Zssrrwspyg 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectroni…

Transformer模型-add norm(残差连接归一化)的简明介绍

今天介绍transformer模型的add & norm&#xff08;残差连接&归一化&#xff09; add代表残差连接&#xff08;Residual Connection&#xff09; 残差连接是一种跳过连接,它将输入添加到网络的中间层或输出上。 **残差连接&#xff08;Residual Connection&#xff09;…

深度学习-机器视觉part2

深度学习-机器视觉part2 文章目录 深度学习-机器视觉part2一、从卷积到卷积神经网络二、手撕卷积代码2.1 动机2.2 数据集2.3 卷积操作2.3.1 填充&#xff08;padding&#xff09;2.3.2 卷积块2.3.3 池化2.3.4 Softmax 2.4 完整CNN2.5 训练改进 三、经典CNN模型介绍四、CNN模型的…

SQL Server详细安装使用教程

1.安装环境 现阶段基本不用SQL Server数据库了&#xff0c;看到有这样的分析话题&#xff0c;就把多年前的存货发一下&#xff0c;大家也可以讨论看看&#xff0c;思路上希望还有价值。 SQL Server 2008 R2有32位版本和64位版本&#xff0c;32位版本可以安装在Windows XP及以上…

网络安全之代码签名证书申请

代码签名&#xff0c;作为一种数字安全机制&#xff0c;对于软件开发、分发及用户使用环节具有至关重要的意义。以下从六大方面阐述代码签名必不可少的重要性&#xff1a; 确保代码来源可信&#xff1a; 代码签名如同软件的“身份证”&#xff0c;通过数字证书对开发者身份进…

2024年船舶、海洋工程与应用技术国际学术会议(ICSOEAT 2024)

2024 International Conference on Shipbuilding, Ocean Engineering and Applied Technology ●会议简介 2024年船舶、海洋工程与应用技术国际学术会议&#xff08;ICSOEAT 2024&#xff09;旨在汇聚全球船舶、海洋工程与应用技术领域的专家学者&#xff0c;共同探讨行业前沿…

【话题】程序员35岁会失业吗?

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景招聘分析一、技术更新换代的挑战二、经验与技术的双重优势三、职业发展的多元化选择四、个人成长与职业规划的平衡五、结语文章推荐 背景 35岁被认为是程序员职业生…

【浅尝C++】多态机制=>重载重写隐藏的区别/抽象类/单继承与多继承的虚函数表/多态原理及虚函数表内存存储详谈

&#x1f3e0;专栏介绍&#xff1a;浅尝C专栏是用于记录C语法基础、STL及内存剖析等。 &#x1f3af;每日格言&#xff1a;每日努力一点点&#xff0c;技术变化看得见。 文章目录 多态的概念多态的定义及实现多态的构成条件虚函数虚函数的重写override与final&#xff08;C11&a…

ffmpeg 将多个视频片段合成一个视频

ffmpeg 将多个视频片段合成一个视频 References 网络视频 6 分钟的诅咒。 新建文本文件 filelist.txt filelist.txtfile output_train_video_0.mp4 file output_train_video_1.mp4 file output_train_video_2.mp4 file output_train_video_3.mp4 file output_train_video_4.m…

C语言完结篇(17)

编译和链接 1. 翻译环境和运⾏环境 2. 翻译环境&#xff1a;预编译编译汇编链接 我们知道计算机能够执行的是二进制的指令 而我们的C语言代码都是文本信息 所以我们需要让C语言代码转变为二进制的指令&#xff08;这是需要编译器来进行处理的&#xff09; 翻译环境和运⾏…

2024年MathorCup妈妈杯数学建模思路D题思路解析+参考成品

1 赛题思路 (赛题出来以后第一时间在群内分享&#xff0c;点击下方群名片即可加群) 2 比赛日期和时间 报名截止时间&#xff1a;2024年4月11日&#xff08;周四&#xff09;12:00 比赛开始时间&#xff1a;2024年4月12日&#xff08;周五&#xff09;8:00 比赛结束时间&…