C++ 在 Unreal 中为游戏增加实时音视频互动的教程详解分享!

我们已经上线了 Agora Unreal SDK,提供了支持 Blueprint 和 C++ 的两个版本 SDK。我们分享了如何基于 Blueprint 在游戏中创建实时音视频功能 。在本文中,我们来分享如何基于声网 Agora Unreal SDK C++版本,在游戏中实现实时音视频功能。

本篇教程较长,建议在 Web 浏览器端浏览,体验更好。

准备工作

需要的开发环境和需要准备的与 Blueprint 一样:

新建项目

如果你已经有 Unreal 项目了,可以跳过这一步。在 Unreal 中创建一个 C++类型的项目。

C++ 在 Unreal 中为游戏增加实时音视频互动的教程详解

确保在 [your_project]/Source/[project_name]/[project_name].Build.cs文件的 PrivateDependencyModuleNames一行,去掉注释。Unreal 默认是将它注释掉的,这会导致在编译的时候报错。

  // Uncomment if you are using Slate UI   PrivateDependencyModuleNames.AddRange(new string[] { "UMG", "Slate", "SlateCore" });

接下来我们在项目中集成 Agora SDK

1.将 SDK 复制到这个路径下 [your_project]/Plugins

2.把插件依赖添加到[your_project]/Source/[project_name]/[project_name].Build.cs文件的私有依赖(Private Dependencies)部分 PrivateDependencyModuleNames.AddRange(new string[] { “AgoraPlugin”, “AgoraBlueprintable” });

3.重启 Unreal

4.点击 Edit->Plugin,在分类中找到 Project->Other,确定插件已经生效

C++ 在 Unreal 中为游戏增加实时音视频互动的教程详解

创建新的 Level

接下来我们将创建一个新的 Level,在那里建立我们的游戏环境。有几种不同的方法可以创建一个新的 Level,我们将使用文件菜单的方法,其中列出了关卡选择选项。

在虚幻编辑器里面,点击文件菜单选项,然后选择新建 Level……

C++ 在 Unreal 中为游戏增加实时音视频互动的教程详解

然后会打开一个新的对话框 。

C++ 在 Unreal 中为游戏增加实时音视频互动的教程详解

选择Empty Level ,然后指定一个存储的路径。

创建核心类

在这里我们要创建两个类:VideoFrameObserver 和VideoCall C++ Class。他们会负责与 Agora SDK 进行通信。

首先是 VideoFrameObserver。VideoFrameObserver 执行的是 agora::media::IVideoFrameObserver。这个方法在 VideoFrameObserver 类中负责管理视频帧的回调。它是用 registerVideoFrameObserver 在 agora::media::IMediaEngine 中注册的。

在 Unreal 编辑器中,选择 File->Add New C++ Class。

C++ 在 Unreal 中为游戏增加实时音视频互动的教程详解

父类谁定为 None,然后点击下一步。

C++ 在 Unreal 中为游戏增加实时音视频互动的教程详解

为 VideoFrameObserver明明,然后选择 Create Class。

C++ 在 Unreal 中为游戏增加实时音视频互动的教程详解

创建 VideoFrameObserver 类接口。

打开 VideoFrameObserver.h 文件然后添加如下代码:

  //VideoFrameObserver.h  #include "CoreMinimal.h"  #include <functional>  #include "AgoraMediaEngine.h"  class AGORAVIDEOCALL_API VideoFrameObserver : public agora::media::IVideoFrameObserver  {  public:   virtual ~VideoFrameObserver() = default;  public:   bool onCaptureVideoFrame(VideoFrame& videoFrame) override;   bool onRenderVideoFrame(unsigned int uid, VideoFrame& videoFrame) override;   void setOnCaptureVideoFrameCallback(   std::function<void(std::uint8_t*, std::uint32_t, std::uint32_t, std::uint32_t)> callback);   void setOnRenderVideoFrameCallback(   std::function<void(std::uint8_t*, std::uint32_t, std::uint32_t, std::uint32_t)> callback);   virtual VIDEO_FRAME_TYPE getVideoFormatPreference() override { return FRAME_TYPE_RGBA; }  private:   std::function<void(std::uint8_t*, std::uint32_t, std::uint32_t, std::uint32_t)> OnCaptureVideoFrame;   std::function<void(std::uint8_t*, std::uint32_t, std::uint32_t, std::uint32_t)> OnRenderVideoFrame;  };

AGORAVIDEOCALL_API 是项目依赖的定义,而不是由Unreal 生成的你自己的定义。

重写onCaptureVideoFrame/onRenderVideoFrame方法

onCaptureVideoFrame 会获取到摄像头捕获的画面,转换为 ARGB 格式并触发 OnCaptureVideoFrame 回调。

onRenderVideoFrame 讲收到的特定用户画面转换为 ARGB 格式,然后触发 onRenderVideoFrame 回调。

  //VideoFrameObserver.cpp  bool VideoFrameObserver::onCaptureVideoFrame(VideoFrame& Frame)  {   const auto BufferSize = Frame.yStride*Frame.height;   if (OnCaptureVideoFrame)   {   OnCaptureVideoFrame( static_cast< uint8_t* >( Frame.yBuffer ), Frame.width, Frame.height, BufferSize );   }   return true;  }  bool VideoFrameObserver::onRenderVideoFrame(unsigned int uid, VideoFrame& Frame)  {   const auto BufferSize = Frame.yStride*Frame.height;   if (OnRenderVideoFrame)   {   OnRenderVideoFrame( static_cast<uint8_t*>(Frame.yBuffer), Frame.width, Frame.height, BufferSize );   }   return true;  }

增加setOnCaptureVideoFrameCallback/setOnRenderVideoFrameCallback方法。

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/484921.html

发表评论

邮箱地址不会被公开。 必填项已用*标注

评论列表(1条)

  • 游戏增加实时音视频互动
    游戏增加实时音视频互动 2021年4月8日 下午7:57

    C++ 在 Unreal 中为游戏增加实时音视频互动的教程详解分享!