Help & Guide

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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Frequently Asked Questions

What are video annotations (interactive video)?
Video annotations are interactive overlay areas on a video. Users can interact with them by clicking, long-pressing, etc., to trigger actions like jumping to a time, showing information, or submitting data. This technology is widely used in interactive education, branching narratives, product showcases, and more — transforming passive viewing into active participation.
How do I create interactive video elements?
After loading a video, draw an annotation on the canvas by dragging (or press N to create one quickly), then select the node type and configure interactions in the properties panel. You can also drag preset templates from the component library, such as quizzes, votes, forms, etc.
What node types are supported?
13 node types are supported: Basic (hotspot, text, image, button), Interactive (choice, quiz, form, vote, info card), Advanced (webview, map), and System (countdown, speed controller). Each type has a dedicated configuration panel.
What are action chains?
Action chains allow a single trigger (e.g., a click) to execute multiple actions sequentially. For example, clicking a button could first pause the video, then show an info card, then jump to a specific time. Each action can be one of 7 types: seek, pause, play, open link, control node, emit message, or submit data.
What animation effects are available?
Each node supports animations in three phases: Enter (7 effects including fade-in, slide-in, zoom-in, bounce-in), Emphasis (5 effects including pulse, glow, shake, bounce, swing), and Exit (6 effects including fade-out, slide-out, zoom-out). All animations support custom duration (100–3000ms).
How do I import and export annotation configs?
Click the Export button in the JSON panel to download a ZWMAP JSON file. To import, click the Import button and select a JSON file. You can also copy the JSON text directly and paste it into your code. Configs are auto-saved to browser local storage — the tool will prompt you to recover a draft on next visit.