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

2020-05-29 11:02:26于丽

更新 UpdateMainVideoBuffer/UpdateAdditionalVideoBuffe

//VideoCallViewWidget.h 


...


UCLASS()
class AGORAVIDEOCALL_API UVideoCallViewWidget : public UUserWidget
{
 GENERATED_BODY()

public:

 ...

 void UpdateMainVideoBuffer( uint8* RGBBuffer, uint32_t Width, uint32_t Height, uint32_t Size);
 void UpdateAdditionalVideoBuffer( uint8* RGBBuffer, uint32_t Width, uint32_t Height, uint32_t Size);

 void ResetBuffers();
 ...
};
//VideoCallViewWidget.cpp

void UVideoCallViewWidget::UpdateMainVideoBuffer(
 uint8* RGBBuffer,
 uint32_t Width,
 uint32_t Height,
 uint32_t Size)
{
 if (!MainVideoViewWidget)
 {
 return;
 }
 MainVideoWidth = Width;
 MainVideoHeight = Height;
 MainVideoViewWidget->UpdateBuffer(RGBBuffer, Width, Height, Size);
}

void UVideoCallViewWidget::UpdateAdditionalVideoBuffer(
 uint8* RGBBuffer,
 uint32_t Width,
 uint32_t Height,
 uint32_t Size)
{
 if (!AdditionalVideoViewWidget)
 {
 return;
 }
 AdditionalVideoViewWidget->UpdateBuffer(RGBBuffer, Width, Height, Size);
}

void UVideoCallViewWidget::ResetBuffers()
{
 if (!MainVideoViewWidget || !AdditionalVideoViewWidget)
 {
 return;
 }
 MainVideoViewWidget->ResetBuffer();
 AdditionalVideoViewWidget->ResetBuffer();
}

创建 VideoCallWidget C++ 类

VideoCallWidget 类作为示例应用程序的音频/视频调用小部件。它包含以下控件,与蓝图资产中的UI元素绑定。

创建类和添加所需的include

像之前那样创建Widget C++类,添加必要的include和转发声明。

//VideoCallWidget.h
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"

#include "Templates/UniquePtr.h"
#include "Components/Image.h"
#include "Components/Button.h"
#include "Engine/Texture2D.h"

#include "VideoCall.h"

#include "VideoCallViewWidget.h"

#include "VideoCallWidget.generated.h"

class AVideoCallPlayerController;
class UVideoViewWidget;
//VideoCallWidget.cpp

#include "Kismet/GameplayStatics.h"
#include "UObject/ConstructorHelpers.h"
#include "Components/CanvasPanelSlot.h"

#include "VideoViewWidget.h"

#include "VideoCallPlayerController.h"

增加成员变量

//VideoCallWidget.h
...

UCLASS()
class AGORAVIDEOCALL_API UVideoCallWidget : public UUserWidget
{
 GENERATED_BODY()

public:
 AVideoCallPlayerController* PlayerController = nullptr;

public:
 UPROPERTY(BlueprintReadOnly, meta = (BindWidget))
 UVideoCallViewWidget* VideoCallViewWidget = nullptr;

 //Buttons
 UPROPERTY(BlueprintReadOnly, meta = (BindWidget))
 UButton* EndCallButton = nullptr;
 UPROPERTY(BlueprintReadOnly, meta = (BindWidget))
 UButton* MuteLocalAudioButton = nullptr;
 UPROPERTY(BlueprintReadOnly, meta = (BindWidget))
 UButton* VideoModeButton = nullptr;

 //Button textures
 int32 ButtonSizeX = 96;
 int32 ButtonSizeY = 96;
 UTexture2D* EndCallButtonTexture = nullptr;
 UTexture2D* AudioButtonMuteTexture = nullptr;
 UTexture2D* AudioButtonUnmuteTexture = nullptr;
 UTexture2D* VideomodeButtonCameraoffTexture = nullptr;
 UTexture2D* VideomodeButtonCameraonTexture = nullptr;

 TUniquePtr<VideoCall> VideoCallPtr;

 ...
};