Headless Browser: вывод звука на Pulseaudio

Headless Browser: вывод звука на Pulseaudio

Я пытаюсь запустить headless-браузер на экземпляре EC2/Ubuntu 20.04, а затем вывести полученный аудиопоток на приемник Pulseaudio по умолчанию (который затем подхватывается DarkIce/Icecast). Я хочу запустить только одну веб-страницу (мою, размещенную на другом сервере, требующую jQuery и Howler.js), и полученный браузер/поток должен оставаться открытым 24/7.

Мне удалось получить аудиофайл на экземпляре для воспроизведения в Icecast (используя ogg123), поэтому ogg123>Pulseaudio>Darkice>Icecast2 работает. Я создал приемник по умолчанию, как показано ниже

pactl load-module module-null-sink sink_name=radio
pacmd update-sink-proplist radio device.description=radio
pacmd set-default-sink radio

и сделал Pulseaudio драйвером по умолчанию, создав ~/.asoundrc для включения

pcm.default pulse
ctl.default pulse

Я не уверен, какой подход правильный, чтобы заставить браузер воспроизводить хорошо. Я пробовал (и google-chome, и chromium) указывать напрямую как на аудиофайл, так и на страницу с js, которая воспроизводит аудио (с намерением в конечном итоге запустить его в Screen), оба из которых, похоже, находят контент, ни один из подходов не воспроизводит аудио. Например,

 google-chrome-stable --headless --disable-gpu --autoplay-policy=no-user-gesture-required --user-data-dir=/home/ubuntu/chromeUser --disable-accelerated-video-decode --disable-software-rasterizer --enable-logging=stderr --v=1  https://domain.name/stream.html 

генерирует следующее

[0608/102421.257217:INFO:cpu_info.cc(53)] Available number of cores: 1
[0608/102421.258656:INFO:cpu_info.cc(53)] Available number of cores: 1
[0608/102421.258861:VERBOSE1:zygote_main_linux.cc(217)] ZygoteMain: initializing 0 fork delegates
[0608/102421.259318:VERBOSE1:zygote_main_linux.cc(217)] ZygoteMain: initializing 0 fork delegates
[0608/102421.271947:VERBOSE1:webrtc_internals.cc(118)] Could not get the download directory.
[0608/102421.280120:VERBOSE1:breakpad_linux.cc(2071)] Non Browser crash dumping enabled for: gpu-process
[0608/102421.283276:ERROR:gpu_init.cc(440)] Passthrough is not supported, GL is disabled
[0608/102421.286107:VERBOSE1:breakpad_linux.cc(2071)] Non Browser crash dumping enabled for: renderer
[0608/102421.288099:VERBOSE1:sandbox_linux.cc(69)] Activated seccomp-bpf sandbox for process type: gpu-process.
[0608/102421.293815:VERBOSE1:sandbox_linux.cc(69)] Activated seccomp-bpf sandbox for process type: renderer.
[0608/102421.303930:VERBOSE1:device_data_manager_x11.cc(216)] X Input extension not available
[0608/102421.356750:VERBOSE1:configured_proxy_resolution_service.cc(852)] PAC support disabled because there is no system implementation
[0608/102421.357514:VERBOSE1:configured_proxy_resolution_service.cc(852)] PAC support disabled because there is no system implementation
[0608/102421.359494:VERBOSE1:network_delegate.cc(32)] NetworkDelegate::NotifyBeforeURLRequest: https://domain.name/stream.html
[0608/102421.411474:VERBOSE1:document.cc(3974)] Document::DispatchUnloadEvents() URL = <null>
[0608/102421.411727:VERBOSE1:document.cc(4054)] Actually dispatching an UnloadEvent: URL = <null>
[0608/102421.421675:VERBOSE1:network_delegate.cc(32)] NetworkDelegate::NotifyBeforeURLRequest: /path/to/jquery.min.js
[0608/102421.424968:VERBOSE1:network_delegate.cc(32)] NetworkDelegate::NotifyBeforeURLRequest: /path/to/jquery-ui.min.js
[0608/102421.429480:VERBOSE1:network_delegate.cc(32)] NetworkDelegate::NotifyBeforeURLRequest: /path/to/howler.min.js

Правильный ли это подход, чтобы все заработало (и если да, то почему нет?), или мне следует использовать Selenium/Puppeteer/что-то еще?

Спасибо, Крис.

[в сторону: я пробовалколичество вещей[попытаться удалить ошибку «Passthrough is not supported, GL is swiftshader», но безуспешно, хотя, похоже, это не мешает браузеру получить доступ к странице]

решение1

Мне удалось заставить это работать, запустив Puppeteer, вместо того, чтобы пытаться управлять Chromium из командной строки. Я использовалэтот ответ(надеюсь) оставить Puppeteer открытым со следующими аргументами, чтобы звук запускался автоматически.

 this.browser = await puppeteer.launch({
     headless: true,
     ignoreDefaultArgs: [
         "--mute-audio",
     ],
     args: [
         "--autoplay-policy=no-user-gesture-required",
     ],
  });

После настройки приемника по умолчанию в PulseAudio и добавления ~/.ascoundrc (как указано выше) все работает (звук приемника принимается DarkIce > IceCast > трансляция). Я, скорее всего, буду использоватьpm2для надзора за Кукловодом, но на данный момент это рабочее решение.

Связанный контент