From a9b95f4b39f64e16a81ced95ca6956868d07dbf5 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 17 Feb 2026 19:20:07 +0800 Subject: [PATCH] =?UTF-8?q?fix(video):=20=E9=99=8D=E4=BD=8E=E6=B5=8F?= =?UTF-8?q?=E8=A7=88=E5=99=A8=E6=8B=BC=E6=8E=A5FS=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=A6=82=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/static/public/js/video.js | 53 +++++++++++++----------------- app/static/public/pages/video.html | 2 +- 2 files changed, 24 insertions(+), 31 deletions(-) diff --git a/app/static/public/js/video.js b/app/static/public/js/video.js index 694fa12..396fda2 100644 --- a/app/static/public/js/video.js +++ b/app/static/public/js/video.js @@ -1490,43 +1490,36 @@ const segASource = `${prefix}_a_source.mp4`; const segBSource = `${prefix}_b_source.mp4`; const segA = `${prefix}_a.mp4`; - const segB = `${prefix}_b.mp4`; const listFile = `${prefix}_list.txt`; const mergedFile = `${prefix}_merged.mp4`; - await ffmpegWriteFile(ff, segASource, sourceStable); - await ffmpegWriteFile(ff, segBSource, generatedBuffer); - if (Number(trimSeconds) > 0) { - await ffmpegExec( - ff, - ['-y', '-i', segASource, '-t', trimSeconds, '-c:v', 'libx264', '-preset', 'ultrafast', '-pix_fmt', 'yuv420p', '-c:a', 'aac', '-ar', '48000', '-ac', '2', segA] - ); - await ffmpegExec( - ff, - ['-y', '-i', segBSource, '-c:v', 'libx264', '-preset', 'ultrafast', '-pix_fmt', 'yuv420p', '-c:a', 'aac', '-ar', '48000', '-ac', '2', segB] - ); + const filesToClean = [segASource, segBSource, segA, listFile, mergedFile]; + try { + if (Number(trimSeconds) <= 0) { + return new Blob([toStableUint8(generatedBuffer)], { type: 'video/mp4' }); + } + await ffmpegWriteFile(ff, segASource, sourceStable); + await ffmpegWriteFile(ff, segBSource, generatedBuffer); + await ffmpegExec(ff, ['-y', '-i', segASource, '-t', trimSeconds, '-c', 'copy', segA]); await ffmpegWriteFile( ff, listFile, - new TextEncoder().encode(`file '${segA}'\nfile '${segB}'\n`) - ); - await ffmpegExec( - ff, - ['-y', '-f', 'concat', '-safe', '0', '-i', listFile, '-c:v', 'libx264', '-preset', 'ultrafast', '-pix_fmt', 'yuv420p', '-c:a', 'aac', '-ar', '48000', '-ac', '2', mergedFile] - ); - } else { - await ffmpegExec( - ff, - ['-y', '-i', segBSource, '-c:v', 'libx264', '-preset', 'ultrafast', '-pix_fmt', 'yuv420p', '-c:a', 'aac', '-ar', '48000', '-ac', '2', mergedFile] + new TextEncoder().encode(`file '${segA}'\nfile '${segBSource}'\n`) ); + try { + await ffmpegExec(ff, ['-y', '-f', 'concat', '-safe', '0', '-i', listFile, '-c', 'copy', mergedFile]); + } catch (copyErr) { + await ffmpegExec( + ff, + ['-y', '-f', 'concat', '-safe', '0', '-i', listFile, '-c:v', 'libx264', '-preset', 'ultrafast', '-pix_fmt', 'yuv420p', '-c:a', 'aac', '-ar', '48000', '-ac', '2', mergedFile] + ); + } + const merged = await ffmpegReadFile(ff, mergedFile); + return new Blob([toStableUint8(merged)], { type: 'video/mp4' }); + } finally { + for (const file of filesToClean) { + await ffmpegDeleteFileSafe(ff, file); + } } - const merged = await ffmpegReadFile(ff, mergedFile); - await ffmpegDeleteFileSafe(ff, segASource); - await ffmpegDeleteFileSafe(ff, segBSource); - await ffmpegDeleteFileSafe(ff, segA); - await ffmpegDeleteFileSafe(ff, segB); - await ffmpegDeleteFileSafe(ff, listFile); - await ffmpegDeleteFileSafe(ff, mergedFile); - return new Blob([toStableUint8(merged)], { type: 'video/mp4' }); }; try { diff --git a/app/static/public/pages/video.html b/app/static/public/pages/video.html index c6fd054..b17a150 100644 --- a/app/static/public/pages/video.html +++ b/app/static/public/pages/video.html @@ -274,7 +274,7 @@ - +