Что такое текущее время AudioContext для первого записанного сэмпла?

Используя API веб-аудио, я создаю bufferSource и одновременно использую новый MediaRecorder для записи. Я записываю звук из динамиков с помощью встроенного микрофона.

Если я воспроизвожу оригинальную и новую запись, между ними будет значительная задержка. (Для меня это звучит примерно 200 мсек.) Если я console.log значение globalAudioCtx.currentTime в момент вызова двух "начальных" методов, эти два числа будут точно такими же. Значения Date.now () также точно такие же.

Где возникает эта задержка? Задержка из-за скорости звука примерно в 1000 раз меньше, чем то, что я слышу.

Короче говоря, как мне заставить эти два семпла воспроизводиться в одно и то же время?

Я работаю в Chrome под Linux.


person MattD    schedule 01.11.2018    source источник


Ответы (1)


Где возникает эта задержка?

И по воспроизведению, и по записи.

У вашей звуковой карты есть буфер, и программное обеспечение должно записывать звук в этот буфер небольшими порциями за раз. Если программное обеспечение не успевает, слышен прерывистый звук. Таким образом, размеры буфера устанавливаются достаточно большими, чтобы этого не происходило.

То же самое и с концом записи. Если буфер недостаточно велик, записанные аудиоданные будут потеряны, если программное обеспечение не сможет достаточно быстро прочитать из этого буфера, что приведет к прерывистому и потере звука.

Браузеры не используют режим работы с минимальной задержкой для вашей звуковой карты. Вы можете применить некоторые настройки (например, использовать WASAPI и эксклюзивный режим в Windows с Chrome), но вы во власти разработчиков браузера, которые разрабатывали это не с учетом таких людей, как вы и я.

Независимо от того, насколько низко вы опуститесь в размере буфера, все равно будет задержка. Такова природа компьютерного цифрового звука.

как я могу заставить эти два семпла воспроизводиться в одно и то же время?

Вам придется отложить один из сэмплов, чтобы снова синхронизировать их.

person Brad    schedule 01.11.2018
comment
Как я могу рассчитать задержку? Я только что наткнулся на AudioContext.baseLatency, но еще не пробовал. - person MattD; 02.11.2018
comment
@MattD Если не считать воспроизведения звука, его записи и последующего анализа полученной записи, чтобы сделать предположение, вы не можете. Браузер не знает задержки базовой аудиосистемы. Фактически, задержка может быть введена аппаратным обеспечением, при этом ОС хоста не знает об этом. - person Brad; 02.11.2018
comment
Я вручную записал вывод, как описано, и обнаружил, что задержка составляет около 141 мс. В моем случае AudioContext.baseLatency составляет 11,6 мс - отличается примерно на порядок. - person MattD; 03.11.2018
comment
@MattD Они не измеряют удаленно одно и то же, как я указал в своем комментарии. - person Brad; 04.11.2018