commit 15e4efc35626711373c7e51dec2186613a73aa69 Author: root Date: Fri Oct 14 15:29:51 2022 +0200 init diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..6703b44 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,99 @@ +FROM debian:stretch + +RUN echo 'deb http://deb.debian.org/debian stretch-backports main' > /etc/apt/sources.list.d/backports.list + +ARG DEBIAN_FRONTEND=noninteractive + +RUN apt-get -qq update \ + &&apt-get install -y gnupg2 \ + x11vnc \ + xvfb \ + fluxbox \ + wget \ + curl \ + wmctrl \ + dbus-x11 \ + gconf-service \ + libasound2 \ + libatk1.0-0 \ + libc6 \ + libcairo2 \ + libcups2 \ + libdbus-1-3 \ + libexpat1 \ + libfontconfig1 \ + libgcc1 \ + libgconf-2-4 \ + libgdk-pixbuf2.0-0 \ + libglib2.0-0 \ + libgtk-3-0 \ + libnspr4 \ + libpango-1.0-0 \ + libpangocairo-1.0-0 \ + libstdc++6 \ + libx11-6 \ + libx11-xcb1 \ + libxcb1 \ + libxcomposite1 \ + libxcursor1 \ + libxdamage1 \ + libxext6 \ + libxfixes3 \ + libxi6 \ + libxrandr2 \ + libxrender1 \ + libxss1 \ + libxtst6 \ + fonts-ipafont-gothic \ + fonts-wqy-zenhei \ + fonts-thai-tlwg \ + fonts-kacst \ + ttf-freefont \ + ca-certificates \ + fonts-liberation \ + libappindicator1 \ + libnss3 \ + lsb-release \ + xdg-utils \ + pulseaudio \ + ffmpeg \ + nano \ + alsa-utils \ + jackd2 \ + pavucontrol + +RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ + && echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list + +RUN apt-get -qq update \ + && apt-get -y install google-chrome-stable \ + && rm -rf /var/lib/apt/lists/* \ + && apt-get purge --auto-remove -y curl + +ENV LANG="C.UTF-8" + +RUN useradd -m -G pulse-access chrome \ + && usermod -s /bin/bash chrome \ + && mkdir -p /home/chrome/.fluxbox \ + && echo ' \n\ + #session.screen0.toolbar.visible: false\n\ + #session.screen0.fullMaximization: true\n\ + #session.screen0.maxDisableResize: true\n\ + #session.screen0.maxDisableMove: true\n\ + #session.screen0.defaultDeco: NONE\n\ + ' >> /home/chrome/.fluxbox/init \ + && chown -R chrome:chrome /home/chrome/.fluxbox + +RUN rm /etc/machine-id && ln -s /var/lib/dbus/machine-id /etc/machine-id +RUN echo "DBUS_SESSION_BUS_ADDRESS=/dev/null" >> /etc/environment +ENV DBUS_SESSION_BUS_ADDRESS=/dev/null + +RUN mkdir -p /var/run/dbus && dbus-daemon --config-file=/usr/share/dbus-1/system.conf --print-address \ + && sed -i 's/load-module module-console-kit/#load-module module-console-kit/g' /etc/pulse/default.pa + +COPY bootstrap.sh / +COPY stream.sh / + +EXPOSE 5900 + +CMD '/bootstrap.sh' diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100755 index 0000000..7d6d7ae --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1,85 @@ +#!/bin/bash + +# Based on: http://www.richud.com/wiki/Ubuntu_Fluxbox_GUI_with_x11vnc_and_Xvfb + +readonly G_LOG_I='[INFO]' +readonly G_LOG_W='[WARN]' +readonly G_LOG_E='[ERROR]' + +main() { + launch_xvfb + launch_window_manager + run_vnc_server +} + +launch_xvfb() { + # Set defaults if the user did not specify envs. + export DISPLAY=${XVFB_DISPLAY:-:0} + local screen=${XVFB_SCREEN:-0} + local resolution=${XVFB_RESOLUTION:-1280x720x24} + local timeout=${XVFB_TIMEOUT:-5} + + # Start and wait for either Xvfb to be fully up or we hit the timeout. + Xvfb ${DISPLAY} -screen ${screen} ${resolution} & + local loopCount=0 + until xdpyinfo -display ${DISPLAY} > /dev/null 2>&1 + do + loopCount=$((loopCount+1)) + sleep 1 + if [ ${loopCount} -gt ${timeout} ] + then + echo "${G_LOG_E} xvfb failed to start." + exit 1 + fi + done +} + +launch_window_manager() { + local timeout=${XVFB_TIMEOUT:-5} + + # Start and wait for either fluxbox to be fully up or we hit the timeout. + fluxbox & + local loopCount=0 + until wmctrl -m > /dev/null 2>&1 + do + loopCount=$((loopCount+1)) + sleep 1 + if [ ${loopCount} -gt ${timeout} ] + then + echo "${G_LOG_E} fluxbox failed to start." + exit 1 + fi + done +} + +run_vnc_server() { + local passwordArgument='-nopw' + + if [ -n "${VNC_SERVER_PASSWORD}" ] + then + local passwordFilePath="${HOME}/x11vnc.pass" + if ! x11vnc -storepasswd "${VNC_SERVER_PASSWORD}" "${passwordFilePath}" + then + echo "${G_LOG_E} Failed to store x11vnc password." + exit 1 + fi + passwordArgument=-"-rfbauth ${passwordFilePath}" + echo "${G_LOG_I} The VNC server will ask for a password." + else + echo "${G_LOG_W} The VNC server will NOT ask for a password." + fi + + x11vnc -display ${DISPLAY} -forever ${passwordArgument} & + wait $! +} + +control_c() { + echo "" + exit +} + +trap control_c SIGINT SIGTERM SIGHUP + +main + +exit diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..5a125b2 --- /dev/null +++ b/build.sh @@ -0,0 +1 @@ +docker build . -t tiktok-streamer diff --git a/stream.sh b/stream.sh new file mode 100755 index 0000000..0c32389 --- /dev/null +++ b/stream.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +: ${INRES:="1280x720"} +: ${FPS:="30"} +: ${GOP:="30"} + +: ${OUTRES:="1280x720"} +: ${QUALITY:="ultrafast"} +: ${CBR:="2000k"} + +: ${A_FREQ:="44100"} +: ${A_BITS:="128k"} + +: ${SERVER:="rtmp://a.rtmp.youtube.com/live2/"} + +ffmpeg \ +-f alsa -ar "$A_FREQ" -ac 2 -i default \ +-f x11grab -video_size "$INRES" -r "$FPS" -i :0 \ +-c:v libx264 -preset "$QUALITY" -tune film -b:v "$CBR" -b:a "$A_BITS" -pix_fmt yuv420p -g "$GOP" \ +-map 0:a -map 1:v \ +-f flv "$SERVER$SERVER_KEY"