diff --git a/src/pages/tools/video/flip/service.ts b/src/pages/tools/video/flip/service.ts new file mode 100644 index 0000000..873d769 --- /dev/null +++ b/src/pages/tools/video/flip/service.ts @@ -0,0 +1,43 @@ +import { FFmpeg } from '@ffmpeg/ffmpeg'; +import { fetchFile } from '@ffmpeg/util'; +import { FlipOrientation } from './types'; + +const ffmpeg = new FFmpeg(); + +export async function flipVideo( + input: File, + orientation: FlipOrientation +): Promise { + if (!ffmpeg.loaded) { + await ffmpeg.load({ + wasmURL: + 'https://cdn.jsdelivr.net/npm/@ffmpeg/core@0.12.9/dist/esm/ffmpeg-core.wasm' + }); + } + + const inputName = 'input.mp4'; + const outputName = 'output.mp4'; + await ffmpeg.writeFile(inputName, await fetchFile(input)); + + const flipMap: Record = { + horizontal: 'hflip', + vertical: 'vflip' + }; + const flipFilter = flipMap[orientation]; + + const args = ['-i', inputName]; + if (flipFilter) { + args.push('-vf', flipFilter); + } + + args.push('-c:v', 'libx264', '-preset', 'ultrafast', outputName); + + await ffmpeg.exec(args); + + const flippedData = await ffmpeg.readFile(outputName); + return new File( + [new Blob([flippedData], { type: 'video/mp4' })], + `${input.name.replace(/\.[^/.]+$/, '')}_flipped.mp4`, + { type: 'video/mp4' } + ); +} diff --git a/src/pages/tools/video/flip/types.ts b/src/pages/tools/video/flip/types.ts new file mode 100644 index 0000000..6f2258c --- /dev/null +++ b/src/pages/tools/video/flip/types.ts @@ -0,0 +1,5 @@ +export type FlipOrientation = 'horizontal' | 'vertical'; + +export type InitialValuesType = { + orientation: FlipOrientation; +};