OpenTimelineIO
Open Source API and interchange format for editorial timeline information.
Top Related Projects
Quick Overview
OpenTimelineIO (OTIO) is an open-source API and interchange format for editorial timeline information. Developed by the Academy Software Foundation, it aims to facilitate the exchange of timeline data between different software applications used in motion picture and media production.
Pros
- Standardizes timeline data exchange across various tools and applications
- Supports multiple file formats and provides easy conversion between them
- Extensible architecture allows for custom adapters and plugins
- Backed by major industry players, ensuring ongoing development and support
Cons
- Learning curve for developers new to timeline concepts in media production
- Limited support for some specialized timeline features in certain applications
- Requires adoption by software vendors for maximum effectiveness
- Documentation could be more comprehensive for advanced use cases
Code Examples
- Reading a timeline:
import opentimelineio as otio
timeline = otio.adapters.read_from_file("my_timeline.otio")
print(f"Timeline name: {timeline.name}")
print(f"Number of tracks: {len(timeline.tracks)}")
- Creating a simple timeline:
import opentimelineio as otio
timeline = otio.schema.Timeline("My Timeline")
track = otio.schema.Track("V1", kind=otio.schema.TrackKind.Video)
clip = otio.schema.Clip(name="My Clip", media_reference=otio.schema.ExternalReference(target_url="/path/to/media.mov"))
track.append(clip)
timeline.tracks.append(track)
- Converting between formats:
import opentimelineio as otio
timeline = otio.adapters.read_from_file("input.edl")
otio.adapters.write_to_file(timeline, "output.fcpxml")
Getting Started
To get started with OpenTimelineIO:
-
Install the library:
pip install opentimelineio
-
Import the library in your Python script:
import opentimelineio as otio
-
Start working with timelines:
# Read a timeline timeline = otio.adapters.read_from_file("my_timeline.otio") # Manipulate the timeline for track in timeline.tracks: print(f"Track: {track.name}") for clip in track: print(f" Clip: {clip.name}") # Write the timeline to a new format otio.adapters.write_to_file(timeline, "output.fcpxml")
For more detailed information and advanced usage, refer to the official documentation at https://opentimelineio.readthedocs.io/.
Competitor Comparisons
In-memory dimensional time series database.
Pros of Atlas
- Focused on time series data and metrics, providing powerful visualization and analysis tools
- Highly scalable, designed to handle large-scale distributed systems
- Integrates well with cloud environments, especially AWS
Cons of Atlas
- More complex setup and configuration compared to OpenTimelineIO
- Primarily tailored for metrics and monitoring, less versatile for general timeline management
- Steeper learning curve for users not familiar with time series data concepts
Code Comparison
Atlas (Scala):
val ds = Atlas.timeSeriesDataset()
.withName("my-metric")
.withTags(Map("app" -> "web-server"))
.withDatapoints(List(
Datapoint(timestamp, value)
))
OpenTimelineIO (Python):
timeline = otio.Timeline()
track = otio.Track(name="my_track")
clip = otio.Clip(name="my_clip", media_reference=otio.ExternalReference(target_url="/path/to/media.mov"))
track.append(clip)
timeline.tracks.append(track)
Summary
Atlas excels in monitoring and analyzing time series data for large-scale systems, while OpenTimelineIO is better suited for managing and manipulating editorial timelines in media production workflows. Atlas offers robust scalability and cloud integration, but requires more setup and domain knowledge. OpenTimelineIO provides a more intuitive interface for timeline manipulation but may not be as suitable for metrics-focused applications.
Conductor is a microservices orchestration engine.
Pros of Conductor
- Designed for orchestrating microservices and distributed systems
- Supports complex workflows with branching, looping, and dynamic task execution
- Provides a web-based UI for workflow management and monitoring
Cons of Conductor
- Steeper learning curve due to its complexity and distributed nature
- Requires additional infrastructure setup and maintenance
- May be overkill for simpler timeline-based projects
Code Comparison
OpenTimelineIO example:
from opentimelineio import Timeline, Track, Clip
timeline = Timeline()
track = Track()
clip = Clip(name="My Clip", media_reference=None)
track.append(clip)
timeline.tracks.append(track)
Conductor example:
WorkflowDef workflowDef = new WorkflowDef();
workflowDef.setName("myWorkflow");
workflowDef.setDescription("Sample workflow");
workflowDef.setVersion(1);
workflowDef.setTasks(Arrays.asList(task1, task2, task3));
Key Differences
- OpenTimelineIO focuses on timeline representation for media and entertainment
- Conductor is geared towards workflow orchestration in distributed systems
- OpenTimelineIO has a simpler API for timeline manipulation
- Conductor offers more advanced features for complex workflow management
Pros of Metacat
- Designed for large-scale metadata management across diverse data sources
- Supports a wide range of data platforms and formats
- Offers advanced search and discovery features for big data ecosystems
Cons of Metacat
- More complex setup and configuration compared to OpenTimelineIO
- Primarily focused on data catalog management, less versatile for timeline-based workflows
- Steeper learning curve for users not familiar with big data ecosystems
Code Comparison
OpenTimelineIO example:
from opentimelineio import timeline
tl = timeline.Timeline()
tl.name = "My Timeline"
clip = timeline.Clip(name="My Clip")
tl.tracks.append(timeline.Track().append(clip))
Metacat example:
import com.netflix.metacat.common.dto.TableDto;
import com.netflix.metacat.common.dto.PartitionDto;
TableDto table = new TableDto();
table.setName("my_table");
PartitionDto partition = new PartitionDto();
partition.setName("part1");
table.setPartitions(Arrays.asList(partition));
While OpenTimelineIO focuses on timeline manipulation for media production, Metacat is geared towards metadata management for large-scale data systems. OpenTimelineIO offers a more straightforward API for timeline-related tasks, while Metacat provides robust features for cataloging and managing metadata across diverse data sources.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
OpenTimelineIO
Links
- Main web site: http://opentimeline.io/
- Documentation: https://opentimelineio.readthedocs.io/
- GitHub: https://github.com/AcademySoftwareFoundation/OpenTimelineIO
- Discussion group
- Slack channel
- To join, create an account here first: https://slack.aswf.io/
- Presentations
PUBLIC BETA NOTICE
OpenTimelineIO is currently in Public Beta. That means that it may be missing some essential features and there are large changes planned. During this phase we actively encourage you to provide feedback, requests, comments, and/or contributions.
Overview
OpenTimelineIO is an interchange format and API for editorial cut information. OTIO contains information about the order and length of cuts and references to external media. It is not however, a container format for media.
For integration with applications, the core OTIO library is implemented in C++
and provides an in-memory data model, as well as library functions for
interpreting, manipulating, and serializing that data model. Within the core is
a dependency-less library for dealing strictly with time, opentime
.
The project also supports an official python binding, which is intended to be an idiomatic and ergonomic binding for python developers. The python binding includes a plugin system which supports a number of different types of plugins, most notably adapters, which can be used to read and write legacy formats into the OTIO data model.
Documentation
Documentation, including quick start, architecture, use cases, API docs, and much more, is available on ReadTheDocs
Supported VFX Platforms
The current release supports:
- VFX platform 2023, 2022, 2021, 2020
- Python 3.7 - 3.10
For more information on our vfxplatform support policy: Contribution Guidelines Documentation Page For more information on the vfxplatform: VFX Platform Homepage
Adapter Plugins
To provide interoperability with other file formats or applications lacking a native integration, the opentimelineio community has built a number of python adapter plugins. This includes Final Cut Pro XML, AAF, CMX 3600 EDL, and more.
Note: for releases after v0.16, the OpenTimelineIO PyPI package will only include the core libraries and file formats. Users that need the full set of adapter plugins should use the OpenTimelineIO-Plugins PyPI Package. Each OpenTimelineIO release will have a matching OpenTimelineIO-Plugins release.
For more information: https://github.com/AcademySoftwareFoundation/OpenTimelineIO/issues/1386
For more information about this, including supported formats, see: https://opentimelineio.readthedocs.io/en/latest/tutorials/adapters.html
All adapters except the native .otio
, .otioz
and .otiod
have been relocated to separate repositories under the OpenTimelineIO organization located here: https://github.com/OpenTimelineIO
The OTIO python bindings also support several other kinds of plugins, for more information see:
- Media Linkers - Generate media references to local media according to your local conventions.
- HookScripts - Scripts that can run at various points during OTIO execution (ie before the media linker)
- SchemaDefs - Define OTIO schemas.
Installing / Quick-Start
The Python-wrapped version of OpenTimelineIO is publicly available via PyPI. You can install OpenTimelineIO via:
python -m pip install opentimelineio
For detailed installation instructions and notes on how to run the included viewer program, see: https://opentimelineio.readthedocs.io/en/latest/tutorials/quickstart.html
Example Usage
C++:
#include <iostream>
#include "opentimelineio/timeline.h"
namespace otio = opentimelineio::OPENTIMELINEIO_VERSION;
void
main()
{
otio::ErrorStatus err;
otio::SerializableObject::Retainer<otio::Timeline> tl(
dynamic_cast<otio::Timeline*>(
otio::Timeline::from_json_file("taco.otio", &err)
)
);
const std::vector<otio::SerializableObject::Retainer<otio::Clip>> clips = (
tl->find_clips()
);
for (const auto& cl : clips)
{
otio::RationalTime dur = cl->duration();
std::cout << "Name: " << cl->name() << " [";
std::cout << dur.value() << "/" << dur.rate() << "]" << std::endl;
}
}
Python:
import opentimelineio as otio
timeline = otio.adapters.read_from_file("foo.aaf")
for clip in timeline.find_clips():
print(clip.name, clip.duration())
There are more code examples here: https://github.com/AcademySoftwareFoundation/OpenTimelineIO/tree/main/examples
Also, looking through the unit tests is a great way to see what OTIO can do: https://github.com/AcademySoftwareFoundation/OpenTimelineIO/tree/main/tests
OTIO includes a viewer program as well (see the quickstart section for instructions on installing it):
Developing
If you want to contribute to the project, please see: https://opentimelineio.readthedocs.io/en/latest/tutorials/contributing.html
You can get the latest development version via:
git clone git@github.com:AcademySoftwareFoundation/OpenTimelineIO.git --recursive
You can install development dependencies with python -m pip install .[dev]
You can also install the PySide2 dependency with python -m pip install .[view]
You may need to escape the [
depending on your shell, \[view\]
.
Currently the code base is written against python 3.7, 3.8, 3.9, 3.10 and 3.11, in keeping with the pep8 style. We ask that before developers submit pull request, they:
- run
make test
-- to ensure that none of the unit tests were broken - run
make lint
-- to ensure that coding conventions conform to pep8 - run
make coverage
-- to detect code which isn't covered
PEP8: https://www.python.org/dev/peps/pep-0008/
For advanced developers, arguments can be passed to CMake through the pip
commandline by using the CMAKE_ARGS
environment variable.
*nix Example:
env CMAKE_ARGS="-DCMAKE_VAR=VALUE1 -DCMAKE_VAR_2=VALUE2" pip install .
Additionaly, to reproduce CI failures regarding the file manifest, run:
make manifest
locally to run the python check-manifest
program.
C++ Coverage Builds
To enable C++ code coverage reporting via gcov/lcov for builds, set the following environment variables:
OTIO_CXX_COVERAGE_BUILD=ON
OTIO_CXX_BUILD_TMP_DIR=path/to/build/dir
When building/installing through pip
/setup.py
, these variables must be set
before running the install command (python -m pip install .
for example).
License
OpenTimelineIO is open source software. Please see the LICENSE.txt for details.
Nothing in the license file or this project grants any right to use Pixar or any other contributorâs trade names, trademarks, service marks, or product names.
Contact
For more information, please visit http://opentimeline.io/ or https://github.com/AcademySoftwareFoundation/OpenTimelineIO or join our discussion forum: https://lists.aswf.io/g/otio-discussion
Top Related Projects
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot