UE4 C++控制在UMG控件中播放视频

创建MediaPlayer和MediaSource

UE4中的Media框架在官方文档中有蓝图的使用示例:
https://docs.unrealengine.com/latest/CHN/Engine/MediaFramework/index.html

在此我们用C++来实现。

首先在Content文件夹下新建一个Movies文件夹,将你要播放的视屏文件拷贝到项目工程的对应文件夹里。然后创建一个Media->FileMediaSource,此处我命名为SampleVideo,双击打开后再FilePath里选择你之前添加的视屏文件。
这里写图片描述
接着创建一个Media->MediaPlayer,勾选同时生成MediaTexture和SoundWave,此处我命名为SampleMedia。
这里写图片描述
这里写图片描述

创建UMG

接下来我们在编辑器中创建一个简单的UMG,之后再在C++中控制他来播放视频。
在Content目录下新建一个UMG文件夹,然后新建一个WidgetBlueprint,命名为MediaPlayUMG,打开它。然后我们要做的只是添加一个Image控件填充整个CanvasPanel,然后给Image的Brush设置为SampleMedia_Video
这里写图片描述

C++代码控制播放视频

接下来我们进入VS来添加控制视频播放的代码,此处我把控制代码写在了PlayerController中。

//MyPlayerController.h

#pragma once

#include "GameFramework/PlayerController.h"
#include "MyPlayerController.generated.h"

class UUserWidget;
class UMediaPlayer;
/**
 * 
 */
UCLASS()
class STARTINGMENU_API AMyPlayerController : public APlayerController
{
    GENERATED_BODY()

public:
    AMyPlayerController();
    void BeginPlay() override;    
    void ShowMovieWidget();
    void ShowMainMenuWidget();
    void PlaySound();
    void EndPlaySound();

    UFUNCTION()
    void EnterVR();

    UFUNCTION()
        void MovieEnd();

private:

    UAudioComponent* SoundWave;
    UMediaPlayer* mediaPlayer;

    UUserWidget* MovieWidget;
    UUserWidget* MainMenuWidget;

};
//MyPlayerController.cpp

#include "StartingMenu.h"
#include "UserWidget.h"
#include "CanvasPanel.h"
#include "Image.h"
#include "Button.h"
#include "MediaSoundWave.h"
#include "MediaSource.h"
#include "MediaPlayer.h"
#include "MyPlayerController.h"

AMyPlayerController::AMyPlayerController()
{
    bShowMouseCursor = true;
}

void AMyPlayerController::BeginPlay()
{
    Super::BeginPlay();
    ShowMovieWidget();
}

void AMyPlayerController::ShowMovieWidget()
{
    if (nullptr == MovieWidget)
    {
        UClass* aa = LoadClass<UUserWidget>( NULL, TEXT( "Blueprint'/Game/UMG/MediaPlayUMG.MediaPlayUMG_C'" ) );
        MovieWidget = CreateWidget<UUserWidget>( this, aa );
    }
    MovieWidget->AddToViewport();

    UMediaSource* SampleVide = LoadObject<UMediaSource>( NULL, TEXT( "FileMediaSource'/Game/Movies/SampleVideo.SampleVideo'" ) );
    mediaPlayer = LoadObject<UMediaPlayer>( NULL, TEXT( "MediaPlayer'/Game/Movies/SampleMedia.SampleMedia'" ) );
    mediaPlayer->OpenSource( SampleVide );

    PlaySound();  

    mediaPlayer->OnEndReached.AddDynamic( this, &AMyPlayerController::MovieEnd );
}

void AMyPlayerController::ShowMainMenuWidget()
{
    if (nullptr == MainMenuWidget)
    {
        UClass* aa = LoadClass<UUserWidget>( NULL, TEXT( "Blueprint'/Game/UMG/MainMenu.MainMenu_C'" ) );
        MainMenuWidget = CreateWidget<UUserWidget>( this, aa );
    }
    MainMenuWidget->AddToViewport();

    UWidget* ButtonEnter = MainMenuWidget->GetWidgetFromName( TEXT( "EnterVRScene" ) );
    UButton* buttonEnterVR = Cast<UButton>( ButtonEnter );
    buttonEnterVR->OnPressed.AddDynamic( this, &AMyPlayerController::EnterVR );
}

void AMyPlayerController::ShowLoadingSceneWidget()
{

}

void AMyPlayerController::PlaySound()
{
    if (nullptr == SoundWave)
    {
        UMediaSoundWave* movieSound = LoadObject<UMediaSoundWave>( NULL, TEXT( "MediaSoundWave'/Game/Movies/SampleMedia_Sound.SampleMedia_Sound'" ) );
        SoundWave = UGameplayStatics::CreateSound2D( this, movieSound );
    }    
    SoundWave->Play();
}

void AMyPlayerController::EndPlaySound()
{
    if (SoundWave != nullptr)
    {
        SoundWave->Stop();
    }
}

void AMyPlayerController::EnterVR()
{
    if (nullptr != MainMenuWidget)
    {
        MainMenuWidget->SetVisibility( ESlateVisibility::Hidden );
    }
}

void AMyPlayerController::MovieEnd()
{
    GEngine->AddOnScreenDebugMessage( -1, 1, FColor::Red, TEXT( "AMyPlayerController::MovieEnd" ) );
    if (MovieWidget != nullptr)
    {
        MovieWidget->RemoveFromParent();
    }
    ShowMainMenuWidget();
}

接下来把我们写的MyPlayerController设置为当前场景GameMode的PlayerController类就能正常播放了。
这里写图片描述

小结

此处我只是实现了简单的视频播放功能,添加视频播放的各种控制功能也是可以实现的。而且UMG也能放在3D场景中实现。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值