Skip to content

Multicam highlights ​

Two cameras of one scene switched at camera B's shot boundaries, with the dense segment picked by the transcript's silences.

What the manifest gives it ​

cam-b has shots at 0, 10, 25 and 40 s; cam-a has the transcript and its silences. Cuts take seconds.

What the file shows ​

  • <Multicam> on a free track places the cuts at their absolute times; the resolver generates one clip per cut.
  • multicam/flatten writes the generated clips as literal <Clip>s once the switching is settled.
  • The pull quote between the first long pause and the second is kept on a hidden track as a reference.

The file ​

tsx
import { z } from "zod";

import { Angle, Clip, Composition, Cut, Multicam, Title, Track } from "@cutcraft/kit";

export const schema = z.object({
  title: z.string().describe("Lower-third title"),
});

export const defaults = { title: "Highlights" };

/**
 * Highlights from a two-camera recording. The multicam switches to camera B
 * at its shot boundaries; `multicam/flatten` turns the cuts into literal
 * clips once the switching is settled. The dense segment is picked by the
 * transcript's silences on camera A and kept on a hidden track as a
 * reference for the next pass.
 */
export default function Video({ title }: z.infer<typeof schema>) {
  return (
    <Composition fps={30} width={1920} height={1080} background={{ mode: "color", color: "#000000" }}>
      <Track id="cams" layout="free" name="Cameras">
        {/* Cuts take seconds; these sit on camera B's shot boundaries at 10 and 25. */}
        <Multicam id="mc" sync={0}>
          <Angle id="a" src="asset:cam-a" />
          <Angle id="b" src="asset:cam-b" />
          <Cut id="cut-1" at={0} angle="a" />
          <Cut id="cut-2" at={10} angle="b" />
          <Cut id="cut-3" at={25} angle="a" />
        </Multicam>
      </Track>

      <Track id="pull" name="Pull quote" hidden>
        {/* Between the first long pause and the second: the sentence everyone quotes. */}
        <Clip id="dense" src="asset:cam-a" in="silence:0.end" out="silence:1" />
      </Track>

      <Track id="overlays" name="Overlays">
        <Title
          id="lower"
          anchor="start"
          offset={0.5}
          duration={4}
          size={72}
          weight={700}
          align="left"
          valign="bottom"
          transform={{ position: { x: 120, y: -140 } }}
          animation={{ preset: "slide-left", in: 0.3, out: 0.3 }}
        >
          {title}
        </Title>
      </Track>
    </Composition>
  );
}

What the editor can do ​

  • Move a cut: at changes, the previous clip shortens, the next lengthens.
  • Flatten, then trim and reorder the clips like any other.

What to check ​

  • No lint warnings expected.
  • captureSheet([2, 12, 27]): camera A, camera B, camera A again.

MIT licensed.