From 90cb1b77da72948b2147811173543b51b8370db1 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Tue, 23 Aug 2022 19:33:58 +0200 Subject: [PATCH 1/4] Use frames for progress ratio --- src/createFFmpeg.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/createFFmpeg.js b/src/createFFmpeg.js index d4af6f9..c8ce1fd 100644 --- a/src/createFFmpeg.js +++ b/src/createFFmpeg.js @@ -25,6 +25,8 @@ module.exports = (_options = {}) => { let logging = optLog; let progress = optProgress; let duration = 0; + let frames = 0; + let readFrames = false; let ratio = 0; const detectCompletion = (message) => { @@ -53,11 +55,17 @@ module.exports = (_options = {}) => { prog({ duration: d, ratio }); if (duration === 0 || duration > d) { duration = d; + readFrames = true; } + } else if (readFrames && message.startsWith(' Stream')) { + const fps = parseFloat(message.match(/(\d+) fps/)[1]); + frames = duration * fps; + readFrames = false; } else if (message.startsWith('frame') || message.startsWith('size')) { const ts = message.split('time=')[1].split(' ')[0]; const t = ts2sec(ts); - ratio = t / duration; + const f = parseFloat(message.match(/frame=\s*(\d+)/)[1]); + ratio = Math.min(f / frames, 1); prog({ ratio, time: t }); } else if (message.startsWith('video:')) { prog({ ratio: 1 }); From f5cd68c8a226ffe84c06333d083a08b703acc7f8 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Thu, 25 Aug 2022 00:37:12 +0200 Subject: [PATCH 2/4] Revert to duration ratio for audio --- src/createFFmpeg.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/createFFmpeg.js b/src/createFFmpeg.js index c8ce1fd..0b805f4 100644 --- a/src/createFFmpeg.js +++ b/src/createFFmpeg.js @@ -58,14 +58,23 @@ module.exports = (_options = {}) => { readFrames = true; } } else if (readFrames && message.startsWith(' Stream')) { - const fps = parseFloat(message.match(/(\d+) fps/)[1]); - frames = duration * fps; + const match = message.match(/(\d+) fps/); + if (match) { + const fps = parseFloat(match[1]); + frames = duration * fps; + } else { + frames = 0; + }; readFrames = false; } else if (message.startsWith('frame') || message.startsWith('size')) { const ts = message.split('time=')[1].split(' ')[0]; const t = ts2sec(ts); const f = parseFloat(message.match(/frame=\s*(\d+)/)[1]); - ratio = Math.min(f / frames, 1); + if (frames) { + ratio = Math.min(f / frames, 1); + } else { + ratio = t / duration; + }; prog({ ratio, time: t }); } else if (message.startsWith('video:')) { prog({ ratio: 1 }); From 1fe1b5ba61854f2e37f83f412b00510446386f52 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Thu, 25 Aug 2022 00:37:58 +0200 Subject: [PATCH 3/4] Support fractional fps --- src/createFFmpeg.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/createFFmpeg.js b/src/createFFmpeg.js index 0b805f4..e7b6f7f 100644 --- a/src/createFFmpeg.js +++ b/src/createFFmpeg.js @@ -58,7 +58,7 @@ module.exports = (_options = {}) => { readFrames = true; } } else if (readFrames && message.startsWith(' Stream')) { - const match = message.match(/(\d+) fps/); + const match = message.match(/([\d\.]+) fps/); if (match) { const fps = parseFloat(match[1]); frames = duration * fps; From c309c569fa76c1602c6d79f5b8f1758fb3a51985 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Thu, 25 Aug 2022 00:41:53 +0200 Subject: [PATCH 4/4] Frame ratio also in src/util/parseProgress.js --- src/utils/parseProgress.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/utils/parseProgress.js b/src/utils/parseProgress.js index dc1658a..6297df6 100644 --- a/src/utils/parseProgress.js +++ b/src/utils/parseProgress.js @@ -1,4 +1,6 @@ let duration = 0; +let frames = 0; +let readFrames = false; let ratio = 0; const ts2sec = (ts) => { @@ -14,11 +16,26 @@ module.exports = (message, progress) => { progress({ duration: d, ratio }); if (duration === 0 || duration > d) { duration = d; + readFrames = true; } + } else if (readFrames && message.startsWith(' Stream')) { + const match = message.match(/([\d\.]+) fps/); + if (match) { + const fps = parseFloat(match[1]); + frames = duration * fps; + } else { + frames = 0; + }; + readFrames = false; } else if (message.startsWith('frame') || message.startsWith('size')) { const ts = message.split('time=')[1].split(' ')[0]; const t = ts2sec(ts); - ratio = t / duration; + const f = parseFloat(message.match(/frame=\s*(\d+)/)[1]); + if (frames) { + ratio = Math.min(f / frames, 1); + } else { + ratio = t / duration; + }; progress({ ratio, time: t }); } else if (message.startsWith('video:')) { progress({ ratio: 1 });