veydlin
@veydlin
Мне никогда не жалко средств на свое любопытство

Как получить Blob от lamejs?

Нашел замечательную скоростную библиотеку https://github.com/zhuker/lamejs
Но не могу добиться от неё данных в формате Blob чтобы потом просто скачать файл:
var mp3Blob = new Blob([mp3Data], { type: 'audio/mp3' });
var url = (window.URL || window.webkitURL).createObjectURL(mp3Blob);
var link = document.getElementById("save");
link.href = url;
link.download = 'output.mp3';


И простого воспроизведения аудио:
var audio = new Audio(...);
audio.play();


Вот как выдает данные буфера через console.log другая библиотека, оно работает:
e8d264336e9f4a0caf3232dd153e343c.png

Данная выкидывает это, видно, что числа отрицательный, а нужно uint8
dbd697cee504471282660e371e7a995c.png

После преобразования в uint8 выдает все по нулям
db9d858881014572a70f5dda593e443d.png

Я взял код примера из репозитория и дописал example.html, вот что вышло (результат работы на скринах):
<html>
<body>Encoding mp3 from <code>testdata/Left44100.wav</code>
</body>
<script src="lame.min.js"></script>
<script>
    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));
        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();
</script>
</html>
  • Вопрос задан
  • 579 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы