| import {AbsoluteFill} from 'remotion'; | |
| import React, {useMemo} from 'react'; | |
| import { | |
| staticFile, | |
| useVideoConfig, | |
| Img, | |
| Easing, | |
| useCurrentFrame, | |
| interpolate, | |
| } from 'remotion'; | |
| import imageSequences from './Assets/ImageSequences.json'; | |
| import {TransitionSeries} from '@remotion/transitions'; | |
| const ImageStream = React.memo(() => { | |
| const {fps} = useVideoConfig(); | |
| const imageComponents = useMemo(() => { | |
| return imageSequences.map((entry, index) => ( | |
| <TransitionSeries.Sequence | |
| key={index} | |
| durationInFrames={fps * (entry.end - entry.start)} | |
| > | |
| <Images key={index} entry={entry} /> | |
| </TransitionSeries.Sequence> | |
| )); | |
| }, [fps]); | |
| return ( | |
| <AbsoluteFill | |
| style={{ | |
| top: '50%', | |
| left: '50%', | |
| transform: 'translate(-50%, -50%)', | |
| color: 'white', | |
| position: 'absolute', | |
| width: '100%', | |
| height: '100%', | |
| zIndex: 0, | |
| objectFit: 'cover', | |
| }} | |
| > | |
| <TransitionSeries>{imageComponents}</TransitionSeries> | |
| </AbsoluteFill> | |
| ); | |
| }); | |
| const Images = React.memo(({entry}) => { | |
| const frame = useCurrentFrame(); | |
| const {fps} = useVideoConfig(); | |
| const duration = useMemo(() => fps * 2.5, [fps]); | |
| const ImgScale = useMemo( | |
| () => | |
| interpolate(frame, [0, duration], [1, 1.2], { | |
| easing: Easing.bezier(0.65, 0, 0.35, 1), | |
| extrapolateRight: 'clamp', | |
| extrapolateLeft: 'clamp', | |
| }), | |
| [frame, duration] | |
| ); | |
| return ( | |
| <AbsoluteFill | |
| style={{ | |
| backgroundColor: 'black', | |
| }} | |
| > | |
| <Img | |
| id="imagex" | |
| style={{ | |
| transform: `translate(-50%, -50%) scale(${ImgScale})`, | |
| position: 'absolute', | |
| top: '50%', | |
| left: '50%', | |
| width: 1080, | |
| height: 1920, | |
| objectFit: 'cover', | |
| }} | |
| src={staticFile(entry.name)} | |
| /> | |
| </AbsoluteFill> | |
| ); | |
| }); | |
| export default ImageStream; | |