mes-engine
Version:
A powerful and flexible video processing framework for Node.js with support for multiple processing engines, adaptive streaming, and intelligent caching.
51 lines (46 loc) • 1.59 kB
text/typescript
// engines/FFmpegEngine.ts
import { spawn } from 'child_process';
import { VideoEngine } from '../core/VideoEngine';
import { QualityLevel } from '../core/types';
export class FFmpegEngine extends VideoEngine {
async processChunk(
inputPath: string,
outputPath: string,
startTime: number,
quality: QualityLevel
): Promise<void> {
return new Promise((resolve, reject) => {
const ffmpeg = spawn('ffmpeg', [
'-i', inputPath,
'-ss', startTime.toString(),
'-t', '10',
'-vf', `scale=-1:${quality.height}`,
'-c:v', 'libx264',
'-b:v', quality.bitrate,
'-c:a', 'aac',
'-b:a', '128k',
'-preset', 'fast',
'-y',
outputPath
]);
ffmpeg.on('close', code => {
code === 0 ? resolve() : reject(new Error(`FFmpeg error: ${code}`));
});
});
}
async getDuration(inputPath: string): Promise<number> {
return new Promise((resolve, reject) => {
const ffprobe = spawn('ffprobe', [
'-v', 'error',
'-show_entries', 'format=duration',
'-of', 'default=noprint_wrappers=1:nokey=1',
inputPath
]);
let output = '';
ffprobe.stdout.on('data', data => output += data);
ffprobe.on('close', code => {
code === 0 ? resolve(parseFloat(output)) : reject(new Error(`FFprobe error: ${code}`));
});
});
}
}