ffmpegwasm / ffmpeg.wasm

FFmpeg for browser, powered by WebAssembly
https://ffmpegwasm.netlify.app
MIT License
14.1k stars 826 forks source link

Uncaught RuntimeError: abort(OOM) #183

Open seanmavley opened 3 years ago

seanmavley commented 3 years ago

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 size

In wasm, looks like this

      await ffmpeg.run(
        '-i',
        'tempVideo.mp4',
        '-i',
        'tempLogo.png',
        '-filter_complex',
        'overlay=(W-w)/2:(H-h)/2',
        'temp.mp4'
      );

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

benz2012 commented 1 year 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.

deedeedev commented 1 year ago

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)
wonderkidshihab commented 2 weeks ago

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)'}