5

Фон

Я пытаюсь контролировать ввод в веб-приложение 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, используя поддельное устройство захвата, или каким-либо другим способом?

1 ответ1

4

Мне удалось найти решение этой проблемы. Основная концепция довольно проста, но у нее есть несколько ошибок, которые нужно обойти.

Решение включает в себя использование способности pulseaudio создавать виртуальные аудиоисточники и инструмент paplay для воспроизведения мультимедиа на этом аудиоустройстве.

Настройка докера

Мне нужно было создать свой собственный образ Docker, основанный на образе Ubuntu/Chrome/Selenium, который я уже использовал, чтобы установить пакет pulseaudio, настроить точку входа для его запуска и добавить некоторые аудиофайлы для воспроизведения.

dockerfile:

FROM selenium/standalone-chrome-debug

# Install pulse audio
RUN apt-get -qq update && apt-get install -y pulseaudio

# Copy some media files into place
RUN mkdir -p /opt/media
COPY audio1.wav /opt/media/audio1.wav
COPY audio2.wav /opt/media/audio2.wav

# Use custom entrypoint
COPY entrypoint.sh /opt/bin/entrypoint.sh

ENTRYPOINT /opt/bin/entrypoint.sh

Затем мне понадобилась пользовательская точка входа, чтобы запустить сервер pulseaudio и настроить собственный источник звука, прежде чем запускать стандартную точку входа запуска Selenium.
Здесь есть два виртуальных устройства, так что одно можно использовать для воспроизведения звука, не подключая его к виртуальному микрофону.

entrypoint.sh

# Load pulseaudio virtual audio source
pulseaudio -D --exit-idle-time=-1

# Create virtual output device (used for audio playback)
pactl load-module module-null-sink sink_name=DummyOutput sink_properties=device.description="Virtual_Dummy_Output"

# Create virtual microphone output, used to play media into the "microphone"
pactl load-module module-null-sink sink_name=MicOutput sink_properties=device.description="Virtual_Microphone_Output"

# Set the default source device (for future sources) to use the monitor of the virtual microphone output
pacmd set-default-source MicOutput.monitor

# Create a virtual audio source linked up to the virtual microphone output
pacmd load-module module-virtual-source source_name=VirtualMic

# Allow pulse audio to be accssed via TCP (from localhost only), to allow other users to access the virtual devices
pacmd load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1

# Configure the "seluser" user to use the network virtual soundcard
mkdir -p /home/seluser/.pulse
echo "default-server = 127.0.0.1" > /home/seluser/.pulse/client.conf
chown seluser:seluser /home/seluser/.pulse -R


# Start Selenium-Chrome-Standalone
/opt/bin/entry_point.sh

Поскольку я хочу использовать аудиоустройство в управляемом Selenium экземпляре Chrome, который запускается от имени пользователя "seluser", мне нужно было открыть виртуальную звуковую карту через TCP (только для локальных соединений), а затем настроить для использования seluser. эта сетевая звуковая карта. Никаких дополнительных настроек не требуется. Виртуальный источник является единственным устройством ввода звука в образе Docker, поэтому Chrome будет использовать его автоматически. Осталось только собрать и запустить докер-контейнер.

Воспроизведение аудио

После запуска контейнера я использовал paplay для отправки мультимедиа на виртуальное устройство вывода, которое я назвал "MicOutput" выше. Это может быть запущено с помощью команды exec:

docker exec -t -i TestContainerName paplay --device=MicOutput /opt/media/audio2.wav

И это все.

Конечно, мне также нужно было использовать опцию «--use-fake-ui-for-media-stream» в Chrome Capbabilities при настройке моего Selenium WebDriver, чтобы позволить Selenium использовать устройство без запроса, но я должен был убедиться, что не используйте опцию --use-fake-device-for-media-stream, так как это заменит фальшивое устройство ввода на встроенное в Chrome.

Благодаря ответу Spacepickle на этот вопрос, который поставил меня на правильный путь, и посту Эли Биллера об использовании Pulse audio для нескольких пользователей

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .