На моей веб-странице мне нужно знать точное время различных событий (не менее 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Думаю, это сработает, если я смогу сделать это на канале, на котором нет микрофона. Все еще работаем над этой частью ...