Вставьте событие синхронизации в записи микрофона - PullRequest
0 голосов
/ 07 октября 2019

На моей веб-странице мне нужно знать точное время различных событий (не менее 10 мс). У меня все работает, к моему удовлетворению, с визуальными элементами и звуковым выходом, но я также записываю с микрофона, и это буферизируется. К тому времени, когда я получаю данные с микрофона, это происходит намного позже (возможно, через 100 мс).

Мой код инициализации выглядит примерно так (я выделил важные части, поэтому здесь, возможно, есть опечатка, которая нев моем рабочем коде):

const ac = new window.AudioContext();
navigator.mediaDevices.getUserMedia({ audio: true }).then(stream => {
    const source = ac.createMediaStreamSource(stream);
    const node = (source.context.createScriptProcessor || source.context.createJavaScriptNode).call(source.context, 4096, 2, 2);
    node.onaudioprocess = onAudioProcess;
    source.connect(node);
    // MY_RECORDING_SOURCE.connect(node);
    node.connect(source.context.destination);
});

Мне было интересно, могу ли я создать отдельный канал, который я мог бы использовать для вставки данных. Обратите внимание на закомментированную строку. Если я правильно понимаю, вот где я мог бы добавить еще одну дорожку к записи.

Если это возможно, я понятия не имею, как создать MY_RECORDING_SOURCE или как записать в него данные. Может кто-нибудь указать мне полезную документацию? Я ходил кругом на все, что я нашел в Интернете.

РЕДАКТИРОВАТЬ: я смог вставить осциллятор в 1 секунду в записи, как это:

    const startRecordTimeSec = <the exact time recording started>;
    oscillator = ac.createOscillator();
    oscillator.type = 'square';
    oscillator.frequency.setValueAtTime(0, ac.currentTime); // value in hertz
    oscillator.frequency.setValueAtTime(20000, startRecordTimeSec+1); // value in hertz
    oscillator.frequency.setValueAtTime(0, startRecordTimeSec+1.001); // value in hertz
    oscillator.start();
    oscillator.connect(node);

IДумаю, это сработает, если я смогу сделать это на канале, на котором нет микрофона. Все еще работаем над этой частью ...

...