播放视频

播放视频的步骤

使用ManaComponent播放视频数据。
具体处理步骤如下。
  1. 包含CriWareApi.h、ManaComponent.h 。
  2. 创建ManaComponent。
  3. 加载纹理Asset。
  4. 加载材质Asset。
  5. 用UManaComponent::SetTexture函数在ManaComponent中设置Texture。
  6. 创建材质的实例。
  7. 将ManaTexture设置为素材的实例。
  8. 用上述步骤创建的材质覆写为绘制目标的组件的材质。
  9. 用UManaComponent::Play函数开始播放。
  10. 使用 UManaPlayer::Pause 函数停止播放。
  11. 使用 UManaPlayer::Close 函数开始结束播放过程。
具体代码如下。
/* 包含播放视频所需的头文件 */
#include "CppManaPlayer.h"
#include "ManaPlayer.h"
#include "Materials/MaterialInstanceDynamic.h"
namespace
{
/* 材质纹理参数名称列表 */
const FName MaterialParameterNames[] =
{
"TextureY",
"TextureU",
"TextureV",
"TextureA",
};
const int32 NumMaterialParameter = 4;
}
void UCppManaPlayer::Setup(UManaMovie* ManaMovie, UMaterial* Material)
{
  /* 创建 ManaPlayer。 */
ManaPlayer = NewObject<UManaPlayer>();
if (!ManaPlayer)
{
UE_LOG(LogCppManaPlayer, Error, TEXT("Failed to create a UManaPlayer object."));
return;
}
  /* 将材质实例的纹理参数设置为 UManaTexture。 */
MaterialInstance = UMaterialInstanceDynamic::Create(Material, this);
if (!MaterialInstance)
{
    UE_LOG(LogCppManaPlayer, Error, TEXT("创建 UMaterialInstanceDynamic 对象失败。"));
return;
}
/* 设置循环播放标志。 */
ManaPlayer->SetLooping(true);
/* 开始准备播放。 */
ManaPlayer->OpenMovieSource(ManaMovie);
/* 获取 UManaPlayer 内部保存的 UManaTexture。 */
UManaTexture* ManaTexture = ManaPlayer->GetTexture();
if (!ManaTexture)
{
UE_LOG(LogCppManaPlayer, Error, TEXT("Failed to get ManaTexture from ManaPlayer."));
return;
}
for (int Index = 0; Index < ManaTexture->GetNumComponentTextures(); Index++)
{
UManaComponentTexture* CompTex = ManaTexture->GetComponentTexture(Index);
int32 PlaneIndex = UManaComponentTexture::GetPlaneIndexFromType(CompTex->ComponentType);
if (PlaneIndex < 0 || PlaneIndex >= NumMaterialParameter)
{
UE_LOG(LogCppManaPlayer, Warning, TEXT("Unknown plane index type."));
continue;
}
/* 设置材质纹理参数。 */
MaterialInstance->SetTextureParameterValue(MaterialParameterNames[PlaneIndex], CompTex);
}
}
void UCppManaPlayer::PlayMovie() const
{
if (!ManaPlayer)
{
UE_LOG(LogCppManaPlayer, Warning, TEXT("UCppManaPlayer::Setup() function was not called."));
return;
}
if (ManaPlayer->IsPlaying())
{
return;
}
/* 从当前播放位置继续播放。 */
auto Result = ManaPlayer->Play();
if (!Result)
{
UE_LOG(LogCppManaPlayer, Error, TEXT("Failed to start movie playback."));
}
}
void UCppManaPlayer::PauseMovie() const
{
if (!ManaPlayer)
{
UE_LOG(LogCppManaPlayer, Warning, TEXT("UCppManaPlayer::Setup() function was not called."));
return;
}
if (ManaPlayer->IsPaused())
{
return;
}
/* 暂停播放。 */
auto Result = ManaPlayer->Pause();
if (!Result)
{
UE_LOG(LogCppManaPlayer, Error, TEXT("Failed to pause movie playback."));
}
}
void UCppManaPlayer::CloseMovie()
{
if (ManaPlayer)
{
/* 结束播放。 */
ManaPlayer->Close();
}
}
备注:
通过在标头中将 UManaPlayer声明为 UPROPERTY,还可以从编辑器或蓝图中指定影片播放器。
同样,您可以通过将函数声明为 UFUNCTION 来调用蓝图中的函数。
class SAMPLE_API UCppManaPlayer : public UObject
{
UFUNCTION(BlueprintCallable, Category = "Sample")
void Setup(UManaMovie* ManaMovie, UMaterial* Material);
UFUNCTION(BlueprintCallable, Category = "Sample")
void PlayMovie() const;
UFUNCTION(BlueprintCallable, Category = "Sample")
void PauseMovie() const;
UFUNCTION(BlueprintCallable, Category = "Sample")
void CloseMovie();
UPROPERTY(EditAnywhere)
UManaPlayer* ManaPlayer{ nullptr };
};