🎞 GPU-fast decoding
Video frames are decoded straight into GPU textures and wrapped as SkImages — no CPU round trip, no per-frame copies.
🖌 Draw with Skia
Compose frames with the full React Native Skia imperative API inside a worklet: shaders, paragraphs, filters, anything.
🪞 Preview = Export
The same drawFrame worklet renders the live preview and the exported file. What you see is exactly what you save.
🎵 Audio mixing
Play video soundtracks and standalone audio items in sync during playback, mixed into an AAC track on export.
⚡️ Hardware encoders
Export through MediaCodec on Android and AVAssetWriter on iOS, feeding the encoder GPU textures with zero readback.
📱 Device-aware
Query Android decoding/encoding capabilities to pick a resolution, frame rate and bit rate the device actually supports.
One worklet, every frame
const { currentFrame } = useVideoCompositionPlayer({
composition,
width, height,
autoPlay: true,
drawFrame: ({ canvas, currentTime, frames }) => {
'worklet';
// draw anything with the Skia canvas API —
// video frames arrive as GPU textures
},
});
return (
<Canvas style={{ width, height }}>
<Image image={currentFrame} width={width} height={height} />
</Canvas>
);

Learn by example
Three complete tutorial apps are built on this library: Island Studio (a tiny video editor — montage, shader transitions, draggable overlays, soundtracks), Caption Studio (word-timed auto-captions) and Wave Studio (an audio-reactive music visualizer with no video items at all).