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

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

增加 OnStartCall 方法

//VideoCallWidget.h


...


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


public:


 ...


 void OnStartCall( const FString& ChannelName, const FString& EncryptionKey, const FString& EncryptionType );


 ...
};
//VideoCallWidget.cpp


void UVideoCallWidget::OnStartCall(
 const FString& ChannelName,
 const FString& EncryptionKey,
 const FString& EncryptionType)
{
 if (!VideoCallPtr)
 {
 return;
 }


 auto OnLocalFrameCallback = [this](
 std::uint8_t* Buffer,
 std::uint32_t Width,
 std::uint32_t Height,
 std::uint32_t Size)
 {
 VideoCallViewWidget->UpdateAdditionalVideoBuffer(Buffer, Width, Height, Size);
 };
 VideoCallPtr->RegisterOnLocalFrameCallback(OnLocalFrameCallback);


 auto OnRemoteFrameCallback = [this](
 std::uint8_t* Buffer,
 std::uint32_t Width,
 std::uint32_t Height,
 std::uint32_t Size)
 {
 VideoCallViewWidget->UpdateMainVideoBuffer(Buffer, Width, Height, Size);
 };
 VideoCallPtr->RegisterOnRemoteFrameCallback(OnRemoteFrameCallback);


 VideoCallPtr->StartCall(ChannelName, EncryptionKey, EncryptionType);
}

增加 OnEndCall方法

//VideoCallWidget.h


...


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


public:


 ...


 UFUNCTION(BlueprintCallable)
 void OnEndCall();


 ...
};
//VideoCallWidget.cpp 


void UVideoCallWidget::OnEndCall()
{
 if (VideoCallPtr)
 {
 VideoCallPtr->StopCall();
 }


 if (VideoCallViewWidget)
 {
 VideoCallViewWidget->ResetBuffers();
 }


 if (PlayerController)
 {
 SetVisibility(ESlateVisibility::Collapsed);
 PlayerController->EndCall(std::move(VideoCallPtr));
 }
}

增加 OnMuteLocalAudio 方法

//VideoCallWidget.h


...


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


public:


 ...


 UFUNCTION(BlueprintCallable)
 void OnMuteLocalAudio();


 ...
};
//VideoCallWidget.cpp


void UVideoCallWidget::OnMuteLocalAudio()
{
 if (!VideoCallPtr)
 {
 return;
 }
 if (VideoCallPtr->IsLocalAudioMuted())
 {
 VideoCallPtr->MuteLocalAudio(false);
 SetAudioButtonToMute();
 }
 else
 {
 VideoCallPtr->MuteLocalAudio(true);
 SetAudioButtonToUnMute();
 }
}

增加 OnChangeVideoMode方法

//VideoCallWidget.h


...


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


public:


 ...


 UFUNCTION(BlueprintCallable)
 void OnChangeVideoMode();


 ...
};
//VideoCallWidget.cpp


void UVideoCallWidget::OnChangeVideoMode()
{
 if (!VideoCallPtr)
 {
 return;
 }
 if (!VideoCallPtr->IsLocalVideoMuted())
 {
 VideoCallPtr->MuteLocalVideo(true);


 SetVideoModeButtonToCameraOn();
 }
 else
 {
 VideoCallPtr->EnableVideo(true);
 VideoCallPtr->MuteLocalVideo(false);


 SetVideoModeButtonToCameraOff();
 }
}

增加 Blueprint 类

确保C++代码正确编译。没有成功编译的项目,你将无法进行下一步的操作。如果你已经成功地编译了C++代码,但在虚幻编辑器中仍然没有看到所需的类,请尝试重新打开项目。