ヘッドレスブラウザ: Pulseaudio へのオーディオ出力

ヘッドレスブラウザ: Pulseaudio へのオーディオ出力

EC2/Ubuntu 20.04 インスタンスでヘッドレス ブラウザーを実行し、結果のオーディオ ストリームをデフォルトの Pulseaudio シンク (その後 DarkIce/Icecast によって取得される) に出力しようとしています。実行したいのは 1 つの Web ページ (別のサーバーでホストされ、jQuery と Howler.js を必要とする私のページ) のみで、結果のブラウザー/ストリームは 24 時間 365 日開いたままにしておく必要があります。

インスタンス上のオーディオファイルを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

そして、~/.asoundrcを作成してPulseaudioをデフォルトのドライバにした。

pcm.default pulse
ctl.default pulse

ブラウザでうまく再生するには、どのようなアプローチが正しいのかわかりません。私は、オーディオ ファイルとオーディオを再生する 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 または他の何かを使用する必要がありますか?

ありがとう、クリス

[余談: 私は物事の数「パススルーはサポートされていません。GL は SwiftShader です」というエラーを削除しようとしましたが、成功しませんでした。ただし、ブラウザがページにアクセスするのを妨げるようには見えません。

答え1

私はChromiumをコマンドラインから操作するのではなく、Puppeteerを実行することでこれを動作させることができました。この答えオーディオが自動的に開始されるように、次の引数を指定して Puppeteer を開いたままにします (うまくいけば)。

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

PulseAudioでデフォルトのシンクを設定し、~/.ascoundrc(上記)を追加すると、すべて動作します(シンクオーディオはDarkIce > IceCast > ブロードキャストで拾われます)。おそらく以下を使用します。午後2時Puppeteer を監視するためのものですが、現時点では機能するソリューションです。

関連情報