Skip to main content

How do I make the composition the same duration as my video?

If you have a component rendering a video:

import React from 'react';
import {OffthreadVideo, staticFile} from 'remotion';

export const MyComp: React.FC = () => {
  return <OffthreadVideo src={staticFile('video.mp4')} />;
};

and you want to make the composition the same duration as the video, first make the video source a React prop:

import React from 'react';
import {OffthreadVideo, staticFile} from 'remotion';

type MyCompProps = {
  src: string;
};

export const MyComp: React.FC<MyCompProps> = ({src}) => {
  return <OffthreadVideo src={src} />;
};

Then, define a calculateMetadata() function that calculates the duration of the composition based on the video.
Install @remotion/media-parser if necessary.


import {CalculateMetadataFunction} from 'remotion';
import {parseMedia} from '@remotion/media-parser';

export const calculateMetadata: CalculateMetadataFunction<MyCompProps> = async ({props}) => {
  const {slowDurationInSeconds, dimensions} = await parseMedia({
    src: props.src,
    fields: {
      slowDurationInSeconds: true,
      dimensions: true,
    },
  });

  if (dimensions === null) {
    // For example when passing an MP3 file:
    throw new Error('Not a video file');
  }

  const fps = 30;

  return {
    durationInFrames: Math.floor(slowDurationInSeconds * fps),
    fps,
    width: dimensions.width,
    height: dimensions.height,
  };
};
note

If your asset is not CORS-enabled, you can use the getVideoMetadata function from @remotion/media-utils instead of parseMedia().

Finally, pass the calculateMetadata function to the Composition component and define the previously hardcoded src as a default prop:


import React from 'react';
import {Composition} from 'remotion';
import {MyComp, calculateMetadata} from './MyComp';

export const Root: React.FC = () => {
  return (
    <Composition
      id="MyComp"
      component={MyComp}
      durationInFrames={300}
      fps={30}
      width={1920}
      height={1080}
      defaultProps={{
        src: 'https://remotion.media/BigBuckBunny.mp4',
      }}
      calculateMetadata={calculateMetadata}
    />
  );
};

How do I make the composition the same duration as my audio?

Follow the same steps, but instead of parseMedia(), use getAudioDurationInSeconds() from @remotion/media-utils to calculate the duration of the composition based on the audio file.

See Also