diff --git a/apps/browser/transcode.html b/apps/browser/transcode.html index d06cad8..1b2ca23 100644 --- a/apps/browser/transcode.html +++ b/apps/browser/transcode.html @@ -21,8 +21,8 @@ ffmpeg.on("log", ({ message }) => { console.log(message); }) - ffmpeg.on("progress", ({ progress }) => { - message.innerHTML = `${progress * 100} %`; + ffmpeg.on("progress", ({ progress, elapsed }) => { + message.innerHTML = `${progress * 100} %, elapsed: ${elapsed / 1000000} s`; }); await ffmpeg.load({ coreURL: "/packages/core/dist/umd/ffmpeg-core.js", diff --git a/packages/ffmpeg/src/types.ts b/packages/ffmpeg/src/types.ts index 566c8a2..3618901 100644 --- a/packages/ffmpeg/src/types.ts +++ b/packages/ffmpeg/src/types.ts @@ -119,6 +119,7 @@ export interface LogEvent { export interface ProgressEvent { progress: number; + elapsed: number; } export type ExitCode = number; diff --git a/packages/ffmpeg/src/worker.ts b/packages/ffmpeg/src/worker.ts index 0df7247..a8c8eb2 100644 --- a/packages/ffmpeg/src/worker.ts +++ b/packages/ffmpeg/src/worker.ts @@ -72,8 +72,11 @@ const load = async ({ ffmpeg.setLogger((data) => self.postMessage({ type: FFMessageType.LOG, data }) ); - ffmpeg.setProgress((progress: number) => - self.postMessage({ type: FFMessageType.PROGRESS, data: { progress } }) + ffmpeg.setProgress((data) => + self.postMessage({ + type: FFMessageType.PROGRESS, + data, + }) ); return first; }; diff --git a/packages/types/types/index.d.ts b/packages/types/types/index.d.ts index 09b832d..9cd8570 100644 --- a/packages/types/types/index.d.ts +++ b/packages/types/types/index.d.ts @@ -58,7 +58,7 @@ export interface FFmpegCoreModule { reset: () => void; setLogger: (logger: (log: Log) => void) => void; setTimeout: (timeout: number) => void; - setProgress: (handler: (progress: number) => void) => void; + setProgress: (handler: (progress: number, elapsed: number) => void) => void; locateFile: (path: string, prefix: string) => string; } diff --git a/src/bind/ffmpeg/bind.js b/src/bind/ffmpeg/bind.js index 68a5819..b512b5b 100644 --- a/src/bind/ffmpeg/bind.js +++ b/src/bind/ffmpeg/bind.js @@ -74,8 +74,8 @@ function setProgress(handler) { Module["progress"] = handler; } -function receiveProgress(progress) { - Module["progress"](progress); +function receiveProgress(progress, elapsed) { + Module["progress"]({ progress, elapsed }); } function reset() { diff --git a/src/fftools/ffmpeg.c b/src/fftools/ffmpeg.c index 3d296a5..e4f3ff8 100644 --- a/src/fftools/ffmpeg.c +++ b/src/fftools/ffmpeg.c @@ -1505,8 +1505,8 @@ static void print_final_stats(int64_t total_size) } } -EM_JS(void, send_progress, (double progress), { - Module.receiveProgress(progress); +EM_JS(void, send_progress, (double progress, double elapsed), { + Module.receiveProgress(progress, elapsed); }); static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time) @@ -1650,7 +1650,7 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti duration = file_duration; } } - send_progress((double)pts_abs / (double)duration); + send_progress((double)pts_abs / (double)duration, (double)pts_abs); secs = FFABS(pts) / AV_TIME_BASE; us = FFABS(pts) % AV_TIME_BASE; @@ -1736,7 +1736,7 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti if (is_last_report) { // Make sure the progress is ended with 1. - if (pts_abs != duration) send_progress(1); + if (pts_abs != duration) send_progress(1, (double)pts_abs); print_final_stats(total_size); } } diff --git a/tests/ffmpeg-core.test.js b/tests/ffmpeg-core.test.js index efb4708..158391e 100644 --- a/tests/ffmpeg-core.test.js +++ b/tests/ffmpeg-core.test.js @@ -92,7 +92,7 @@ describe(genName("setProgress()"), () => { it("should handle progress", () => { let progress = 0; - core.setProgress((_progress) => (progress = _progress)); + core.setProgress(({ progress: _progress }) => (progress = _progress)); expect(core.exec("-i", "video.mp4", "video.avi")).to.equal(0); expect(progress).to.equal(1); core.FS.unlink("video.avi");