How do I make the composition the same duration as my video?
If you have a component rendering a video:
MyComp.tsxtsx
importReact from 'react';import {OffthreadVideo ,staticFile } from 'remotion';export constMyComp :React .FC = () => {return <OffthreadVideo src ={staticFile ('video.mp4')} />;};
MyComp.tsxtsx
importReact from 'react';import {OffthreadVideo ,staticFile } from 'remotion';export constMyComp :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:
MyComp.tsxtsx
importReact from 'react';import {OffthreadVideo ,staticFile } from 'remotion';typeMyCompProps = {src : string;};export constMyComp :React .FC <MyCompProps > = ({src }) => {return <OffthreadVideo src ={src } />;};
MyComp.tsxtsx
importReact from 'react';import {OffthreadVideo ,staticFile } from 'remotion';typeMyCompProps = {src : string;};export constMyComp :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.
MyComp.tsxtsx
import {CalculateMetadataFunction } from 'remotion';import {parseMedia } from '@remotion/media-parser';export constcalculateMetadata :CalculateMetadataFunction <MyCompProps > = async ({props }) => {const {durationInSeconds ,dimensions } = awaitparseMedia ({src :props .src ,fields : {durationInSeconds : true,dimensions : true,},});if (durationInSeconds === null) {throw newError ('Could not get video duration');}constfps = 30;return {durationInFrames :Math .floor (durationInSeconds *fps ),fps ,width :dimensions .width ,height :dimensions .height ,};};
MyComp.tsxtsx
import {CalculateMetadataFunction } from 'remotion';import {parseMedia } from '@remotion/media-parser';export constcalculateMetadata :CalculateMetadataFunction <MyCompProps > = async ({props }) => {const {durationInSeconds ,dimensions } = awaitparseMedia ({src :props .src ,fields : {durationInSeconds : true,dimensions : true,},});if (durationInSeconds === null) {throw newError ('Could not get video duration');}constfps = 30;return {durationInFrames :Math .floor (durationInSeconds *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:
Root.tsxtsx
importReact from 'react';import {Composition } from 'remotion';import {MyComp ,calculateMetadata } from './MyComp';export constRoot :React .FC = () => {return (<Composition id ="MyComp"component ={MyComp }durationInFrames ={300}fps ={30}width ={1920}height ={1080}defaultProps ={{src : 'https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4',}}calculateMetadata ={calculateMetadata }/>);};
Root.tsxtsx
importReact from 'react';import {Composition } from 'remotion';import {MyComp ,calculateMetadata } from './MyComp';export constRoot :React .FC = () => {return (<Composition id ="MyComp"component ={MyComp }durationInFrames ={300}fps ={30}width ={1920}height ={1080}defaultProps ={{src : 'https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/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.