Open seanmavley opened 3 years ago
Since I feel like my issue might actually have the same root cause, tacking on to yours:
Something regarding how ffmpeg allocates memory on a per-frame basis (maybe for interframe compression) is causes memory failures in ffmpeg.wasm (ie.Uncaught RuntimeError: abort(OOM)
).
I am able to write 10,000 JPEG images of 1920x1080 resolution to MEMFS, and convert those to an mp4 video, with no errors.
As soon as I start increasing the resolution of each frame, thats when I get OOM crashes. For example, at 4k (3840x2160) I can only transcode 14 frames into an mp4 before ffmpeg.wasm crashes.
MEMFS seems to have no issues holding the 10,000 images. The issue comes from ffmpeg.
I'm getting the same error while executing the following command in a loop. I am extracting parts of an mp3 file based on the timestamps on a subtitles file. It executes fine for exactly 200 iterations then crashes.
OS: Ubuntu 22.04 Runtime: Node 16.20.1
ffmpeg.run("-i", parsedAudioFilePath.base, "-ss", startTimestamp, "-to", endTimestamp, "-c", "copy", fragmentFilename);
Full error:
if(l){ra=oa?require("path").dirname(ra)+"/":__dirname+"/";ta=function(a,b){wa||(wa=require("fs"));xa||(xa=require("path"));a=xa.normalize(a);return wa.readFileSync(a,b?null:"utf8")};va=function(a){a=ta(a,!0);a.buffer||(a=new Uint8Array(a));assert(a.buffer);return a};1<process.argv.length&&(ka=process.argv[1].replace(/\\/g,"/"));ja=process.argv.slice(2);process.on("uncaughtException",function(a){if(!(a instanceof ca))throw a;});process.on("unhandledRejection",u);la=function(a){process.exit(a)};f.inspect=
RuntimeError: abort(RuntimeError: abort(OOM). Build with -s ASSERTIONS=1 for more info.). Build with -s ASSERTIONS=1 for more info.
at process.u (/home/davide/code/node/subs-audio-splitter/node_modules/@ffmpeg/core/dist/ffmpeg-core.js:25:109)
at process.emit (node:events:513:28)
at emit (node:internal/process/promises:140:20)
at processPromiseRejections (node:internal/process/promises:274:27)
at processTicksAndRejections (node:internal/process/task_queues:97:32)
Getting the same error, Here is the log:
{type: 'stderr', message: 'ffmpeg version 5.1.4 Copyright (c) 2000-2023 the FFmpeg developers'}
classes.js?v=664023e1:47 {type: 'stderr', message: 'ffmpeg version 5.1.4 Copyright (c) 2000-2023 the FFmpeg developers'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' built with emcc (Emscripten gcc/clang-like repla…3.1.40 (5c27e79dd0a9c4e27ef2326841698cdd4f6b5784)'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' built with emcc (Emscripten gcc/clang-like repla…3.1.40 (5c27e79dd0a9c4e27ef2326841698cdd4f6b5784)'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' configuration: --target-os=none --arch=x86_32 --…nable-libfribidi --enable-libass --enable-libzimg'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' configuration: --target-os=none --arch=x86_32 --…nable-libfribidi --enable-libass --enable-libzimg'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' libavutil 57. 28.100 / 57. 28.100'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' libavutil 57. 28.100 / 57. 28.100'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' libavcodec 59. 37.100 / 59. 37.100'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' libavcodec 59. 37.100 / 59. 37.100'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' libavformat 59. 27.100 / 59. 27.100'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' libavformat 59. 27.100 / 59. 27.100'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' libavdevice 59. 7.100 / 59. 7.100'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' libavdevice 59. 7.100 / 59. 7.100'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' libavfilter 8. 44.100 / 8. 44.100'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' libavfilter 8. 44.100 / 8. 44.100'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' libswscale 6. 7.100 / 6. 7.100'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' libswscale 6. 7.100 / 6. 7.100'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' libswresample 4. 7.100 / 4. 7.100'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' libswresample 4. 7.100 / 4. 7.100'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' libpostproc 56. 6.100 / 56. 6.100'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' libpostproc 56. 6.100 / 56. 6.100'}
classes.js?v=664023e1:47 {type: 'stderr', message: "Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':"}
classes.js?v=664023e1:47 {type: 'stderr', message: "Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':"}
classes.js?v=664023e1:47 {type: 'stderr', message: ' Metadata:'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' Metadata:'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' major_brand : qt '}
classes.js?v=664023e1:47 {type: 'stderr', message: ' major_brand : qt '}
classes.js?v=664023e1:47 {type: 'stderr', message: ' minor_version : 0'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' minor_version : 0'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' compatible_brands: qt '}
classes.js?v=664023e1:47 {type: 'stderr', message: ' compatible_brands: qt '}
classes.js?v=664023e1:47 {type: 'stderr', message: ' creation_time : 2024-09-03T08:22:43.000000Z'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' creation_time : 2024-09-03T08:22:43.000000Z'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' Duration: 00:02:42.67, start: 0.000000, bitrate: 2745 kb/s'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' Duration: 00:02:42.67, start: 0.000000, bitrate: 2745 kb/s'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' Stream #0:0[0x1](und): Video: h264 (High) (avc1 …, 2739 kb/s, 39.51 fps, 60 tbr, 600 tbn (default)'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' Stream #0:0[0x1](und): Video: h264 (High) (avc1 …, 2739 kb/s, 39.51 fps, 60 tbr, 600 tbn (default)'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' Metadata:'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' Metadata:'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' creation_time : 2024-09-03T08:22:43.000000Z'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' creation_time : 2024-09-03T08:22:43.000000Z'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' handler_name : Core Media Video'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' handler_name : Core Media Video'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' vendor_id : [0][0][0][0]'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' vendor_id : [0][0][0][0]'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' encoder : H.264'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' encoder : H.264'}
classes.js?v=664023e1:47 {type: 'stderr', message: 'Stream mapping:'}
classes.js?v=664023e1:47 {type: 'stderr', message: 'Stream mapping:'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))'}
classes.js?v=664023e1:47 {type: 'stderr', message: '[libx264 @ 0xdf38f0] using cpu capabilities: none!'}
classes.js?v=664023e1:47 {type: 'stderr', message: '[libx264 @ 0xdf38f0] using cpu capabilities: none!'}
classes.js?v=664023e1:47 {type: 'stderr', message: '[libx264 @ 0xdf38f0] profile High, level 5.1, 4:2:0, 8-bit'}
classes.js?v=664023e1:47 {type: 'stderr', message: '[libx264 @ 0xdf38f0] profile High, level 5.1, 4:2:0, 8-bit'}
classes.js?v=664023e1:47 {type: 'stderr', message: '[libx264 @ 0xdf38f0] 264 - core 164 - H.264/MPEG-4…qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00'}
classes.js?v=664023e1:47 {type: 'stderr', message: '[libx264 @ 0xdf38f0] 264 - core 164 - H.264/MPEG-4…qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00'}
classes.js?v=664023e1:47 {type: 'stderr', message: "Output #0, mp4, to 'output_overlay.mp4':"}
classes.js?v=664023e1:47 {type: 'stderr', message: "Output #0, mp4, to 'output_overlay.mp4':"}
classes.js?v=664023e1:47 {type: 'stderr', message: ' Metadata:'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' Metadata:'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' major_brand : qt '}
classes.js?v=664023e1:47 {type: 'stderr', message: ' major_brand : qt '}
classes.js?v=664023e1:47 {type: 'stderr', message: ' minor_version : 0'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' minor_version : 0'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' compatible_brands: qt '}
classes.js?v=664023e1:47 {type: 'stderr', message: ' compatible_brands: qt '}
classes.js?v=664023e1:47 {type: 'stderr', message: ' encoder : Lavf59.27.100'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' encoder : Lavf59.27.100'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' Stream #0:0(und): Video: h264 (avc1 / 0x31637661…), 1290x2796, q=2-31, 60 fps, 15360 tbn (default)'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' Stream #0:0(und): Video: h264 (avc1 / 0x31637661…), 1290x2796, q=2-31, 60 fps, 15360 tbn (default)'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' Metadata:'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' Metadata:'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' creation_time : 2024-09-03T08:22:43.000000Z'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' creation_time : 2024-09-03T08:22:43.000000Z'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' handler_name : Core Media Video'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' handler_name : Core Media Video'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' vendor_id : [0][0][0][0]'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' vendor_id : [0][0][0][0]'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' encoder : Lavc59.37.100 libx264'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' encoder : Lavc59.37.100 libx264'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' Side data:'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' Side data:'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A'}
classes.js?v=664023e1:47 {type: 'stderr', message: ' cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A'}
classes.js?v=664023e1:50 {progress: 0, time: 0}
classes.js?v=664023e1:50 {progress: 0, time: 0}
App.tsx:82 Progress: 0%, Current time: 0
classes.js?v=664023e1:47 {type: 'stderr', message: 'frame= 1 fps=0.0 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A speed= 0x '}
classes.js?v=664023e1:47 {type: 'stderr', message: 'frame= 1 fps=0.0 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A speed= 0x '}
classes.js?v=664023e1:50 {progress: 0, time: 0}
classes.js?v=664023e1:50 {progress: 0, time: 0}
App.tsx:82 Progress: 0%, Current time: 0
classes.js?v=664023e1:47 {type: 'stderr', message: 'frame= 38 fps=0.0 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A speed= 0x '}
classes.js?v=664023e1:47 {type: 'stderr', message: 'frame= 38 fps=0.0 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A speed= 0x '}
classes.js?v=664023e1:50 {progress: 0, time: 0}
classes.js?v=664023e1:50 {progress: 0, time: 0}
App.tsx:82 Progress: 0%, Current time: 0
classes.js?v=664023e1:47 {type: 'stderr', message: 'frame= 47 fps= 26 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A speed= 0x '}
classes.js?v=664023e1:47 {type: 'stderr', message: 'frame= 47 fps= 26 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A speed= 0x '}
classes.js?v=664023e1:47 {type: 'stderr', message: 'Aborted(OOM)'}message: "Aborted(OOM)"type: "stderr"[[Prototype]]: Object
classes.js?v=664023e1:47 {type: 'stderr', message: 'Aborted(OOM)'}
OS: windows 10 Browser: Brave (Version 1.23.71 Chromium: 90.0.4430.72 (Official Build) (64-bit)
the ffmpeg command
ffmpeg -i myfile.mp4 -i watermark.png -filter_complex "overlay=(W-w)/2:(H-h)/2" temp.mp4
where
myfile.mp4
is about 100Mb of sizeIn wasm, looks like this
Commands runs to a point, then throws the
[fferr] pthread sent an error! blob:http://localhost:4200/e85d344e-e7d0-4077-9e95-93b09522743d:1: Uncaught RuntimeError: abort(OOM). Build with -s ASSERTIONS=1 for more info.
Running the example on the ffmpeg.wasm page works fine. I am able to use the command in grabbing screenshots, works fine too. I'm taking it a step further with trying to add overlay to a video, and that's where the errors are coming from