Files
omni-tools/src/pages/tools/video/compress/service.ts
Ibrahima G. Coulibaly 9a9ce814fd ```
feat: fix Blob type in tools (main)

This commit fixes a type-related issue. The 'Blob'
constructor was used without specifying 'as any' for the
data argument in several tools. This change ensures
correctness and prevents potential type errors.

The following files were modified:
- src/pages/tools/video/change-speed/index.tsx
- src/pages/tools/video/crop-video/service.ts
- src/pages/tools/audio/trim/service.ts
- src/pages/tools/video/merge-video/service.ts
- src/pages/tools/video/rotate/service.ts
- src/pages/tools/image/generic/rotate/service.ts
- src/pages/tools/pdf/merge-pdf/service.ts
- src/pages/tools/pdf/rotate-pdf/service.ts
- src/pages/tools/video/compress/service.ts
- src/pages/tools/video/flip/service.ts
- src/pages/tools/video/trim/index.tsx
- src/pages/tools/video/loop/service.ts
- src/pages/tools/audio/extract-audio/service.ts
- src/pages/tools/pdf/split-pdf/service.ts
- src/pages/tools/audio/change-speed/service.ts
- src/pages/tools/image/generic/resize/service.ts
- src/pages/tools/video/gif/change-speed/index.tsx
- src/pages/tools/audio/merge-audio/service.ts
- src/pages/tools/video/video-to-gif/index.tsx
2025-10-02 22:33:34 +01:00

61 lines
1.5 KiB
TypeScript

import { FFmpeg } from '@ffmpeg/ffmpeg';
import { fetchFile } from '@ffmpeg/util';
const ffmpeg = new FFmpeg();
export type VideoResolution = 240 | 360 | 480 | 720 | 1080;
export interface CompressVideoOptions {
width: VideoResolution;
crf: number; // Constant Rate Factor (quality): lower = better quality, higher = smaller file
preset: string; // Encoding speed preset
}
export async function compressVideo(
input: File,
options: CompressVideoOptions
): Promise<File> {
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));
// Calculate height as -1 to maintain aspect ratio
const scaleFilter = `scale=${options.width}:-2`;
const args = [
'-i',
inputName,
'-vf',
scaleFilter,
'-c:v',
'libx264',
'-crf',
options.crf.toString(),
'-preset',
options.preset,
'-c:a',
'aac', // Copy audio stream
outputName
];
try {
await ffmpeg.exec(args);
} catch (error) {
console.error('FFmpeg execution failed:', error);
}
const compressedData = await ffmpeg.readFile(outputName);
return new File(
[new Blob([compressedData as any], { type: 'video/mp4' })],
`${input.name.replace(/\.[^/.]+$/, '')}_compressed_${options.width}p.mp4`,
{ type: 'video/mp4' }
);
}