lamejs
Version:
Pure JavaScript MP3 Encoder
87 lines (71 loc) • 2.52 kB
JavaScript
(function (exports) {
'use strict';
var MP3Converter = function (config) {
config = config || {};
var busy = false;
var mp3Worker = new Worker('worker.js');
this.isBusy = function () {
return busy
};
this.convert = function (blob) {
var conversionId = 'conversion_' + Date.now(),
tag = conversionId + ":"
;
var opts = [];
for(var i=1; i < arguments.length;i++){
opts.push(arguments[i]);
}
console.log(tag, 'Starting conversion');
var preferredConfig = {}, onSuccess, onProgress, onError;
if (typeof opts[0] == 'object') {
preferredConfig = opts.shift();
}
onSuccess = opts.shift();
onProgress = opts.shift();
onError = opts.shift();
if (busy) {
throw ("Another conversion is in progress");
}
var initialSize = blob.size,
fileReader = new FileReader(),
startTime = Date.now();
fileReader.onload = function (e) {
console.log(tag, "Passed to BG process");
mp3Worker.postMessage({
cmd: 'init',
config: preferredConfig
});
mp3Worker.postMessage({cmd: 'encode', rawInput: e.target.result});
mp3Worker.postMessage({cmd: 'finish'});
mp3Worker.onmessage = function (e) {
if (e.data.cmd == 'end') {
console.log(tag, "Done converting to Mp3");
var mp3Blob = new Blob(e.data.buf, {type: 'audio/mp3'});
console.log(tag, "Conversion completed in: " + ((Date.now() - startTime) / 1000) + 's');
var finalSize = mp3Blob.size;
console.log(tag +
"Initial size: = " + initialSize + ", " +
"Final size = " + finalSize
+ ", Reduction: " + Number((100 * (initialSize - finalSize) / initialSize)).toPrecision(4) + "%");
busy = false;
if(onProgress && typeof onProgress=='function'){
onProgress(1);
}
if (onSuccess && typeof onSuccess === 'function') {
onSuccess(mp3Blob);
}
} else if(e.data.cmd == 'progress'){
//post progress
if(onProgress && typeof onProgress=='function'){
onProgress(e.data.progress);
}
} else if(e.data.cmd == 'error'){
}
};
};
busy = true;
fileReader.readAsArrayBuffer(blob);
}
};
exports.MP3Converter = MP3Converter;
})(window);