JSON-Struktur und Feldregeln
1. Struktur auf oberster Ebene
Die vollständige JSON-Form auf oberster Ebene lautet:
{
"meta": {},
"assets": {},
"tracks": []
}Regeln:
metaist erforderlichtracksist erforderlich und muss mindestens einen Track enthaltenassetsist optional
Nicht unterstützt:
- Veraltetes Top-Level-
video - Veraltetes Top-Level-
audio
2. meta
interface Meta {
version: string;
title?: string;
description?: string;
author?: string;
createdAt?: string;
tags?: string[];
width: number;
height: number;
fps: number;
background?: string | "transparent" | Gradient;
}version
- Typ:
string - Erforderlich: ja
- Zweck: Marker für die Schema-Version
- Empfohlener Wert:
"2.0.0"
title
- Typ:
string - Erforderlich: nein
- Zweck: Metadaten für den Videotitel
description
- Typ:
string - Erforderlich: nein
- Zweck: Metadaten für die Videobeschreibung
author
- Typ:
string - Erforderlich: nein
- Zweck: Autoren-Metadaten
createdAt
- Typ:
string - Erforderlich: nein
- Zweck: Metadaten zur Erstellungszeit
tags
- Typ:
string[] - Erforderlich: nein
- Zweck: Tagging-Metadaten
width
- Typ:
number - Erforderlich: ja
- Einschränkung: positive Ganzzahl
- Zweck: Breite der Zeichenfläche
height
- Typ:
number - Erforderlich: ja
- Einschränkung: positive Ganzzahl
- Zweck: Höhe der Zeichenfläche
fps
- Typ:
number - Erforderlich: ja
- Einschränkung: positive Ganzzahl
- Zweck: Bildrate
background
- Typ:
string | "transparent" | Gradient - Erforderlich: nein
- Standardwert:
"#000000" - Zweck: globaler Hintergrund
Form von Gradient:
interface Gradient {
type: "linear" | "radial" | "conic";
angle?: number;
stops: Array<{
offset: number;
color: string;
}>;
}3. assets
interface Assets {
fonts?: FontAsset[];
images?: ImageAsset[];
videos?: VideoAsset[];
audios?: AudioAsset[];
subtitles?: SubtitleAsset[];
}fonts
interface FontAsset {
id: string;
src: string;
family: string;
}Aktueller Laufzeitstatus:
- Es kann im JSON erscheinen
- Die Laufzeit lädt oder registriert Schriftarten nicht automatisch
- Behandle es nicht als vollständiges System zum Laden von Schriftarten
images
interface ImageAsset {
id: string;
src: string;
}videos
interface VideoAsset {
id: string;
src: string;
}audios
interface AudioAsset {
id: string;
src: string;
}subtitles
interface SubtitleAsset {
id: string;
words: SubtitleWord[];
}Verwendung von $ref
Ressourcen-Pools mit Unterstützung für $ref:
imagesvideosaudiossubtitles
Beispiel:
{
"src": { "$ref": "video-hero" }
}Oder:
{
"words": { "$ref": "subtitle-main" }
}4. tracks
interface Track {
id?: string;
clips: Clip[];
}id
- Typ:
string - Erforderlich: nein
- Zweck: Track-Kennung
clips
- Typ:
Clip[] - Erforderlich: ja
- Einschränkung: mindestens ein Clip
5. Gemeinsame Clip-Form
interface BaseClip {
id?: string;
type: ClipType;
start: number;
duration: number;
transform?: Transform;
zIndex?: number;
opacity?: number;
style?: Style;
animations?: Animation[];
keyframes?: Keyframe[];
transition?: Transition;
}Gemeinsame Kernfelder:
id
- Typ:
string - Erforderlich: nein
- Zweck: Clip-Kennung
type
- Typ:
ClipType - Erforderlich: ja
Derzeit unterstützt:
videoimagetextrectcirclepolygonaudiosubtitlelayouttemplate
start
- Typ:
number - Erforderlich: ja
- Einheit: Sekunden
- Zweck: Startzeit des Clips
duration
- Typ:
number - Erforderlich: ja
- Einheit: Sekunden
- Zweck: Dauer des Clips
transform
- Typ:
Transform - Erforderlich: nein
zIndex
- Typ:
number - Erforderlich: nein
- Standardwert:
0
opacity
- Typ:
number - Erforderlich: nein
- Standardwert:
1 - Zweck: Kurzform für die Deckkraft sichtbarer Elemente
- Kompatibilitätsregel:
style.opacityhat höhere Priorität als das Top-Level-opacity
style
- Typ:
Style - Erforderlich: nein
animations
- Typ:
Animation[] - Erforderlich: nein
keyframes
- Typ:
Keyframe[] - Erforderlich: nein
transition
- Typ:
Transition - Erforderlich: nein
6. Regeln für Koordinaten und Prozentwerte
Prozentuale Koordinaten basieren auf dem zentrierten Koordinatensystem von Revideo, nicht auf einem DOM-Ursprung oben links.
Beispiele:
x: "50%"bedeutet horizontal zentrierty: "50%"bedeutet vertikal zentriertx: "0%"bedeutet ganz linksx: "100%"bedeutet ganz rechtsy: "0%"bedeutet obeny: "100%"bedeutet unten
7. Minimales gültiges JSON
{
"meta": {
"version": "2.0.0",
"width": 1920,
"height": 1080,
"fps": 30,
"background": "#000000"
},
"tracks": [
{
"clips": [
{
"type": "text",
"start": 0,
"duration": 3,
"text": "Hello, world",
"transform": {
"x": "50%",
"y": "50%"
},
"style": {
"fontSize": 72,
"fill": "#ffffff",
"textAlign": "center"
}
}
]
}
]
}8. Hinweis für öffentliche Integrationen
Für externe Integrationen verwende den in API und Verwendung dokumentierten Ablauf:
- Reiche dein Schema über
POST /api/previewein - Sende das vollständige Schema-JSON als Request-Body
- Fehlende Top-Level-Felder
metaodertracksmüssen weiterhin als ungültige Eingabe behandelt werden - Ein falscher Feldname innerhalb eines Clips führt nicht immer schon zum Fehler beim Request
- Manche Fehler werden erst bei Vorschau, Wiedergabe oder Rendern sichtbar