CRIWARE Unity Plugin Manual  Last Updated: 2024-07-12
[CriMana] 使用多个播放器动态地切换视频

范例描述

概述

cri4u_samples_crimana_adv02_screenshot.png

该范例程序在一个视频已经被播放时快速地切换至另一个视频。
如需快速且平滑地切换(即减少视频回放停止的时间),需完成以下:
  • 创建了多个 CriManaMovieController 组件,以确保下一个视频已准备好提前播放。
当执行该范例时,脚本将创建两个 CriManaMovieController 组件。
一个组件开始回放,另一个已准备好回放,正在等待。当点击按键时,等待的视频将立即开始。
注意
如果下一个播放的视频因为过多连续请求而导致还未准备好,那么切换可能会更花费时间。

渲染进视频里的材质将添加至多个游戏对象。因此,多个游戏对象可在同一时间渲染。

场景信息


中间件 CRI Sofdec (CRI Mana)
范例 进阶范例
存储路径 /CRIWARE/SDK/unity/samples/UnityProject/Assets/Scenes/crimana/advanced/
场景文件 Scene_02_DynamicMovieSwitch.unity


程序描述

在该场景中,所有视频的回放都由[Scene_02_DynamicMovieSwitch.cs]脚本控制。
提供了[Scene_02_DynamicMovieSwitch.mat]材质来渲染一个视频。它由各个 CriManaMovieController 组件所渲染。

与使用一个 CriManaMovieController 进行视频切换的不同点

当仅一个 CriManaMovieController 用于切换视频时,回放将被停止,然后下一个视频将开始播放。 切换需要时间,并且视频在切换时将被停止。如需快速且平滑地切换(即减少视频回放停止的时间),我们推荐你与该范例相同,使用多个 CriManaMovieController 来切换视频。
[注意]
当你使用多个 CriManaMovieController 时,请注意内存使用量。
尽管在视频停止时不需要任何工作内存,然而一个等待的视频与一个播放的视频将使用相同的工作内存量。

在多个 CriManaMovieController 组件直接共享绘图对象

如需在多个播放器组件直接共享绘图面,请使用movieMaterial属性 (CriManaMovieMaterial.movieMaterial) 。
moviePlayers[i] = this.gameObject.AddComponent<CriManaMovieMaterial>();
moviePlayers[i].player.SetFile(null, moviePathes[i]);
/* 设置一个材质 */
moviePlayers[i].material = movieMaterial;
在该范例中,材质已在脚本中被指定。也可在Unity编辑器中指定 CriManaMovieController 组件的材质。

[注意]
在默认情况下材质不会被指定。播放器内会自动创建一个材质,并在播放时用它代替游戏对象的材质。

控制开始播放视频的时间

当开始播放一个停止的视频时(使用 CriManaMovieMaterial.player.Start ),直到屏幕被真正刷新前,可能会发生(数十毫秒的)延迟。
如需开始回放,请调用 CriManaMovieMaterial.player.PrepareForRendering 函数,然后等待回放状态变成Status.ReadyForRendering。
if (i == 0) {
/* 仅开始player 0 */
moviePlayers[0].player.Start();
} else {
/* 准备其他的播放器的回放 */
moviePlayers[i].player.PrepareForRendering();
}
在该范例中,当你点击了按钮时,正在播放的视频将会被停止,而等待的播放器将会开始。因此,视频将在无延迟的情况下进行切换。
该范例将再次使用Update函数中挺值得播放器,以简化该流程。如再次使其为回放做好准备,那么多个播放器便能立刻进行切换。
在实际应用中,你应该记录回放准备所需的时间。
void Update () {
for (int i=0; i<moviePlayers.Length; i++) {
/* 根据player status以前往不同的流程 */
switch(moviePlayers[i].player.status) {
case CriMana.Player.Status.Stop:
/* 将一个停止的播放器返回standby status(待命状态) */
moviePlayers[i].player.PrepareForRendering();
break;
default:
break;
}
}
}

同时绘制多个游戏对象

如果你想要使用一个播放器组件在多个游戏对象上同时播放,则需要提供渲染影片的材质。
将该材质添加至各个游戏对象,并将其分配至播放器组件的movieMaterial属性。这样一来你就能够同时绘制多个对象。

你可以使用NGUI以在其他材质(如纹理)上绘制。

与无缝连续回放的不同

该范例的目的是能够在回放时快速地切换视频。
如需接连播放多个视频,请查看Basic samples(基础范例)中的 无缝连续回放