Monorepo for Aesthetic.Computer
aesthetic.computer
1#!/bin/bash
2set -e
3
4XVFB_RESOLUTION="${XVFB_RESOLUTION:-320x240x24}"
5DISPLAY="${DISPLAY:-:1}"
6CHROME_URL="https://aesthetic.computer"
7OUTPUT_URL="rtmp://localhost/live/test"
8
9cleanup() {
10 pkill -TERM chromium-browser || true
11 pkill -TERM ffmpeg || true
12 pkill -TERM Xvfb || true
13 pulseaudio --kill || true
14}
15trap cleanup SIGINT SIGTERM
16
17echo "Starting Xvfb..."
18Xvfb "$DISPLAY" -screen 0 "$XVFB_RESOLUTION" -ac &
19sleep 2
20
21echo "Starting PulseAudio..."
22pulseaudio --start --exit-idle-time=-1 --log-level=error
23sleep 2
24
25echo "Loading null sink..."
26pactl load-module module-null-sink sink_name=dummy_sink
27pactl set-default-sink dummy_sink
28sleep 2
29
30echo "Starting nginx RTMP server..."
31/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
32
33echo "Launching Chromium..."
34chromium-browser \
35 --no-sandbox \
36 --window-size=320,240 "$CHROME_URL" \
37 --disable-infobars \
38 --no-first-run \
39 --no-default-browser-check \
40 --disable-dev-shm-usage \
41 --remote-debugging-port=9222 &
42
43sleep 5
44
45echo "Starting ffmpeg stream..."
46ffmpeg -y \
47 -f x11grab -video_size 320x240 -i "$DISPLAY" \
48 -f pulse -ac 2 -i default \
49 -c:v libx264 -preset ultrafast -maxrate 800k -bufsize 400k \
50 -g 60 -r 30 -pix_fmt yuv420p \
51 -c:a aac -b:a 128k -ar 44100 \
52 -f flv "$OUTPUT_URL"