mirror of
https://github.com/iib0011/omni-tools.git
synced 2025-12-29 16:16:02 +00: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
68 lines
1.7 KiB
TypeScript
68 lines
1.7 KiB
TypeScript
import { FFmpeg } from '@ffmpeg/ffmpeg';
|
|
import { fetchFile } from '@ffmpeg/util';
|
|
import { InitialValuesType } from './types';
|
|
|
|
const ffmpeg = new FFmpeg();
|
|
|
|
export async function getVideoDimensions(
|
|
file: File
|
|
): Promise<{ width: number; height: number }> {
|
|
return new Promise((resolve, reject) => {
|
|
const video = document.createElement('video');
|
|
const url = URL.createObjectURL(file);
|
|
|
|
video.onloadedmetadata = () => {
|
|
URL.revokeObjectURL(url);
|
|
resolve({
|
|
width: video.videoWidth,
|
|
height: video.videoHeight
|
|
});
|
|
};
|
|
|
|
video.onerror = () => {
|
|
URL.revokeObjectURL(url);
|
|
reject(new Error('Failed to load video metadata'));
|
|
};
|
|
|
|
video.src = url;
|
|
});
|
|
}
|
|
|
|
export async function cropVideo(
|
|
input: File,
|
|
options: InitialValuesType
|
|
): 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));
|
|
|
|
const args = [];
|
|
|
|
if (options.width <= 0 || options.height <= 0) {
|
|
throw new Error('Width and height must be positive');
|
|
}
|
|
|
|
args.push('-i', inputName);
|
|
args.push(
|
|
'-vf',
|
|
`crop=${options.width}:${options.height}:${options.x}:${options.y}`
|
|
);
|
|
args.push('-c:v', 'libx264', '-preset', 'ultrafast', outputName);
|
|
|
|
await ffmpeg.exec(args);
|
|
|
|
const croppedData = await ffmpeg.readFile(outputName);
|
|
return await new File(
|
|
[new Blob([croppedData as any], { type: 'video/mp4' })],
|
|
`${input.name.replace(/\.[^/.]+$/, '')}_cropped.mp4`,
|
|
{ type: 'video/mp4' }
|
|
);
|
|
}
|