Headless Browser: Audioausgabe an Pulseaudio

Headless Browser: Audioausgabe an Pulseaudio

Ich versuche, einen Headless-Browser auf einer EC2/Ubuntu 20.04-Instanz auszuführen und dann den resultierenden Audiostream an den Standard-Pulseaudio-Sink auszugeben (der dann von DarkIce/Icecast abgerufen wird). Ich möchte nur eine einzige Webseite ausführen (meine, die auf einem anderen Server gehostet wird und jQuery & Howler.js erfordert), und der resultierende Browser/Stream muss rund um die Uhr geöffnet bleiben.

Ich habe es geschafft, eine Audiodatei auf der Instanz zu erstellen, die ich auf Icecast abspielen kann (mit ogg123), also funktioniert ogg123>Pulseaudio>Darkice>Icecast2. Ich habe einen Standard-Sink wie unten beschrieben erstellt.

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

und Pulseaudio zum Standardtreiber gemacht, indem ~/.asoundrc erstellt wurde, um Folgendes einzuschließen:

pcm.default pulse
ctl.default pulse

Ich bin mir nicht sicher, was der richtige Ansatz ist, damit der Browser gut funktioniert. Ich habe versucht (sowohl Google Chrome als auch Chromium), direkt sowohl auf eine Audiodatei als auch auf eine Seite mit JS zu verweisen, die Audio abspielt (mit der Absicht, es schließlich in Screen auszuführen), beide scheinen den Inhalt zu finden, keiner der Ansätze spielt Audio ab. Zum Beispiel:

 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 

erzeugt folgendes

[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

Ist dies der richtige Ansatz, damit es funktioniert (und wenn ja, warum funktioniert es nicht?), oder sollte ich Selenium/Puppeteer/etwas anderes verwenden?

Danke, Chris

[nebenbei: Ich habe versucht,Anzahl der Dingeum zu versuchen, den Fehler „Passthrough wird nicht unterstützt, GL ist Swiftshader“ zu beheben, ohne Erfolg, obwohl es den Browser anscheinend nicht daran hindert, auf die Seite zuzugreifen]

Antwort1

Ich habe es geschafft, dies zum Laufen zu bringen, indem ich Puppeteer ausgeführt habe, anstatt zu versuchen, Chromium über die Befehlszeile zu steuern. Ich habe verwendetdiese Antwortum Puppeteer (hoffentlich) mit den folgenden Argumenten offen zu halten, damit der Ton automatisch gestartet wird.

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

Nachdem ich den Standard-Sink in PulseAudio eingerichtet und ~/.ascoundrc hinzugefügt habe (wie oben), funktioniert alles (Sink-Audio wird von DarkIce > IceCast > Broadcast aufgenommen). Ich werde wahrscheinlich verwendenpm2um Puppeteer zu überwachen, aber im Moment ist es eine funktionierende Lösung.

verwandte Informationen