Поэтому я пытаюсь записать звук в Google chrome через расширение. Я делаю это таким образом, поскольку я не могу получить аудиопоток другими средствами, а windows не позволяет мне записывать отдельный процесс без виртуального аудиокабеля.
Я заметил, что все записи имеют микро заикания, которые соответствуют загрузке процессора моего компьютера. Заикание существует только при включенном захвате звука. Этого не происходит при нормальном воспроизведении на веб-странице.
Чтобы усилить микро заикание в большие заметные заикания. Я увеличил производительность своего ЦП с помощью потоковых циклов while, выполняющих вычисления с плавающей запятой. В тот момент, когда я это делаю, вы можете услышать заикание.
Вы можете ясно услышать проблему здесь:
https://cdn.discordapp.com/attachments/462271295774654484/692816020011745320/Ruggero_Leoncavallo_-_Pagliacci_Act_1_Vesti_la_giubba_-_Live.mp3
Любая попытка установить звуковое ограничение с точным значением, кроме 0,01, не выполняется в обещании. Я попытался использовать AudioContext, надеясь, что он может выполнить обратную запись в буфер или позволить мне уменьшить задержку. Ни один не работал. Увеличение задержки просто делает его заикаться, не увеличивая мой процессор. Как я могу предотвратить эту проблему заикания во время записи? Есть ли альтернативы?
chrome.tabCapture.capture(
{
audio: true,
audioConstraints:
{
mandatory:
{
chromeMediaSource: 'tab'
}
}
},
(stream) =>
{
console.log("Started recording, stream: ", stream);
// Latency doesn't go lower than 0.01
// higher latency makes stronger stutters
var ctx = new AudioContext({latencyHint:0.0000});
var source = ctx.createMediaStreamSource(stream);
var dest = ctx.createMediaStreamDestination();
console.log("Con", ctx, source, dest);
mediaRecorder = new MediaRecorder(dest.stream,
{
mimeType:"audio/webm"
});
source.connect(dest);
console.log("Recorder:" , mediaRecorder);
var chunks = [];
mediaRecorder.ondataavailable = function (blob)
{
console.log("data available", blob);
chunks.push(blob.data);
};
mediaRecorder.onstop = function(e)
{
console.log("Stopped recording");
var blob = new Blob(chunks, { 'type' : 'audio/webm' });
console.log("My blob is: ", blob);
var audioURL = window.URL.createObjectURL(blob);
chrome.downloads.download({url: audioURL, filename: "test.webm", saveAs: false}, function(downloadId)
{
console.log("finished downloading it");
});
}
// Playing it back so I can hear the stutters while its recording
let audio = new Audio();
audio.srcObject = dest.stream;
audio.play();
// changing the batch duration doesn't matter
mediaRecorder.start(1000);
});