mirror of
https://github.com/iib0011/omni-tools.git
synced 2025-12-09 05:14:03 +01:00
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
61 lines
1.5 KiB
TypeScript
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' }
|
|
);
|
|
}
|