fix(video): 降低浏览器拼接FS错误概率
This commit is contained in:
1 parent
a3987d07d9
commit
a9b95f4b39
2 files changed
+24
-31
No files matched your search
@@ -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 {
|
||||
|
||||
@@ -274,7 +274,7 @@
|
||||
<script src="/static/common/js/pwa.js?v=0.1.1"></script>
|
||||
<script src="/static/vendor/ffmpeg/ffmpeg.js?v=0.1.0"></script>
|
||||
<script src="/static/vendor/ffmpeg/ffmpeg-util.js?v=0.1.0"></script>
|
||||
<script src="/static/public/js/video.js?v=0.4.1"></script>
|
||||
<script src="/static/public/js/video.js?v=0.4.2"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
Reference in new issue
Block a user