创建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场景中实现。