Skip to content
Snippets Groups Projects
Commit d8a83cee authored by Karan Bedi's avatar Karan Bedi
Browse files

[NEW] mp3 audio upload

parent 53755360
No related branches found
No related tags found
No related merge requests found
......@@ -19,3 +19,5 @@ packages/rocketchat-theme/client/vendor/
private/moment-locales/
public/livechat/
public/recorderWorker.js
public/libmp3lame.js
public/mp3Worker.js
......@@ -30,7 +30,7 @@ RocketChat.messageBox.actions.add('Create_new', 'Audio_message', {
{
file: blob,
type: 'audio',
name: `${ TAPi18n.__('Audio record') }.wav`
name: `${ TAPi18n.__('Audio record') }.mp3`
}
]);
});
......
(function(window){
var WORKER_PATH = 'recorderWorker.js';
var encoderWorker = new Worker('mp3Worker.js');
var Recorder = function(source, cfg){
var config = cfg || {};
var bufferLen = config.bufferLen || 4096;
var numChannels = config.numChannels || 2;
var numChannels = config.numChannels || 1;
this.context = source.context;
this.node = (this.context.createScriptProcessor ||
this.context.createJavaScriptNode).call(this.context,
......@@ -70,7 +71,63 @@
worker.onmessage = function(e){
var blob = e.data;
currCallback(blob);
var arrayBuffer;
var fileReader = new FileReader();
fileReader.onload = function(){
arrayBuffer = this.result;
var buffer = new Uint8Array(arrayBuffer),
data = parseWav(buffer);
encoderWorker.postMessage({ cmd: 'init', config:{
mode : 3,
channels:1,
samplerate: data.sampleRate,
bitrate: data.bitsPerSample
}});
encoderWorker.postMessage({ cmd: 'encode', buf: Uint8ArrayToFloat32Array(data.samples) });
encoderWorker.postMessage({ cmd: 'finish'});
encoderWorker.onmessage = function(e) {
if (e.data.cmd == 'data') {
var mp3Blob = new Blob([new Uint8Array(e.data.buf)], {type: 'audio/mp3'});
currCallback(mp3Blob);
}
};
};
fileReader.readAsArrayBuffer(blob);
}
function parseWav(wav) {
function readInt(i, bytes) {
var ret = 0,
shft = 0;
while (bytes) {
ret += wav[i] << shft;
shft += 8;
i++;
bytes--;
}
return ret;
}
if (readInt(20, 2) != 1) throw 'Invalid compression code, not PCM';
if (readInt(22, 2) != 1) throw 'Invalid number of channels, not 1';
return {
sampleRate: readInt(24, 4),
bitsPerSample: readInt(34, 2),
samples: wav.subarray(44)
};
}
function Uint8ArrayToFloat32Array(u8a){
var f32Buffer = new Float32Array(u8a.length);
for (var i = 0; i < u8a.length; i++) {
var value = u8a[i<<1] + (u8a[(i<<1)+1]<<8);
if (value >= 0x8000) value |= ~0x7FFF;
f32Buffer[i] = value / 0x8000;
}
return f32Buffer;
}
source.connect(this.node);
......@@ -81,7 +138,7 @@
var url = (window.URL || window.webkitURL).createObjectURL(blob);
var link = window.document.createElement('a');
link.href = url;
link.download = filename || 'output.wav';
link.download = filename || 'output.mp3';
var click = document.createEvent("Event");
click.initEvent("click", true, true);
link.dispatchEvent(click);
......@@ -89,4 +146,4 @@
window.Recorder = Recorder;
})(window);
\ No newline at end of file
})(window);
This diff is collapsed.
importScripts('libmp3lame.js')
var mp3codec;
self.onmessage = function(e) {
switch (e.data.cmd) {
case 'init':
if (!e.data.config) {
e.data.config = { };
}
mp3codec = Lame.init();
Lame.set_mode(mp3codec, e.data.config.mode || Lame.JOINT_STEREO);
Lame.set_num_channels(mp3codec, e.data.config.channels || 2);
Lame.set_num_samples(mp3codec, e.data.config.samples || -1);
Lame.set_in_samplerate(mp3codec, e.data.config.samplerate || 44100);
Lame.set_out_samplerate(mp3codec, e.data.config.samplerate || 44100);
Lame.set_bitrate(mp3codec, e.data.config.bitrate || 128);
Lame.init_params(mp3codec);
break;
case 'encode':
var mp3data = Lame.encode_buffer_ieee_float(mp3codec, e.data.buf, e.data.buf);
self.postMessage({cmd: 'data', buf: mp3data.data});
break;
case 'finish':
var mp3data = Lame.encode_flush(mp3codec);
self.postMessage({cmd: 'end', buf: mp3data.data});
Lame.close(mp3codec);
mp3codec = null;
break;
}
};
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment