Estoy intentando ejecutar un navegador sin cabeza en una instancia EC2/Ubuntu 20.04 y luego enviar la transmisión de audio resultante al receptor Pulseaudio predeterminado (que luego es recogido por DarkIce/Icecast). Solo quiero ejecutar una única página web (la mía, alojada en un servidor diferente, que requiere jQuery y Howler.js), y el navegador/transmisión resultante debe permanecer abierto las 24 horas del día, los 7 días de la semana.
Logré obtener un archivo de audio en la instancia para reproducirlo en Icecast (usando ogg123), por lo que ogg123>Pulseaudio>Darkice>Icecast2 funciona. He creado un receptor predeterminado como se muestra a continuación.
pactl load-module module-null-sink sink_name=radio
pacmd update-sink-proplist radio device.description=radio
pacmd set-default-sink radio
e hice de Pulseaudio el controlador predeterminado creando ~/.asoundrc para incluir
pcm.default pulse
ctl.default pulse
No estoy seguro de cuál es el enfoque correcto para que el navegador funcione correctamente. Intenté (tanto google-chome como chromium) apuntar directamente a un archivo de audio y a una página con js que reproduce audio (con la intención de ejecutarlo eventualmente en la pantalla), y ambos parecen encontrar el contenido, ninguno de los dos se acerca. reproduce cualquier audio. Por ejemplo,
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
genera lo siguiente
[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
¿Es este el enfoque correcto para que esto funcione (y, de ser así, por qué no funciona?), ¿o debería usar Selenium/Puppeteer/algo más?
Gracias, cris
[aparte: he probado uncantidad de cosaspara intentar eliminar el error "Passthrough no es compatible, GL es swiftshader", sin éxito, aunque no parece impedir que el navegador acceda a la página]
Respuesta1
Logré que esto funcionara ejecutando Puppeteer, en lugar de intentar ejecutar Chromium desde la línea de comando. he usadoesta respuesta(con suerte) mantener abierto Puppeteer con los siguientes argumentos para que el audio se inicie automáticamente.
this.browser = await puppeteer.launch({
headless: true,
ignoreDefaultArgs: [
"--mute-audio",
],
args: [
"--autoplay-policy=no-user-gesture-required",
],
});
Después de configurar el receptor predeterminado en PulseAudio y agregar ~/.ascoundrc (como arriba), todo funciona (audio del receptor captado por DarkIce > IceCast > transmisión). probablemente usarépm2para supervisar Puppeteer, pero por ahora es una solución que funciona.