ストーリーはメディアと操作の組み合わせで、単なる座標配列ではありません。音声付きなら配信可能なナレーションと実測した長さ、意図した無音のカメラ・字幕なら空の URL と明示的な時間を指定します。どちらも現在の Work の index を使います。
import { Five } from '@realsee/five'
import { VreoKeyframeEnum, type VreoUnit, type VreoKeyframe, type CameraMovementData, type PrompterData } from '@realsee/vreo/typings'
// Use an accessible media asset, or an empty URL for Vreo's built-in silent timeline.
export function createNarrative(narrationUrl: string, durationMs: number, panoIndex: number, fov = 90): VreoUnit {
if (!Number.isFinite(durationMs) || durationMs < 4000) throw new Error('Use a timeline at least four seconds long')
const camera: CameraMovementData = { mode: Five.Mode.Panorama, panoIndex, longitude: 0, latitude: 0, fov }
const caption: PrompterData = { text: 'Welcome to this space.' }
const keyframes: VreoKeyframe[] = [
{ type: VreoKeyframeEnum.CameraMovement, start: 0, end: 2000, data: camera },
{ type: VreoKeyframeEnum.Prompter, start: 0, end: 4000, data: caption }
]
return { video: { url: narrationUrl, duration: durationMs, start: 0, end: durationMs }, keyframes }
}両方の操作が収まるよう 4 秒以上を要求します。実 URL で呼び、返された unit を Player クイックスタート に渡します。
公開モデルを使う
| 項目 | 意味 |
|---|---|
video.url | 取得可能な音声・動画、または組み込み無音時間軸用の空文字 |
video.duration, start, end | ミリ秒単位の時間軸 |
keyframes[].start, end | 操作の時間区間(ミリ秒) |
CameraMovementData.panoIndex | 現在の Work のパノラマ index |
longitude, latitude | ラジアン単位の角度 |
enum と型は @realsee/vreo/typings から import します。ルートは Player を公開しますが全スクリプト型は再公開しません。data は広い型なので、CameraMovementData と PrompterData を別に宣言すると誤りを検出しやすくなります。
他種のフレームは専用データと有効アセットが必要です。特にパノラマ更新は署名済みシーンデータを含み、捏造や SK の埋め込みで取得してはいけません。
確認する
読み込み前に応答、長さ、時間順序、パノラマ所属を検証します。再生中に字幕区間と移動先を確認し、操作 UI で再生・シークを試します。
