Navegador sem cabeça: saída de áudio para Pulseaudio

Navegador sem cabeça: saída de áudio para Pulseaudio

Estou tentando executar um navegador sem cabeça em uma instância EC2/Ubuntu 20.04 e, em seguida, enviar o fluxo de áudio resultante para o coletor Pulseaudio padrão (que é então captado pelo DarkIce/Icecast). Só quero executar uma única página da Web (a minha, hospedada em um servidor diferente, exigindo jQuery e Howler.js), e o navegador/stream resultante deve permanecer aberto 24 horas por dia, 7 dias por semana.

Consegui obter um arquivo de áudio na instância para reproduzir no Icecast (usando ogg123), então ogg123>Pulseaudio>Darkice>Icecast2 funciona. Eu criei um coletor padrão conforme abaixo

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

e tornou o Pulseaudio o driver padrão criando ~/.asoundrc para incluir

pcm.default pulse
ctl.default pulse

Não tenho certeza de qual é a abordagem correta para fazer o navegador funcionar bem. Eu tentei (tanto google-chome quanto chromium) apontar diretamente para um arquivo de áudio e uma página com js que reproduz áudio (com a intenção de eventualmente executá-lo na Tela), ambos parecem encontrar o conteúdo, nenhuma abordagem reproduz qualquer áudio. Por exemplo,

 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 

gera o seguinte

[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

Esta é a abordagem correta para fazer isso funcionar (e, em caso afirmativo, por que não funciona?), ou devo usar Selenium/Puppeteer/outra coisa?

Obrigado, Chris

[à parte: eu tentei umnúmero de coisaspara tentar remover o erro "Passthrough não é suportado, GL é swiftshader", sem sucesso, embora não pareça impedir o navegador de acessar a página]

Responder1

Consegui fazer isso funcionar executando o Puppeteer, em vez de tentar manipular o Chromium na linha de comando. eu useiesta respostapara (espero) manter o Puppeteer aberto com os seguintes argumentos para que o áudio comece automaticamente.

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

Depois de configurar o coletor padrão no PulseAudio e adicionar ~/.ascoundrc (como acima), tudo funciona (áudio do coletor captado por DarkIce > IceCast > broadcast). Provavelmente usareipm2para supervisionar o Puppeteer, mas por enquanto é uma solução funcional.

informação relacionada