Запись Google Chrome аудио заикается об использовании процессора при использовании chrome .tabCapture.capture - PullRequest
0 голосов
/ 26 марта 2020

Поэтому я пытаюсь записать звук в 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);
});
...