Kagami / ffmpeg.js

Port of FFmpeg with Emscripten
Other
3.29k stars 335 forks source link

web worker no output #46

Closed iamrototo closed 4 years ago

iamrototo commented 6 years ago

Hello,

I have to convert a bunch (right now 120 frames =4s of video) of image files (jpeg : 1024*576) to a video (mp4). This library seems the perfect match for me as I prefer to do everything on client side, and despite the lack of examples, thanks to some issues posted by people before me, I could figure out a bit how the lib works.

However, my first concern is that while rendering the first frame I reached immediately the error "Cannot enlarge memory arrays". Thanks to this issue (https://github.com/Kagami/ffmpeg.js/issues/9), I tried to set 128 - same problem (I can handle 2 frame and then have the issue). I set 256 and seems it works for the ~120 frames. However, I am just wondering if the memory is dependant from the number of the frame. Indeed, I wish to manage more than 4s of video (let's set a target of 5 minutes for example) and wondering if it will be possible or not at all to handle around ~10k frames with the same amount of memory (256) as I am really afraid to make all the work using this lib and finally figure out that 5minutes is impossible to convert.

The second issue which is linked to this issue title is that I don't understand how to get the result of the files.

My code:

        var stdout = "";
        var stderr = "";
        var worker = new Worker("ffmpeg-worker-mp4.js");
        worker.onmessage = function(e) {
          var msg = e.data;
          switch (msg.type) {
          case "ready":
            worker.postMessage({
                type: "run",   
                MEMFS: imagesToRender, 
                TOTAL_MEMORY: 256 * 1024 * 1024,
                arguments: ["-i", "img_%d.jpg", "output.mp4"]
            });
            break;
          case "stdout":
            document.getElementById('ffmpeg').innerHTML += "<div>" + msg.data +"</div>";
            break;
          case "stderr":
            document.getElementById('ffmpeg').innerHTML += "<div>" + msg.data +"</div>";
            break;
          case "exit":
            console.log("Process exited with code " + msg.data);
            console.log(stdout);
            worker.terminate();
            break;
          }
        };

The output is the following (what is strange is that is printed throught stderr and not stdout):

ffmpeg version n3.1.2 Copyright (c) 2000-2016 the FFmpeg developers
built with emcc (Emscripten gcc/clang-like replacement) 1.36.7 ()
configuration: --cc=emcc --enable-cross-compile --target-os=none --arch=x86 --disable-runtime-cpudetect --disable-asm --disable-fast-unaligned --disable-pthreads --disable-w32threads --disable-os2threads --disable-debug --disable-stripping --disable-all --enable-ffmpeg --enable-avcodec --enable-avformat --enable-avutil --enable-swresample --enable-swscale --enable-avfilter --disable-network --disable-d3d11va --disable-dxva2 --disable-vaapi --disable-vda --disable-vdpau --enable-decoder=vp8 --enable-decoder=vp9 --enable-decoder=theora --enable-decoder=mpeg2video --enable-decoder=mpeg4 --enable-decoder=h264 --enable-decoder=hevc --enable-decoder=png --enable-decoder=mjpeg --enable-decoder=vorbis --enable-decoder=opus --enable-decoder=mp3 --enable-decoder=ac3 --enable-decoder=aac --enable-decoder=ass --enable-decoder=ssa --enable-decoder=srt --enable-decoder=webvtt --enable-demuxer=matroska --enable-demuxer=ogg --enable-demuxer=avi --enable-demuxer=mov --enable-demuxer=flv --enable-demuxer=mpegps --enable-demuxer=image2 --enable-demuxer=mp3 --enable-demuxer=concat --enable-protocol=file --enable-filter=aresample --enable-filter=scale --enable-filter=crop --enable-filter=overlay --disable-bzlib --disable-iconv --disable-libxcb --disable-lzma --disable-sdl --disable-securetransport --disable-xlib --disable-zlib --enable-encoder=libx264 --enable-encoder=libmp3lame --enable-encoder=aac --enable-muxer=mp4 --enable-muxer=mp3 --enable-muxer=null --enable-gpl --enable-libmp3lame --enable-libx264 --extra-cflags=-I../lame/dist/include --extra-ldflags=-L../lame/dist/lib
libavutil 55. 28.100 / 55. 28.100
libavcodec 57. 48.101 / 57. 48.101
libavformat 57. 41.100 / 57. 41.100
libavfilter 6. 47.100 / 6. 47.100
libswscale 4. 1.100 / 4. 1.100
libswresample 2. 1.100 / 2. 1.100
[mjpeg @ 0x80a580] Warning: not compiled with thread support, using thread emulation
Input #0, image2, from 'img_%d.jpg':
Duration: 00:00:04.72, start: 0.000000, bitrate: N/A
Stream #0:0: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 1024x576 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc
No pixel format specified, yuvj444p for H.264 encoding chosen.
Use -pix_fmt yuv420p for compatibility with outdated media players.
[mjpeg @ 0x80ab00] Warning: not compiled with thread support, using thread emulation
[libx264 @ 0x80c840] Warning: not compiled with thread support, using thread emulation
[libx264 @ 0x80c840] using SAR=1/1
[libx264 @ 0x80c840] using cpu capabilities: none!
[libx264 @ 0x80c840] profile High 4:4:4 Predictive, level 3.1, 4:4:4 8-bit
[libx264 @ 0x80c840] 264 - core 148 - H.264/MPEG-4 AVC codec - Copyleft 2003-2016 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=4 threads=1 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
[mp4 @ 0x80b6e0] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
Output #0, mp4, to 'output.mp4':
Metadata:
encoder : Lavf57.41.100
Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuvj444p(pc), 1024x576 [SAR 1:1 DAR 16:9], q=-1--1, 25 fps, 12800 tbn, 25 tbc
Metadata:
encoder : Lavc57.48.101 libx264
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
Stream mapping:
Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
Press [q] to stop, [?] for help
frame= 17 fps=0.0 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A speed= 0x
frame= 38 fps= 37 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A speed= 0x
frame= 43 fps= 11 q=29.0 size= 92kB time=-00:00:00.03 bitrate=N/A speed=N/A
frame= 44 fps=9.6 q=29.0 size= 93kB time=00:00:00.00 bitrate=9802871.8kbits/s speed=1.7e-05x
frame= 46 fps=8.5 q=29.0 size= 115kB time=00:00:00.08 bitrate=11751.7kbits/s speed=0.0148x
frame= 47 fps=7.1 q=29.0 size= 117kB time=00:00:00.12 bitrate=8004.9kbits/s speed=0.018x
frame= 48 fps=6.4 q=29.0 size= 117kB time=00:00:00.16 bitrate=6008.3kbits/s speed=0.0214x
frame= 50 fps=6.0 q=29.0 size= 135kB time=00:00:00.24 bitrate=4613.3kbits/s speed=0.0287x
frame= 51 fps=5.3 q=29.0 size= 137kB time=00:00:00.28 bitrate=4008.6kbits/s speed=0.0293x
frame= 52 fps=5.1 q=29.0 size= 137kB time=00:00:00.32 bitrate=3510.0kbits/s speed=0.0313x
frame= 54 fps=4.9 q=29.0 size= 155kB time=00:00:00.40 bitrate=3172.7kbits/s speed=0.0361x
frame= 55 fps=4.6 q=29.0 size= 156kB time=00:00:00.44 bitrate=2910.3kbits/s speed=0.0364x
frame= 56 fps=4.4 q=29.0 size= 156kB time=00:00:00.48 bitrate=2669.1kbits/s speed=0.0377x
frame= 58 fps=4.3 q=29.0 size= 175kB time=00:00:00.56 bitrate=2564.6kbits/s speed=0.0418x
frame= 59 fps=4.1 q=29.0 size= 178kB time=00:00:00.60 bitrate=2429.7kbits/s speed=0.0415x
frame= 60 fps=3.9 q=29.0 size= 179kB time=00:00:00.64 bitrate=2296.2kbits/s speed=0.042x
frame= 61 fps=3.9 q=29.0 size= 179kB time=00:00:00.68 bitrate=2161.5kbits/s speed=0.043x
frame= 63 fps=3.7 q=29.0 size= 199kB time=00:00:00.76 bitrate=2145.6kbits/s speed=0.0443x
frame= 64 fps=3.6 q=29.0 size= 201kB time=00:00:00.80 bitrate=2057.2kbits/s speed=0.0448x
frame= 65 fps=3.5 q=29.0 size= 202kB time=00:00:00.84 bitrate=1971.9kbits/s speed=0.0455x
frame= 66 fps=3.5 q=29.0 size= 226kB time=00:00:00.88 bitrate=2106.2kbits/s speed=0.0463x
frame= 67 fps=3.3 q=29.0 size= 230kB time=00:00:00.92 bitrate=2048.9kbits/s speed=0.0457x
frame= 68 fps=3.2 q=29.0 size= 232kB time=00:00:00.96 bitrate=1976.9kbits/s speed=0.0458x
frame= 69 fps=3.2 q=29.0 size= 233kB time=00:00:01.00 bitrate=1911.4kbits/s speed=0.0465x
frame= 70 fps=3.2 q=29.0 size= 256kB time=00:00:01.04 bitrate=2016.1kbits/s speed=0.047x
frame= 71 fps=3.1 q=29.0 size= 260kB time=00:00:01.08 bitrate=1975.6kbits/s speed=0.0466x
frame= 72 fps=3.0 q=29.0 size= 261kB time=00:00:01.12 bitrate=1905.5kbits/s speed=0.0467x
frame= 74 fps=3.0 q=29.0 size= 300kB time=00:00:01.20 bitrate=2047.9kbits/s speed=0.048x
frame= 75 fps=2.9 q=29.0 size= 305kB time=00:00:01.24 bitrate=2014.5kbits/s speed=0.0474x
frame= 76 fps=2.8 q=29.0 size= 307kB time=00:00:01.28 bitrate=1966.8kbits/s speed=0.0473x
frame= 77 fps=2.8 q=29.0 size= 310kB time=00:00:01.32 bitrate=1921.0kbits/s speed=0.0477x
frame= 78 fps=2.8 q=29.0 size= 351kB time=00:00:01.36 bitrate=2111.2kbits/s speed=0.0481x
frame= 79 fps=2.7 q=29.0 size= 355kB time=00:00:01.40 bitrate=2079.5kbits/s speed=0.0475x
frame= 80 fps=2.6 q=29.0 size= 358kB time=00:00:01.44 bitrate=2035.8kbits/s speed=0.0475x
frame= 81 fps=2.6 q=29.0 size= 361kB time=00:00:01.48 bitrate=1996.8kbits/s speed=0.0479x
frame= 82 fps=2.6 q=29.0 size= 415kB time=00:00:01.52 bitrate=2234.2kbits/s speed=0.0481x
frame= 83 fps=2.5 q=29.0 size= 420kB time=00:00:01.56 bitrate=2206.9kbits/s speed=0.0476x
frame= 84 fps=2.5 q=29.0 size= 423kB time=00:00:01.60 bitrate=2166.8kbits/s speed=0.0476x
frame= 85 fps=2.5 q=29.0 size= 423kB time=00:00:01.64 bitrate=2114.3kbits/s speed=0.0477x
frame= 87 fps=2.4 q=29.0 size= 489kB time=00:00:01.72 bitrate=2330.9kbits/s speed=0.0479x
frame= 88 fps=2.4 q=29.0 size= 492kB time=00:00:01.76 bitrate=2290.6kbits/s speed=0.0479x
frame= 89 fps=2.4 q=29.0 size= 494kB time=00:00:01.80 bitrate=2248.3kbits/s speed=0.048x
frame= 90 fps=2.4 q=29.0 size= 497kB time=00:00:01.84 bitrate=2212.9kbits/s speed=0.0483x
frame= 92 fps=2.4 q=29.0 size= 498kB time=00:00:01.92 bitrate=2122.6kbits/s speed=0.0493x
frame= 94 fps=2.4 q=29.0 size= 501kB time=00:00:02.00 bitrate=2050.7kbits/s speed=0.0504x
frame= 96 fps=2.4 q=29.0 size= 501kB time=00:00:02.08 bitrate=1973.3kbits/s speed=0.0513x
frame= 98 fps=2.4 q=29.0 size= 504kB time=00:00:02.16 bitrate=1911.8kbits/s speed=0.0525x
frame= 100 fps=2.4 q=29.0 size= 505kB time=00:00:02.24 bitrate=1845.3kbits/s speed=0.0533x
frame= 102 fps=2.4 q=29.0 size= 507kB time=00:00:02.32 bitrate=1791.5kbits/s speed=0.0544x
frame= 103 fps=2.4 q=29.0 size= 508kB time=00:00:02.36 bitrate=1762.8kbits/s speed=0.0546x
frame= 104 fps=2.4 q=29.0 size= 508kB time=00:00:02.40 bitrate=1733.8kbits/s speed=0.0549x
frame= 106 fps=2.4 q=29.0 size= 511kB time=00:00:02.48 bitrate=1687.5kbits/s speed=0.0557x
frame= 107 fps=2.4 q=29.0 size= 511kB time=00:00:02.52 bitrate=1662.3kbits/s speed=0.056x
frame= 109 fps=2.4 q=29.0 size= 512kB time=00:00:02.60 bitrate=1612.0kbits/s speed=0.0566x
frame= 111 fps=2.4 q=29.0 size= 514kB time=00:00:02.68 bitrate=1570.4kbits/s speed=0.0571x
frame= 113 fps=2.4 q=29.0 size= 514kB time=00:00:02.76 bitrate=1525.3kbits/s speed=0.0577x
frame= 115 fps=2.4 q=29.0 size= 515kB time=00:00:02.84 bitrate=1486.6kbits/s speed=0.0585x
frame= 117 fps=2.4 q=29.0 size= 516kB time=00:00:02.92 bitrate=1446.3kbits/s speed=0.0593x
frame= 118 fps=2.4 q=29.0 size= 517kB time=00:00:02.96 bitrate=1429.7kbits/s speed=0.0593x
frame= 118 fps=1.9 q=29.0 Lsize= 533kB time=00:00:04.60 bitrate= 948.8kbits/s speed=0.0745x
video:531kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.413379%
[libx264 @ 0x80c840] frame I:1 Avg QP:22.83 size: 83035
[libx264 @ 0x80c840] frame P:30 Avg QP:22.12 size: 12666
[libx264 @ 0x80c840] frame B:87 Avg QP:28.55 size: 915
[libx264 @ 0x80c840] consecutive B-frames: 0.8% 1.7% 2.5% 94.9%
[libx264 @ 0x80c840] mb I I16..4: 0.7% 87.9% 11.4%
[libx264 @ 0x80c840] mb P I16..4: 0.1% 1.6% 0.6% P16..4: 11.8% 17.1% 12.6% 0.0% 0.0% skip:56.2%
[libx264 @ 0x80c840] mb B I16..4: 0.0% 0.0% 0.0% B16..8: 20.5% 2.3% 0.2% direct: 0.2% skip:76.8% L0:38.9% L1:56.6% BI: 4.5%
[libx264 @ 0x80c840] 8x8 transform intra:80.4% inter:70.1%
[libx264 @ 0x80c840] coded y,u,v intra: 99.3% 37.2% 32.2% inter: 7.4% 0.5% 0.4%
[libx264 @ 0x80c840] i16 v,h,dc,p: 23% 62% 5% 11%
[libx264 @ 0x80c840] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 9% 47% 11% 4% 4% 3% 7% 4% 12%
[libx264 @ 0x80c840] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 12% 39% 9% 5% 6% 4% 9% 4% 12%
[libx264 @ 0x80c840] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x80c840] ref P L0: 79.5% 15.2% 3.6% 1.7%
[libx264 @ 0x80c840] ref B L0: 89.5% 10.0% 0.6%
[libx264 @ 0x80c840] ref B L1: 91.2% 8.8%
[libx264 @ 0x80c840] kb/s:919.75

and after the conversion, the software execute the exit code 0 (should be ok) but without any data in msg.data (it's empty). I got nothing from stdout. I also try with different args like arguments: ["-i", "img_%d.jpg", "-an", "output.mp4"] but same issue.

Thanks for your help.

james4388 commented 6 years ago

your worker should listen to done event {type: "done", data: ""}

But even that all we currently have is on std error (without any error :|)

yuxineverforever commented 6 years ago

@james4388 @iamrototo
Hi, nice to meet you. I meet to same problem here with @iamrototo . I cannot get the result and output from done event .

The issue is at: https://github.com/Kagami/ffmpeg.js/issues/51

If you have figured out some solutions, are you willing to share me with your solution? Thanks

Zzzen commented 6 years ago

I'm using http://bgrins.github.io/videoconverter.js/#docs , which works perfectly on web worker

DenisSokoloff commented 6 years ago

comment this line //worker.terminate();

weituotian commented 5 years ago

I'm using http://bgrins.github.io/videoconverter.js/#docs , which works perfectly on web worker

@Zzzen it is five years ago