Есть такая библиотека
https://github.com/zhuker/lamejs
Следуя примерам из репозитория я переписал код example.html (и почему он там был не полным?)
В итоге выходит, что в mp3Data не совсем то, что нужно, а при преобразовании в Uint8Array вообще остаются только нули
liblame = new lamejs();
var mp3Data = [];
function encodeMono(channels, sampleRate, samples) {
mp3enc = new liblame.Mp3Encoder(channels, sampleRate, 128);
var remaining = samples.length;
var maxSamples = 1152;
for (var i = 0; remaining >= maxSamples; i += maxSamples) {
var mono = samples.subarray(i, i + maxSamples);
var mp3buf = mp3enc.encodeBuffer(mono);
if (mp3buf.length > 0) {
mp3Data.push(mp3buf);
}
remaining -= maxSamples;
}
var mp3buf = mp3enc.flush(); //finish writing mp3
if (mp3buf.length > 0) {
mp3Data.push(mp3buf);
}
// ====== Тестируем ==============================
console.log("mp3Data ", mp3Data);
console.log("new Uint8Array(mp3Data) ", new Uint8Array(mp3Data));
var mp3Blob = new Blob([Uint8Array(mp3Data)], { // Не уверен, что правильно преобразовываю в blob
type : 'audio/mp3'
});
console.log("mp3Blob ", mp3Blob);
// ===============================================
console.log('done encoding');
}
var wavFile = "testdata/Left44100.wav";
var request = new XMLHttpRequest();
request.open("GET", wavFile, true);
request.responseType = "arraybuffer";
// Our asynchronous callback
request.onload = function () {
audioData = request.response;
wav = liblame.WavHeader.readHeader(new DataView(audioData));
samples = new Uint16Array(audioData, wav.dataOffset, wav.dataLen / 2);
encodeMono(wav.channels, wav.sampleRate, samples);
};
request.send();