Video Annotation Editor — User Guide
Create interactive annotation nodes on videos with rich interaction types including branching choices, quizzes, votes, forms, and more. Export ZWMAP-compatible JSON for seamless ZWPlayer integration.
Getting Started
The Video Annotation Editor is a free online tool that lets you overlay interactive annotation nodes on video, enabling branching narratives, quizzes, information displays, voting, and other interactive experiences. Exported ZWMAP JSON works directly with ZWPlayer.
Quick Start Steps
-
Load a video
Drag and drop a local video file (MP4, WebM) onto the window, or paste a remote video URL into the address bar and press Enter.
-
Add nodes
Draw a hotspot by dragging on the canvas, or press N to create a default node. You can also drag preset templates from the component library. to create a default node. You can also drag preset templates from the component library.
-
Configure properties and actions
Select a node and adjust its position, time range, style, and interactive actions in the properties panel. Supports chained action sequences.
-
Preview and export
Press P to enter preview mode and test interactions. When ready, export the ZWMAP JSON or copy the ZWPlayer config directly. to enter preview mode and test interactions. When ready, export the ZWMAP JSON or copy the ZWPlayer config directly.
Tip: This tool runs entirely in your browser. No video data or interaction configs are uploaded to any server — your files stay private.
Node Types
The Annotation Editor supports 13 node types in 4 categories:
Basic Nodes
| Type | Name | Description |
|---|---|---|
hotspot |
Hotspot | Transparent clickable region for triggering actions. The most common interaction type. |
text |
Text | Rich text overlay on video. Supports custom fonts, colors, alignment, and more. |
image |
Image | Image display overlay on video. Supports various fit modes (cover, contain, fill). |
button |
Button | Clickable button with theme color, variant, and shape options. Can trigger action chains. |
Interactive Nodes
| Type | Name | Description |
|---|---|---|
choice |
Choice | Branching choice node with multiple options, each jumping to a different time point. |
quiz |
Quiz | Quiz node supporting single/multiple choice, scoring mode, max attempts, and correct/wrong feedback. |
form |
Form | Form collection node with text input, dropdown, and other field types. Supports submit URL. |
vote |
Vote | Voting node supporting single/multi-select, result display, and data reporting. |
card |
Info Card | Info card popup with title, image, content, and button in a rich layout. |
Advanced Nodes
| Type | Name | Description |
|---|---|---|
webview |
Web View | Embedded web page view (IFrame) to display external web content on the video. |
map |
Map | Map node supporting Baidu Maps and Amap, with location markers and address search. |
System Nodes
| Type | Name | Description |
|---|---|---|
countdown |
Countdown | Countdown timer with three modes: Independent Timer, Floating HUD, and Timed Challenge. |
speed_controller |
Speed Control | Playback speed controller that auto-changes video speed within its time range. Invisible node. |
Keyboard Shortcuts
Speed up your workflow with these keyboard shortcuts:
| Key | Action | Description |
|---|---|---|
| Space | Play / Pause | Toggle video playback |
| , | Step Back | Seek backward one frame |
| . | Step Forward | Seek forward one frame |
| ← | Skip Back 5s | Seek backward 5 seconds |
| → | Skip Forward 5s | Seek forward 5 seconds |
| N | New Node | Create a new annotation node at the current time |
| Delete | Delete Node | Delete the selected node |
| Ctrl+Z | Undo | Undo the last operation |
| Ctrl+Y | Redo | Redo the last undone operation |
| Ctrl+S | Export | Export ZWMAP JSON or save |
| P | Preview | Enter interactive preview mode |
| Esc | Exit | Exit preview mode or deselect |
Actions & Triggers
Each node can be configured with one or more actions that fire sequentially when the user interacts with it.
Action Types
| Type | Name | Description |
|---|---|---|
SEEK_TIME |
Jump to Time | Jump to a specified time point. Param: time (seconds). |
PAUSE_MEDIA |
Pause | Pause video playback. No extra params. |
PLAY_MEDIA |
Resume | Resume video playback. No extra params. |
OPEN_LINK |
Open Link | Open a specified URL. Params: URL, target (new/current window). |
CONTROL_NODE |
Control Node | Control another node's visibility/state. Params: target node ID, operation (show/hide/activate/toggle). |
EMIT_MESSAGE |
Emit Event | Send a custom postMessage to the parent page. Params: key-value pairs. |
SUBMIT_DATA |
Submit Data | Send a POST JSON request to an API URL (fire-and-forget). Params: API URL, custom data. |
Trigger Types
- Click — fires when user clicks the node
- Long Press — fires when user holds down on the node
- Slide — fires when user slides on the node
- Drag — fires when user drags the node
- Passivity — fires automatically via other actions or events
- Gesture — fires when a specific gesture (e.g., pinch) is recognized
Animation System
Each node supports three animation phases: enter, emphasis, and exit. Multiple preset effects and custom duration are available.
Enter Animations
| Name | Key | Description |
|---|---|---|
| Fade In | fadein |
Fade from transparent to visible |
| Slide Left | slideinleft |
Slide in from the left |
| Slide Right | slideinright |
Slide in from the right |
| Slide Up | slideinup |
Slide in from below |
| Slide Down | slideindown |
Slide in from above |
| Zoom In | zoomin |
Scale up from small to normal size |
| Bounce In | bouncein |
Bounce in with elastic effect |
Emphasis Animations
| Name | Key | Description |
|---|---|---|
| Pulse | pulse |
Periodic scale pulse |
| Glow | glow |
Glowing flash effect |
| Shake | shake |
Shake left and right |
| Bounce | bounce |
Bounce up and down |
| Swing | swing |
Swing left and right like a pendulum |
Exit Animations
| Name | Key | Description |
|---|---|---|
| Fade Out | fadeout |
Fade from visible to transparent |
| Slide Left | slideoutleft |
Slide out to the left |
| Slide Right | slideoutright |
Slide out to the right |
| Slide Up | slideoutup |
Slide out upward |
| Slide Down | slideoutdown |
Slide out downward |
| Zoom Out | zoomout |
Scale down from normal to small |
Animation Duration
Duration of the animation in milliseconds (ms). Default: 300ms. Range: 100–3000ms.
ZWMAP Annotation Protocol Specification
The ZWMAP (Z&W Media Annotation Protocol) annotation type defines a standard JSON format for describing interactive video annotations. This protocol enables interoperability between annotation editing tools and video players.
Protocol Header
Every ZWMAP annotation document begins with a protocol identifier:
{
"zwp_protocol": "ZWMAP/1.0",
"zwp_type": "annotation",
"zwp_version": "1.0"
}
Node Object Fields
| Field | Type | Required | Description |
|---|---|---|---|
id |
string | Yes | Unique node identifier (UUID). |
type |
string | Yes | Node type, e.g. hotspot, text, button, quiz, etc. |
name |
string | No | Display name of the node. |
time_range.start |
number | Yes | Time when the node appears, in seconds. |
time_range.end |
number | Yes | Time when the node disappears, in seconds. |
position.x |
number | Yes | X coordinate as percentage (0–100). |
position.y |
number | Yes | Y coordinate as percentage (0–100). |
position.w |
number | Yes | Width as percentage (0–100). |
position.h |
number | Yes | Height as percentage (0–100). |
style |
object | No | Style object containing border, opacity, background, and other visual properties. |
content |
object | No | Content object, varies by node type. |
events |
array | No | Events array containing trigger and action chain configurations. |
animation |
object | No | Animation object containing enter, emphasis, and exit animation configs. |
Complete Example
This example shows a simple ZWMAP document with a text annotation and a button:
{
"zwp_protocol": "ZWMAP/1.0",
"zwp_type": "annotation",
"zwp_version": "1.0",
"nodes": [
{
"id": "a1b2c3d4",
"type": "text",
"name": "Title Card",
"time_range": { "start": 0, "end": 5 },
"position": { "x": 10, "y": 10, "w": 80, "h": 15 },
"style": { "opacity": 1 },
"content": {
"text": "Welcome to the interactive video!",
"color": "#ffffff",
"fontSize": 24
},
"animation": {
"enter": { "type": "fadein", "duration": 300 },
"exit": { "type": "fadeout", "duration": 300 }
}
},
{
"id": "e5f6g7h8",
"type": "button",
"name": "Skip Intro",
"time_range": { "start": 2, "end": 8 },
"position": { "x": 70, "y": 80, "w": 25, "h": 10 },
"events": [
{
"trigger": "click",
"actions": [
{ "type": "SEEK_TIME", "time": 10 },
{ "type": "PAUSE_MEDIA" }
]
}
]
}
]
}
ZWPlayer Integration
ZWPlayer is a full-featured JavaScript video player that supports interactive video annotations out of the box. Here's how to integrate the generated annotation config with ZWPlayer.
Player Configuration
Add the annotations property to your ZWPlayer initialization config:
var player = new ZWPlayer({
playerElm: 'mse',
url: 'https://cdn.example.com/video.mp4',
annotations: {
"zwp_protocol": "ZWMAP/1.0",
"zwp_type": "annotation",
"nodes": [
{
"id": "a1b2c3d4",
"type": "button",
"name": "Click Me",
"time_range": { "start": 5, "end": 15 },
"position": { "x": 40, "y": 40, "w": 20, "h": 10 },
"events": [
{
"trigger": "click",
"actions": [
{ "type": "PAUSE_MEDIA" }
]
}
]
}
]
}
});
Copy Config from Tool
In the tool's JSON panel, click the copy button to get a ready-to-use ZWPlayer configuration snippet.
Live Preview
Press P or click the Preview button to open a full ZWPlayer instance with your annotation config. Click annotations to test interactions. Press Esc to exit.
Using ZWMAP JSON
Store the exported ZWMAP JSON on a server. Your application can fetch it and pass the parsed nodes array directly to ZWPlayer's annotations config property.
Using a JSON URL
Instead of passing an object, you can pass the ZWMAP JSON file URL directly as a string. ZWPlayer will fetch and parse it automatically:
var player = new ZWPlayer({
playerElm: 'mse',
url: 'https://cdn.example.com/video.mp4',
annotations: 'https://cdn.example.com/annotations/movie_annotation.json'
});
Deployment: Download the ZWMAP JSON file and upload it to your web server. Ensure the JSON file is publicly accessible. ZWPlayer will automatically load and render annotations during video playback.
Drag & Drop Loading
You can also load annotations by dragging files directly onto the ZWPlayer instance:
- Annotation JSON only: Drop a *_annotation.json file onto the player to load annotations for the currently playing video.
- Video + Annotation together: Drag a video file along with its annotation JSON — the player will auto-match them by filename (e.g., movie.mp4 matches movie_annotation.json).
- Playlist drag: Drop multiple videos with their annotation files to create a playlist with interactive annotations for each item.
Note: Dropped JSON files must use the ZWMAP protocol format (zwp_type set to "annotation"). The player will automatically parse the nodes array.