FFmpeg рдХреЛ WebAssembly (= ffmpeg.js) рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛: рднрд╛рдЧ 3 - mp4 рдХреЗ рд▓рд┐рдП AVI рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛



рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рднрд╛рдЧреЛрдВ рдХреА рд╕реВрдЪреА:


  1. рдЦрд╛рдирд╛ рдкрдХрд╛рдиреЗ
  2. Emscripten рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди
  3. рдХрдиреНрд╡рд░реНрдЯ AVI рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП mp4 (рдЖрдк рдпрд╣рд╛рдБ рд╣реИрдВ)



рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ:



  1. рдЕрдиреБрдХреВрд▓рд┐рдд рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде FFmpeg рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╕рдВрдХрд▓рдиред
  2. Emscripten рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рдмрдВрдзрдиред
  3. Ffmpeg.js v0.1.0 рдФрд░ рд╡реАрдбрд┐рдпреЛ рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рд╡рд┐рдХрд╛рд╕ред



рдЕрдиреБрдХреВрд▓рд┐рдд рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде FFmpeg рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛


рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЗрд╕ рднрд╛рдЧ рдХрд╛ рдЕрдВрддрд┐рдо рд▓рдХреНрд╖реНрдп mp4 рдХреЛ avi рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ffmpeg.js v0.1.0 рдмрдирд╛рдирд╛ рд╣реИ, рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╣рдордиреЗ FFmpeg рдХрд╛ рдХреЗрд╡рд▓ "рдирдВрдЧреЗ" рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдпрд╛ рд╣реИ, рдЬреЛ рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред


  1. -рдУрдЬрд╝ : рдХреЛрдб рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░реЗрдВ рдФрд░ рдЙрд╕рдХрд╛ рдЖрдХрд╛рд░ рдХрдо рдХрд░реЗрдВ (30 рд╕реЗ 15 рдПрдордмреА рддрдХ)
  2. -o рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ / ffmpeg-core.js : рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП js рдФрд░ wasm рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рд╣реЗрдЬреЗрдВред (рдЬрд╣рд╛рдВ рд╕реЗ рд╣рдо ffmpeg-core.js рдХреЛ ffmpeg.js рд░реИрдкрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ)
  3. -s MODULARIZE = 1 : рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдПрдВ (рдЖрдкрдХреЛ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдиреАрдЪреЗ рд╡рд┐рд╡рд░рдг)
  4. -s EXPORTED_FUNCTIONS = "[_ ffmpeg]" : ffmpeg C рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ
  5. -s EXTRA_EXPORTED_RUNTIME_METHODS = "[cwrap, FS, getValue, setValue]" : рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп, рд╡рд┐рд╡рд░рдг рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реБрдП рд▓реЗрдЦ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  6. -s ALLOW_MEMORY_GROWTH = 1 : рднрд╕реНрдо рдореЗрдореЛрд░реА рдкрд░ рд╕реАрдорд╛ рд╣рдЯрд╛ рджреЗрдВ
  7. -рдереЛрдбрд╝рд╛ : рд╣рдЯрд╛ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдмрдирд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред (рдпрд╣ рдкреНрд░рдХрд╛рд╢рдиреЛрдВ рдХреЗ рдЪреМрдереЗ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреИрдХрд▓реЙрдЧ рд╣реИ)

рдкреНрд░рддреНрдпреЗрдХ рддрд░реНрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг src / settings.js рдореЗрдВ github рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдПрдореНрд╕рд╕реНрдХреНрд░рд┐рдкреНрдЯреЗрди рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЬрдм -s MODULARIZE = 1 рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╕рдордп , рд╣рдореЗрдВ рдореЙрдбреНрдпреБрд▓рд░рд┐рдЯреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЦреНрдп () рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП)ред рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рддреАрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред


1. fftools / ffmpeg.c : рдирд╛рдо рдмрджрд▓рдХрд░ ffmpeg


- int main(int argc, char **argv) + int ffmpeg(int argc, char **argv) 

2. fftools / ffmpeg.h : рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ ffmpeg рдЬреЛрдбрд╝реЗрдВ


 + int ffmpeg(int argc, char** argv); #endif /* FFTOOLS_FFMPEG_H */ 

3. fftools / cmdutils.c : рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ ( рд░рд┐рдЯ ) рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╣рдорд╛рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рд╕реЗ рдмрд╛рд╣рд░ рди рдирд┐рдХрд▓реЗ (рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдмрд┐рдВрджреБ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВрдЧреЗ)ред


 void exit_program(int ret){ if (program_exit) program_exit(ret); - exit(ret); + // exit(ret); } 

рд╕рдВрдХрд▓рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╣рдорд╛рд░рд╛ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг:


 emcc \ -Llibavcodec -Llibavdevice -Llibavfilter -Llibavformat -Llibavresample -Llibavutil -Llibpostproc -Llibswscale -Llibswresample \ -Qunused-arguments -Oz \ -o javascript/ffmpeg-core.js fftools/ffmpeg_opt.o fftools/ffmpeg_filter.o fftools/ffmpeg_hw.o fftools/cmdutils.o fftools/ffmpeg.o \ -lavdevice -lavfilter -lavformat -lavcodec -lswresample -lswscale -lavutil -lm \ -s MODULARIZE=1 \ -s EXPORTED_FUNCTIONS="[_ffmpeg]" \ -s EXTRA_EXPORTED_RUNTIME_METHODS="[cwrap, FS, getValue, setValue]" \ -s TOTAL_MEMORY=33554432 \ -s ALLOW_MEMORY_GROWTH=1 

ffmpeg-core.js рддреИрдпрд╛рд░ рд╣реИ!


рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ ffmpeg рдХрд╛ рдЕрдиреБрднрд╡ рд╣реИ, рддреЛ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрдорд╛рдВрдб рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


 $ ffmpeg -i input.avi output.mp4 

рдФрд░ рдЪреВрдВрдХрд┐ рд╣рдо рдореБрдЦреНрдп рдХреЗ рдмрдЬрд╛рдп ffmpeg рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдХрдорд╛рдВрдб рдХреЙрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:


 const args = ['./ffmpeg', '-i', 'input.avi', 'output.mp4']; ffmpeg(args.length, args); 

рдмреЗрд╢рдХ, рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ, рд╣рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╕реА рдХреА рджреБрдирд┐рдпрд╛ рдХреЗ рдмреАрдЪ рдПрдХ рдкреБрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рддреЛ рдЖрдЗрдП рдЖрдЗрдореНрд╕реНрдХреНрд░рд┐рдкреНрдЯреЗрди рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВред


Emscripten рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рдмрдВрдзрди


Emscripten рдореЗрдВ C рд╕реЗ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╣реИ, рдЬреЛ рд╡реАрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ffmpeg-core.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред


рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдПрдкреАрдЖрдИ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдкрдврд╝реЗрдВред


рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдлрдПрд╕ рдПрдкреАрдЖрдИ рдХреЛ рдПрдореНрд╕рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдкрд░реЛрдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдХрд╛рд░рдг рд╣реИ:


 -s EXTRA_EXPORTED_RUNTIME_METHODS="[cwrap, FS, getValue, setValue]" 

рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ Node.js рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ Uint8Array рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рд░рдгреА рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 const fs = require('fs'); const data = new Uint8Array(fs.readFileSync('./input.avi')); 

рдФрд░ FS.writeFile () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ emscripten рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ:


 require('./ffmpeg-core.js)() .then(Module => { Module.FS.writeFile('input.avi', data); }); 

рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдИрдорд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:


 require('./ffmpeg-core.js)() .then(Module => { const data = Module.FS.readFile('output.mp4'); }); 

рдЖрдЗрдП рдПрдХ рд╕реБрдВрджрд░ рдПрдкреАрдЖрдИ рдХреЗ рдкреАрдЫреЗ рдЗрди рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП ffmpeg.js рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред


рд╡рд┐рдХрд╛рд╕ ffmpeg.js v0.1.0 рдФрд░ рд╡реАрдбрд┐рдпреЛ рд░реВрдкрд╛рдВрддрд░рдг


Ffmpeg.js рдХрд╛ рд╡рд┐рдХрд╛рд╕ рддреБрдЪреНрдЫ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╕реА рдХреА рджреБрдирд┐рдпрд╛ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рд╕рдВрдХреЗрдд рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред


рд╣рдорд╛рд░рд╛ рдХрд╛рдо рдЗрд╕ рддрд░рд╣ ffmpeg.js рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╣реИ:


 const fs = require('fs'); const ffmpeg = require('@ffmpeg/ffmpeg'); (async () => { await ffmpeg.load(); const data = ffmpeg.transcode('./input.avi', 'mp4'); fs.writeFileSync('./output.mp4', data); })(); 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, ffmpeg-core.js рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдЬреЛ рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдХреЛ рдЕрд╡рд░реБрджреНрдз рди рдХрд░реЗрдВред


рдпрд╣рд╛рдБ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


 const { setModule } = require('./util/module'); const FFmpegCore = require('./ffmpeg-core'); module.exports = () => ( new Promise((resolve, reject) => { FFmpegCore() .then((Module) => { setModule(Module); resolve(); }); }) ); 

рдпрд╣ рдЕрдЬреАрдм рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рд╡рд╛рджреЗ рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ, рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ FFmpegCore () рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд╡рд╛рджрд╛ рдПрдкреАрдЖрдИ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИред


рдЕрдЧрд▓рд╛ рдХрджрдо cwrap рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ffmpeg рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ:


 // int ffmpeg(int argc, char **argv) const ffmpeg = Module.cwrap('ffmpeg', 'number', ['number', 'number']); 

рдХреНрд░реИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рддрд░реНрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рд╣реИ (рдЬреЛ рдкрд┐рдЫрд▓реЗ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдХреЗ рд╕рд╛рде EXPORTED_FUNCTIONS рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП), рджреВрд╕рд░рд╛ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рддреАрд╕рд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ (int argc рдФрд░ char ** argv)ред


рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ argc рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреНрдпреЛрдВ рд╣реИ, рд▓реЗрдХрд┐рди argv рдПрдХ рд╕рдВрдЦреНрдпрд╛ рднреА рдХреНрдпреЛрдВ рд╣реИ? argv рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╣реИ, рдФрд░ рдкреЙрдЗрдВрдЯрд░ рдореЗрдореЛрд░реА (рдЯрд╛рдЗрдк 0xfffffff) рдореЗрдВ рдПрдбреНрд░реЗрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рдЯрд╛рдЗрдк WebAssembly рдореЗрдВ 32 рдмрд┐рдЯ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рд╕рдВрдЦреНрдпрд╛ рдХреЛ argv рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред


Ffmpeg () рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓рд╛ рддрд░реНрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рджреВрд╕рд░рд╛ рддрд░реНрдХ рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА (рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ Uint8) рдХрд╛ рд╕реВрдЪрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


рд╣рдо рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ 2 рдЙрдк-рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:


  1. рдкрд╛рддреНрд░реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ?
  2. рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ?

рд╣рдо str2ptr рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдмрдирд╛рдХрд░ рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░реЗрдВрдЧреЗ:


 const { getModule } = require('./module'); module.exports = (s) => { const Module = getModule(); const ptr = Module._malloc((s.length+1)*Uint8Array.BYTES_PER_ELEMENT); for (let i = 0; i < s.length; i++) { Module.setValue(ptr+i, s.charCodeAt(i), 'i8'); } Module.setValue(ptr+s.length, 0, 'i8'); return ptr; }; 

рдореЙрдбреНрдпреВрд▓._рдорд▓реНрд▓реЛрдХ () рд╕реА рдореЗрдВ рдореЙрд▓реЛрдХ () рдХреЗ рд╕рдорд╛рди рд╣реИ, рдпрд╣ рдвреЗрд░ рдкрд░ рд╕реНрдореГрддрд┐ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИред Module.setValue () рд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рди рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред


рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдг рд╕рд░рдгреА рдХреЗ рдЕрдВрдд рдореЗрдВ 0 рдЬреЛрдбрд╝рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВред


рдкрд╣рд▓реЗ рд╕рдмрдЯреИрдХ рд╕реЗ рдирд┐рдкрдЯрд╛, рджреВрд╕рд░реЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП strList2ptr рдмрдирд╛рдПрдВ:


 const { getModule } = require('./module'); const str2ptr = require('./str2ptr'); module.exports = (strList) => { const Module = getModule(); const listPtr = Module._malloc(strList.length*Uint32Array.BYTES_PER_ELEMENT); strList.forEach((s, idx) => { const strPtr = str2ptr(s); Module.setValue(listPtr + (4*idx), strPtr, 'i32'); }); return listPtr; }; 

рдпрд╣рд╛рдВ рд╕рдордЭрдиреЗ рд╡рд╛рд▓реА рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕реВрдЪрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдпреВрдЗрдВрдЯ 32 рдореВрд▓реНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реВрдЪреАрдкреНрд░реЛрдЯ рдПрдХ рдпреВрдЗрдВрдЯ 32 рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ рдЬреЛ рдПрдХ рдпреВрдЗрдВрдЯ 8 рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред


рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдиреЗ рд╕реЗ рд╣рдореЗрдВ ffmepg.transcode () рдХрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рд▓рддрд╛ рд╣реИ:


 const fs = require('fs'); const { getModule } = require('./util/module'); const strList2ptr = require('./util/strList2ptr'); module.exports = (inputPath, outputExt) => { const Module = getModule(); const data = new Uint8Array(fs.readFileSync(inputPath)); const ffmpeg = Module.cwrap('ffmpeg', 'number', ['number', 'number']); const args = ['./ffmpeg', '-i', 'input.avi', `output.${outputExt}`]; Module.FS.writeFile('input.avi', data); ffmpeg(args.length, strList2ptr(args)); return Buffer.from(Module.FS.readFile(`output.${outputExt}`)); }; 

рд╣реЛ рдЧрдпрд╛! рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ fimpeg.js v0.1.0 рд╣реИ рдЬреЛ AVI рдХреЛ mp4 рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред


рдЖрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рд╕реНрд╡рдпрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 $ npm install @ffmpeg/ffmpeg@0.1.0 

рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛:


 const fs = require('fs'); const ffmpeg = require('@ffmpeg/ffmpeg'); (async () => { await ffmpeg.load(); const data = ffmpeg.transcode('./input.avi', 'mp4'); fs.writeFileSync('./output.mp4', data); })(); 

рдмрд╕ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЕрднреА рддрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗрд╡рд▓ Node.js рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╣рдо рд╡реЗрдм-рд╡рд░реНрдХрд░ (рдФрд░ Node.js рдореЗрдВ child_process) рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред


рд╕реНрд░реЛрдд рдХреЛрдб:


Source: https://habr.com/ru/post/hi473166/


All Articles