Skip to content

Instantly share code, notes, and snippets.

View jeromewu's full-sized avatar

jeromewu jeromewu

View GitHub Profile
@jeromewu
jeromewu / build_libmp3lame.sh
Created October 16, 2019 12:55
ffmpeg.js-build_libmp3lame
#!/bin/bash
NPROC=$(grep -c ^processor /proc/cpuinfo)
BUILD_DIR=$PWD/build
git submodule add [email protected]:jeromewu/lame.git third_party/lame
cd third_party/lame
git checkout 3.100
emconfigure ./configure --prefix=$BUILD_DIR
@jeromewu
jeromewu / build_ffmpeg.v0.1.0.sh
Created October 20, 2019 15:17
ffmpeg.js-build_ffmpeg
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
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);
})();
const { setModule } = require('./util/module');
const FFmpegCore = require('./ffmpeg-core');
module.exports = () => (
new Promise((resolve, reject) => {
FFmpegCore()
.then((Module) => {
setModule(Module);
resolve();
});
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;
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');
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);
/**
* This script is loaded by ffmpegwasm-v0.2.js
*/
let Module = null;
let ffmpeg = null;
const load = () => {
global.importScripts('./ffmpeg-core.js');
global.Module()
const resolves = {};
const rejects = {};
const worker = new Worker('./worker.js');
worker.onmessage = ({ action, payload }) => {
resolves[action](payload);
};
exports.load = () => new Promise((resolve) => {
const { load, transcode } = require('./ffmpegwasm-v0.2');
(async () => {
await load();
const { data } = await transcode(mediaData, 'mp4');
// do something with data
})();