Проблема в том, что Howler.masterGain
меняется после создания экземпляра Howl
:
const audioURL = 'https://cdn.glitch.com/02dcea11-9bd2-4462-ac38-eeb6a5ad9530%2F331_full_beautiful-minds_0171_preview.mp3?1522829295082';
const masterGain = Howler.masterGain;
const sound = new Howl({ html5: false, src: audioURL });
sound.play();
console.log( masterGain === Howler.masterGain ); // false
<script src="https://cdnjs.cloudflare.com/ajax/libs/howler/2.1.3/howler.min.js"></script>
Таким образом, тот, который вы подключаете к узлу MediaStreamDestination, не тот, куда будут передаваться аудиоданные, и, следовательно, он записывает только тишину.
Я действительно не знаю эту библиотеку, поэтому я не могу сказать, почему она так себя ведет или есть ли способ заставить ее вести себя по-другому, но простой обходной путь - инициализировать ваш поток и создать ваш рекордер только после Вы инициализировали свой экземпляр Howl:
onclick = e => { onclick = null; msg.remove();
const audioURL = 'https://cdn.glitch.com/02dcea11-9bd2-4462-ac38-eeb6a5ad9530%2F331_full_beautiful-minds_0171_preview.mp3?1522829295082'
Howler.mute(false) // to initialize Howler internals
// first initiate your Howl instance
const sound = new Howl( { html5: false, src: audioURL } );
sound.play();
// now intitiate your MediaStreamDestination
const mediaDest = Howler.ctx.createMediaStreamDestination();
Howler.masterGain.connect( mediaDest );
// set up media recorder to record output
const audioChunks = []
const mediaRecorder = new MediaRecorder( mediaDest.stream, { mimeType: 'audio/webm' } );
mediaRecorder.onstart = (event) =>
{ console.log('Started recording Howl output...') };
mediaRecorder.ondataavailable = (event) =>
{ audioChunks.push( event.data ) };
mediaRecorder.onstop = (event) =>
{ console.log('Completed Recording', new Blob( audioChunks ) ) };
mediaRecorder.start();
setTimeout( ()=>{ mediaRecorder.stop(); sound.stop() }, 5000);
};
click anywhere to start