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.