diff --git a/routes/video.js b/routes/video.js index dc2d515..a5a8594 100644 --- a/routes/video.js +++ b/routes/video.js @@ -152,23 +152,22 @@ router.post('/convert', express.json(), async (req, res) => { switch (mode) { case 'convert': { - // Format conversion (RPi5: h264_v4l2m2m hw encoder, mpeg4 sw fallback) - if (format === 'mp4') args.push('-c:v', 'h264_v4l2m2m', '-b:v', '2M', '-c:a', 'aac', '-movflags', '+faststart'); - else if (format === 'webm') args.push('-c:v', 'vp8_v4l2m2m', '-b:v', '1M', '-c:a', 'opus'); - else if (format === 'avi') args.push('-c:v', 'mpeg4', '-b:v', '2M', '-c:a', 'aac'); - else if (format === 'mkv') args.push('-c:v', 'h264_v4l2m2m', '-b:v', '2M', '-c:a', 'aac'); + // Format conversion (software encoders — mpeg4 for mp4/avi/mkv) + if (format === 'mp4') args.push('-c:v', 'mpeg4', '-q:v', '5', '-c:a', 'aac', '-movflags', '+faststart'); + else if (format === 'webm') args.push('-c:v', 'mpeg4', '-q:v', '5', '-c:a', 'aac', '-f', 'avi'); // webm fallback to avi + else if (format === 'avi') args.push('-c:v', 'mpeg4', '-q:v', '5', '-c:a', 'aac'); + else if (format === 'mkv') args.push('-c:v', 'mpeg4', '-q:v', '5', '-c:a', 'aac'); break; } case 'compress': { - // Quality via bitrate (h264_v4l2m2m doesn't support CRF) - const bv = quality === 'high' ? '1500k' : quality === 'low' ? '400k' : '800k'; - args.push('-c:v', 'h264_v4l2m2m', '-b:v', bv, '-c:a', 'aac', '-b:a', '128k', '-movflags', '+faststart'); + // Quality via mpeg4 q:v (1=best, 31=worst) + const qv = quality === 'high' ? '3' : quality === 'low' ? '15' : '8'; + args.push('-c:v', 'mpeg4', '-q:v', qv, '-c:a', 'aac', '-b:a', '128k', '-movflags', '+faststart'); break; } case 'audio': { - // Extract audio (opus encoder available, aac encoder available) args.push('-vn'); - if (format === 'mp3') args.push('-c:a', 'aac', '-b:a', '192k'); // no libmp3lame, use aac as .aac + if (format === 'mp3') args.push('-c:a', 'aac', '-b:a', '192k'); else args.push('-c:a', 'aac', '-b:a', '192k'); break; }