diff --git a/ts/examples/vite-example/src/App.tsx b/ts/examples/vite-example/src/App.tsx index 7b1795e90..517259ef4 100644 --- a/ts/examples/vite-example/src/App.tsx +++ b/ts/examples/vite-example/src/App.tsx @@ -11,6 +11,7 @@ import WhipExample from './examples/WhipExample'; import DemoExample from './examples/Demo'; import MultipleOutputs from './examples/MultipleOutputs'; import MediaStreamInput from './examples/MediaStreamExample'; +import UploadMp4Example from './examples/UploadMp4Example'; setWasmBundleUrl('/assets/smelter.wasm'); @@ -25,6 +26,7 @@ function App() { camera: , screenCapture: , mediaStream: , + uploadMp4: , home: , demo: , }; @@ -49,6 +51,7 @@ function App() { +

Smelter rendering engine examples

diff --git a/ts/examples/vite-example/src/components/SmelterVideo.tsx b/ts/examples/vite-example/src/components/SmelterVideo.tsx index d89567dd2..d0d7a214a 100644 --- a/ts/examples/vite-example/src/components/SmelterVideo.tsx +++ b/ts/examples/vite-example/src/components/SmelterVideo.tsx @@ -1,5 +1,5 @@ -import React, { useCallback, useEffect, useState } from 'react'; -import Smelter from '@swmansion/smelter-web-wasm'; +import React, { useCallback } from 'react'; +import type Smelter from '@swmansion/smelter-web-wasm'; type VideoProps = React.DetailedHTMLProps< React.VideoHTMLAttributes, @@ -7,14 +7,14 @@ type VideoProps = React.DetailedHTMLProps< >; type CompositorVideoProps = { - onVideoCreate?: (smelter: Smelter) => Promise; - onVideoStarted?: (smelter: Smelter) => Promise; + outputId: string; + onVideoCreated?: (smelter: Smelter) => Promise; + smelter: Smelter; children: React.ReactElement; } & VideoProps; export default function CompositorVideo(props: CompositorVideoProps) { - const { onVideoCreate, onVideoStarted, children, ...videoProps } = props; - const [smelter, setSmelter] = useState(undefined); + const { outputId, onVideoCreated, children, smelter, ...videoProps } = props; const videoRef = useCallback( async (video: HTMLVideoElement | null) => { @@ -22,15 +22,11 @@ export default function CompositorVideo(props: CompositorVideoProps) { return; } - const smelter = new Smelter({}); - - await smelter.init(); - - if (onVideoCreate) { - await onVideoCreate(smelter); + if (onVideoCreated) { + await onVideoCreated(smelter); } - const { stream } = await smelter.registerOutput('output', children, { + const { stream } = await smelter.registerOutput(outputId, children, { type: 'stream', video: { resolution: { @@ -41,27 +37,13 @@ export default function CompositorVideo(props: CompositorVideoProps) { audio: true, }); - await smelter.start(); - setSmelter(smelter); - - if (onVideoStarted) { - await onVideoStarted(smelter); - } if (stream) { video.srcObject = stream; await video.play(); } }, - [onVideoCreate, onVideoStarted, videoProps.width, videoProps.height, children] + [onVideoCreated, videoProps.width, videoProps.height, smelter, outputId] ); - useEffect(() => { - return () => { - if (smelter) { - void smelter.terminate(); - } - }; - }, [smelter]); - return