Skip to main content

OTIO Output

OTIO timeline data is generated automatically for highlights and is available through the otio_edit field on each highlight. You do not need to pass an OTIO yes/no flag when creating or assigning a task. We emit standard OpenTimelineIO schemas:
  • Timeline.1
  • Track.1
  • Clip.2
  • ExternalReference.1
  • RationalTime.1
  • TimeRange.1

Example Timeline

A single-clip highlight timeline:
Multi-clip timelines follow the same structure with additional Clip.2 objects on the track. Each clip represents a contiguous segment of source media — gaps between clips are dead time that is cut out.

Package and Recap EDLs

Highlight packages and recaps return a merged OTIO Timeline.1 in otio_timeline. This package-level EDL is composed from the selected highlights’ stored otio_edit payloads. Each package clip preserves the selected highlight’s media reference and source range, and adds provenance in clip metadata: Source highlights have otio_edit generated automatically for package and recap EDL generation. Package and recap creation requires every matched source highlight to have otio_edit; the API does not build package EDLs from rendered clips or editor-project JSON.

Time Mapping

OTIO start values are stream-relative, then shifted by source_start_offset. Use:
Where:
  • source_start_offset is optional and defaults to 0
  • event_stream_time_seconds is measured from stream start
srt_zero_relative_smpte_timecode is used to interpret ingest timing and align stream clocking, but it is not automatically added as an additional OTIO frame offset. If you need OTIO values in a house timeline (for example, start at 01:00:00:00), convert that timecode to frames at the task framerate and include it in source_start_offset.

Drop-Frame Rules

Drop-frame timecode (HH:MM:SS;FF) is only valid for 29.97 or 59.94.

Configuring OTIO Output

OTIO edit generation is automatic. The optional otio object on Create Task or Assign Task is only for overriding media-reference metadata or timeline offsets: Omit otio when you do not need custom OTIO metadata or offsets. OTIO edit data will still be generated. The framerate at the top level of the request (ffprobe rational format, e.g., "30000/1001") is used both for interpreting the SMPTE timecode during SRT ingest and as the rate for all OTIO RationalTime values. If omitted, the framerate is inferred from the stream, but this can be inconsistent with VFR encoding. srt_zero_relative_smpte_timecode does not replace source_start_offset; they serve different purposes:
  • srt_zero_relative_smpte_timecode: stream ingest clock interpretation
  • source_start_offset: explicit OTIO frame offset applied to output start_time.value
Example:

Deprecated: webhook_schema + wh_schema_config

Earlier versions of the API gated OTIO output through a two-field pair:
Both fields are still accepted for backward compatibility but should not be used in new integrations. OTIO edit generation no longer needs a toggle; use the top-level otio object only when you need metadata or timing overrides.

Portrait Crop (Narrative_SmartCrop Effect)

Portrait crop data is encoded as a standard OTIO effect attached to each clip in the timeline. This uses the effects array on Clip.2 to define a dynamic 9:16 crop recipe with animated control points. Each clip gets its own independent Narrative_SmartCrop effect. Control point times are relative to the clip (starting at 0, up to the clip’s duration).

Example

The same timeline from above, extended with a portrait crop effect:

Effect Schema

metadata Fields

formatting Fields

control_points[] Fields

Interpolate linearly between control points to produce a smooth camera pan.

Converting center_x to Pixels

To compute the crop window’s left edge in pixels at a given center_x: