Фон
Я пытаюсь контролировать ввод в веб-приложение WebRTC, работающее на Chrome, управляемом Selenium, внутри контейнера Docker.
Это часть автоматизированного теста приложения WebRTC.
Как часть теста, я должен быть в состоянии проверить, что аудио принимается на другой стороне, когда это должно быть.
В основном, я хочу проверить, что если один клиент говорит, другой клиент слышит это, и наоборот, если клиент не отключен.
Теперь я могу легко заставить Chrome эмулировать вход микрофона (и камеры), запустив его с параметрами командной строки:
--use-fake-ui-for-media-stream
--use-fake-device-for-media-stream
Проблема в том, что в образце по умолчанию много молчания (его труднее обнаружить). Я могу решить эту проблему, предоставив свой собственный аудиофайл с более последовательным звуком:
--use-file-for-fake-audio-capture=/opt/media/audio1.wav
Но у этого есть еще одна проблема - если Chrome одновременно отправляет и принимает аудио, полученный звук сильно засоряется, почти в полной тишине, как часть функциональности эхоподавления Chrome. (Эхоподавление устанавливается как часть приложения WebRTC, а не как часть самого Chrome, и я не хочу вносить изменения в тестируемый код для облегчения теста.)
Использование двух разных образцов (по одному для каждого клиента) помогает немного, но не очень.
Реальная проблема заключается в том, что оба клиента "разговаривают" без остановки в течение всего времени их работы, что приводит к неправильному воспроизведению звука из-за вышеупомянутой эхоподавления, а также не является реалистичным сценарием для тестирования, потому что люди обычно этого не делают. разговаривать друг с другом постоянно.
Я теоретически мог бы использовать специально созданные сэмплы с преднамеренными участками шума / тишины в них, но тогда выравнивание этих сэмплов между клиентами и проверка достоверности теста было бы кошмаром.
проблема
Что мне действительно нужно, так это чтобы я мог запускать и останавливать воспроизведение звука на клиенте по требованию.
Похоже, что в Chrome нет никакого способа управлять фальшивым мультимедийным потоком, поэтому мне кажется, что мой лучший вариант - каким-то образом создать фальшивое устройство ввода звука "микрофон" внутри контейнера Docker и управлять им вместо этого.
В стандартном Linux вы можете использовать pulseaudio для повторного вывода аудиосигнала обратно в качестве устройства захвата, что выглядит многообещающе, но я не знаю, как использовать это внутри контейнера Docker.
В контейнере Docker нет даже аудиоустройств, с которыми можно было бы его использовать.
Я нашел различные руководства о том, как настроить Docker для использования звукового оборудования хост-машины, но это не очень полезно, поскольку эти контейнеры работают на серверах eSXI и не имеют никаких звуковых карт для использования.
Pulseaudio также поддерживает виртуальные устройства, но для них требуются драйверы / модули ядра. Я могу ошибаться, но я не думаю, что вы можете использовать их внутри контейнера Docker.
Вопрос
Извините, если вышеупомянутое было немного многословным, но я пытался объяснить проблему и различные направления, которые я уже изучил.
Итак, кто-нибудь знает способ, которым я мог бы контролировать ввод звука в устройство захвата Chrome внутри контейнера Docker, используя поддельное устройство захвата, или каким-либо другим способом?