--- name: calculate-metadata description: Dynamically set composition duration, dimensions, and props metadata: tags: calculateMetadata, duration, dimensions, props, dynamic --- # Using calculateMetadata Use `calculateMetadata` on a `` to dynamically set duration, dimensions, and transform props before rendering. Use it when metadata depends on input props, fetched data, or asset metadata. For static dimensions, duration, FPS, and initial props, inline the values on `` instead. ```tsx ``` ## Setting duration based on a video Use the [`getVideoDuration`](../remotion-multimedia/get-video-duration.md) and [`getVideoDimensions`](../remotion-multimedia/get-video-dimensions.md) skills to get the video duration and dimensions: ```tsx import { CalculateMetadataFunction } from "remotion"; import { getVideoDuration } from "./get-video-duration"; const calculateMetadata: CalculateMetadataFunction = async ({ props, }) => { const durationInSeconds = await getVideoDuration(props.videoSrc); return { durationInFrames: Math.ceil(durationInSeconds * 30), }; }; ``` ## Matching dimensions of a video Use the [`getVideoDimensions`](../remotion-multimedia/get-video-dimensions.md) skill to get the video dimensions: ```tsx import { CalculateMetadataFunction } from "remotion"; import { getVideoDuration } from "./get-video-duration"; import { getVideoDimensions } from "./get-video-dimensions"; const calculateMetadata: CalculateMetadataFunction = async ({ props, }) => { const dimensions = await getVideoDimensions(props.videoSrc); return { width: dimensions.width, height: dimensions.height, }; }; ``` ## Setting duration based on multiple videos ```tsx const calculateMetadata: CalculateMetadataFunction = async ({ props, }) => { const metadataPromises = props.videos.map((video) => getVideoDuration(video.src), ); const allMetadata = await Promise.all(metadataPromises); const totalDuration = allMetadata.reduce( (sum, durationInSeconds) => sum + durationInSeconds, 0, ); return { durationInFrames: Math.ceil(totalDuration * 30), }; }; ``` ## Setting a default outName Set the default output filename based on props: ```tsx const calculateMetadata: CalculateMetadataFunction = async ({ props, }) => { return { defaultOutName: `video-${props.id}`, // .mp4 is added automatically }; }; ``` ## Transforming props Fetch data or transform props before rendering: ```tsx const calculateMetadata: CalculateMetadataFunction = async ({ props, abortSignal, }) => { const response = await fetch(props.dataUrl, { signal: abortSignal }); const data = await response.json(); return { props: { ...props, fetchedData: data, }, }; }; ``` The `abortSignal` cancels stale requests when props change in the Studio. ## Return value All fields are optional. Returned values override the `` props: - `durationInFrames`: Number of frames - `width`: Composition width in pixels - `height`: Composition height in pixels - `fps`: Frames per second - `props`: Transformed props passed to the component - `defaultOutName`: Default output filename - `defaultCodec`: Default codec for rendering