From 196859bd80c880afdf5aadb23611b7be77ba8e57 Mon Sep 17 00:00:00 2001 From: Mikael Finstad Date: Fri, 10 Apr 2020 16:36:28 +0800 Subject: [PATCH] implement cut progress for conversion --- src/App.jsx | 8 ++++++-- src/ffmpeg.js | 26 +++++++++++++++----------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 0672fdaa..73a2cafa 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1266,7 +1266,11 @@ const App = memo(() => { const includeAudio = ['fast-audio', 'slow-audio', 'slowest'].includes(speed) && ha; const encode = ['slow-audio', 'slow', 'slowest'].includes(speed); const highQuality = speed === 'slowest'; - await ffmpegHtml5ify({ filePath: fp, outPath: path, encode, includeVideo, includeAudio, highQuality }); + try { + await ffmpegHtml5ify({ filePath: fp, outPath: path, encode, includeVideo, includeAudio, highQuality, onProgress: setCutProgress }); + } finally { + setCutProgress(); + } return path; }, [getHtml5ifiedPath]); @@ -1725,7 +1729,7 @@ const App = memo(() => { {(cutProgress != null) && (
- {`${Math.floor(cutProgress * 100)} %`} + {`${(cutProgress * 100).toFixed(1)} %`}
)} diff --git a/src/ffmpeg.js b/src/ffmpeg.js index 894c5d01..8932ceea 100644 --- a/src/ffmpeg.js +++ b/src/ffmpeg.js @@ -64,7 +64,7 @@ async function runFfprobe(args) { return execa(ffprobePath, args); } -async function runFfmpeg(args) { +function runFfmpeg(args) { const ffmpegPath = getFfmpegPath(); console.log(getFfCommandLine('ffmpeg', args)); return execa(ffmpegPath, args); @@ -72,6 +72,8 @@ async function runFfmpeg(args) { function handleProgress(process, cutDuration, onProgress) { + onProgress(0); + const rl = readline.createInterface({ input: process.stderr }); rl.on('line', (line) => { try { @@ -244,8 +246,6 @@ async function cut({ console.log(ffmpegCommandLine); appendFfmpegCommandLog(ffmpegCommandLine); - onProgress(0); - const ffmpegPath = getFfmpegPath(); const process = execa(ffmpegPath, ffmpegArgs); handleProgress(process, cutDuration, onProgress); @@ -306,7 +306,13 @@ export async function cutMultiple({ return outFiles; } -export async function html5ify({ filePath, outPath, encode, includeVideo, includeAudio, highQuality }) { +export async function getDuration(filePath) { + // https://superuser.com/questions/650291/how-to-get-video-duration-in-seconds + const { stdout } = await runFfprobe(['-i', filePath, '-show_entries', 'format=duration', '-print_format', 'json']); + return parseFloat(JSON.parse(stdout).format.duration); +} + +export async function html5ify({ filePath, outPath, encode, includeVideo, includeAudio, highQuality, onProgress }) { console.log('Making HTML5 friendly version', { filePath, outPath, encode, includeVideo, includeAudio, highQuality }); let videoArgs; @@ -353,18 +359,16 @@ export async function html5ify({ filePath, outPath, encode, includeVideo, includ '-y', outPath, ]; - const { stdout } = await runFfmpeg(ffmpegArgs); + const duration = await getDuration(filePath); + const process = runFfmpeg(ffmpegArgs); + if (duration) handleProgress(process, duration, onProgress); + + const { stdout } = await process; console.log(stdout); await transferTimestamps(filePath, outPath); } -export async function getDuration(filePath) { - // https://superuser.com/questions/650291/how-to-get-video-duration-in-seconds - const { stdout } = await runFfprobe(['-i', filePath, '-show_entries', 'format=duration', '-print_format', 'json']); - return parseFloat(JSON.parse(stdout).format.duration); -} - // This is just used to load something into the player with correct length, // so user can seek and then we render frames using ffmpeg export async function html5ifyDummy(filePath, outPath) {