Мне удалось добиться этого с помощью чистого решения WebAudio (не требуется Recorderjs). Вы можете увидеть, как он полностью работает в моем проекте discJS и использует соответствующий исходный файл, чтобы увидеть, как работает мой полный код. Я полагаю, это актуально только для записи узлов WebAudio, которые вы играете программно.
Сначала вам понадобится HTML <audio>
, чтобы использовать его в качестве конечного пункта назначения. В этом случае я предпочитаю отображать элементы управления, чтобы пользователь мог легко загрузить полученный файл.
<audio id='recording' controls='true'></audio>
Теперь о моджо Javascript:
const CONTEXT = new AudioContext();
var recorder=false;
var recordingstream=false;
function startrecording(){
recordingstream=CONTEXT.createMediaStreamDestination();
recorder=new MediaRecorder(recordingstream.stream);
recorder.start();
}
function stoprecording(){
recorder.addEventListener('dataavailable',function(e){
document.querySelector('#recording').src=URL.createObjectURL(e.data);
recorder=false;
recordingstream=false;
});
recorder.stop();
}
Теперь последний клей заключается в том, что всякий раз, когда вы воспроизводите источник звука, вам также необходимо подключить его к потоку записи:
function play(source){
let a=new Audio(source);
let mediasource=CONTEXT.createMediaElementSource(a);
mediasource.connect(CONTEXT.destination);//plays to default context (speakers)
mediasource.connect(recordingstream);//connects also to MediaRecorder
a.play();
}
Это относительно примитивная настройка, которая отлично работает (проверено в Firefox 52 и Chrome 70). Для более правильной реализации см. MediaRecorder в MDN.
person
Alex Henry
schedule
30.10.2018