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.