mirror of
https://github.com/iib0011/omni-tools.git
synced 2025-12-29 16:16:02 +00:00
109 lines
2.0 KiB
TypeScript
109 lines
2.0 KiB
TypeScript
|
|
import { FFmpeg } from '@ffmpeg/ffmpeg';
|
||
|
|
import { fetchFile } from '@ffmpeg/util';
|
||
|
|
import { InitialValuesType } from './types';
|
||
|
|
|
||
|
|
const ffmpeg = new FFmpeg();
|
||
|
|
|
||
|
|
export async function trimAudio(
|
||
|
|
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.mp3';
|
||
|
|
await ffmpeg.writeFile(inputName, await fetchFile(input));
|
||
|
|
|
||
|
|
const { startTime, endTime, outputFormat } = options;
|
||
|
|
const outputName = `output.${outputFormat}`;
|
||
|
|
|
||
|
|
// Build FFmpeg arguments for trimming
|
||
|
|
let args: string[] = [
|
||
|
|
'-i',
|
||
|
|
inputName,
|
||
|
|
'-ss',
|
||
|
|
startTime, // Start time
|
||
|
|
'-to',
|
||
|
|
endTime, // End time
|
||
|
|
'-c',
|
||
|
|
'copy' // Copy without re-encoding for speed
|
||
|
|
];
|
||
|
|
|
||
|
|
// Add format-specific arguments
|
||
|
|
if (outputFormat === 'mp3') {
|
||
|
|
args = [
|
||
|
|
'-i',
|
||
|
|
inputName,
|
||
|
|
'-ss',
|
||
|
|
startTime,
|
||
|
|
'-to',
|
||
|
|
endTime,
|
||
|
|
'-ar',
|
||
|
|
'44100',
|
||
|
|
'-ac',
|
||
|
|
'2',
|
||
|
|
'-b:a',
|
||
|
|
'192k',
|
||
|
|
'-f',
|
||
|
|
'mp3',
|
||
|
|
outputName
|
||
|
|
];
|
||
|
|
} else if (outputFormat === 'aac') {
|
||
|
|
args = [
|
||
|
|
'-i',
|
||
|
|
inputName,
|
||
|
|
'-ss',
|
||
|
|
startTime,
|
||
|
|
'-to',
|
||
|
|
endTime,
|
||
|
|
'-c:a',
|
||
|
|
'aac',
|
||
|
|
'-b:a',
|
||
|
|
'192k',
|
||
|
|
'-f',
|
||
|
|
'adts',
|
||
|
|
outputName
|
||
|
|
];
|
||
|
|
} else if (outputFormat === 'wav') {
|
||
|
|
args = [
|
||
|
|
'-i',
|
||
|
|
inputName,
|
||
|
|
'-ss',
|
||
|
|
startTime,
|
||
|
|
'-to',
|
||
|
|
endTime,
|
||
|
|
'-acodec',
|
||
|
|
'pcm_s16le',
|
||
|
|
'-ar',
|
||
|
|
'44100',
|
||
|
|
'-ac',
|
||
|
|
'2',
|
||
|
|
'-f',
|
||
|
|
'wav',
|
||
|
|
outputName
|
||
|
|
];
|
||
|
|
}
|
||
|
|
|
||
|
|
await ffmpeg.exec(args);
|
||
|
|
|
||
|
|
const trimmedAudio = await ffmpeg.readFile(outputName);
|
||
|
|
|
||
|
|
let mimeType = 'audio/mp3';
|
||
|
|
if (outputFormat === 'aac') mimeType = 'audio/aac';
|
||
|
|
if (outputFormat === 'wav') mimeType = 'audio/wav';
|
||
|
|
|
||
|
|
return new File(
|
||
|
|
[
|
||
|
|
new Blob([trimmedAudio], {
|
||
|
|
type: mimeType
|
||
|
|
})
|
||
|
|
],
|
||
|
|
`${input.name.replace(/\.[^/.]+$/, '')}_trimmed.${outputFormat}`,
|
||
|
|
{ type: mimeType }
|
||
|
|
);
|
||
|
|
}
|