ditto/packages/transcode/ffmpeg.ts
2025-02-27 23:19:27 -06:00

40 lines
1,012 B
TypeScript

export interface FFmpegFlags {
'c:v'?: string;
'preset'?: string;
'loglevel'?: string;
'crf'?: string;
'c:a'?: string;
'b:a'?: string;
'movflags'?: string;
'f'?: string;
[key: string]: string | undefined;
}
export function ffmpeg(input: URL | ReadableStream<Uint8Array>, flags: FFmpegFlags): ReadableStream<Uint8Array> {
const args = ['-i', input instanceof URL ? input.href : 'pipe:0'];
for (const [key, value] of Object.entries(flags)) {
if (typeof value === 'string') {
args.push(`-${key}`, value);
}
}
args.push('pipe:1'); // Output to stdout
// Spawn the FFmpeg process
const command = new Deno.Command('ffmpeg', {
args,
stdin: input instanceof ReadableStream ? 'piped' : undefined,
stdout: 'piped',
});
const child = command.spawn();
// Pipe the input stream into FFmpeg stdin and ensure completion
if (input instanceof ReadableStream) {
input.pipeTo(child.stdin);
}
// Return the FFmpeg stdout stream
return child.stdout;
}