Fix video: use mpeg4 software encoder (v4l2m2m hw fails on this RPi)

This commit is contained in:
treamz 2026-03-22 00:15:05 +03:00
parent a048e84f26
commit b079263534

View File

@ -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;
}