Working streaming audio
This commit is contained in:
parent
e9e246a0cf
commit
849a2551e1
10
Dockerfile
10
Dockerfile
|
@ -7,8 +7,16 @@ RUN apt-get update && apt-get install -y \
|
||||||
xfce4 \
|
xfce4 \
|
||||||
xfce4-goodies \
|
xfce4-goodies \
|
||||||
sudo \
|
sudo \
|
||||||
|
pulseaudio \
|
||||||
|
gstreamer1.0-tools gstreamer1.0-plugins-good \
|
||||||
|
gstreamer1.0-plugins-bad \
|
||||||
|
gstreamer1.0-plugins-ugly \
|
||||||
|
tigervnc-standalone-server tigervnc-common \
|
||||||
|
alsa dbus \
|
||||||
|
nano vim \
|
||||||
&& apt-get clean
|
&& apt-get clean
|
||||||
|
|
||||||
|
|
||||||
RUN mkdir /var/run/sshd
|
RUN mkdir /var/run/sshd
|
||||||
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
|
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
|
||||||
|
|
||||||
|
@ -27,5 +35,7 @@ RUN echo "export VISIBLE=now" >> /etc/profile
|
||||||
COPY create_ubuntu_user.sh /usr/local/bin/create_ubuntu_user.sh
|
COPY create_ubuntu_user.sh /usr/local/bin/create_ubuntu_user.sh
|
||||||
RUN chmod +x /usr/local/bin/create_ubuntu_user.sh
|
RUN chmod +x /usr/local/bin/create_ubuntu_user.sh
|
||||||
|
|
||||||
|
COPY start_services.sh /usr/local/bin/start_services.sh
|
||||||
|
|
||||||
EXPOSE 22 5901
|
EXPOSE 22 5901
|
||||||
CMD ["/usr/sbin/sshd", "-D"]
|
CMD ["/usr/sbin/sshd", "-D"]
|
||||||
|
|
28
README.md
28
README.md
|
@ -0,0 +1,28 @@
|
||||||
|
PRE-REQUISTE:
|
||||||
|
./setup.sh
|
||||||
|
|
||||||
|
This will basically run:
|
||||||
|
docker network create frontend
|
||||||
|
docker network create backend
|
||||||
|
|
||||||
|
Create and bring up an Ubuntu instance with the following:
|
||||||
|
./create_user.sh john_doe 1001 2201 5901 your_secure_password
|
||||||
|
./connect_and_stream.sh
|
||||||
|
|
||||||
|
The ~ (home) directory is saved on the local disk in the ./data directory.
|
||||||
|
|
||||||
|
If you need to bring up a specific user:
|
||||||
|
docker-compose -f docker-compose.user_1001.yml build
|
||||||
|
docker-compose -f docker-compose.user_1001.yml up -d
|
||||||
|
|
||||||
|
OR MANUALLY:
|
||||||
|
|
||||||
|
Locally, type:
|
||||||
|
pulseaudio --load=module-native-protocol-tcp --exit-idle-time=-1 --daemon
|
||||||
|
|
||||||
|
export DISPLAY=:0
|
||||||
|
ssh -Y -C -p 2201 -L 4713:localhost:4713 -L 5000:localhost:5000 john_doe@localhost
|
||||||
|
|
||||||
|
On the remote container:
|
||||||
|
paplay /usr/share/sounds/alsa/Front_Center.wav
|
||||||
|
PULSE_SERVER=unix:/tmp/pulseaudio.socket firefox
|
55
connect_and_stream.sh
Executable file
55
connect_and_stream.sh
Executable file
|
@ -0,0 +1,55 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# connect_and_stream.sh
|
||||||
|
|
||||||
|
SERVER_IP="localhost"
|
||||||
|
SSH_PORT="2201" # or whatever SSH port you're using
|
||||||
|
USERNAME="john_doe" # or the appropriate username
|
||||||
|
REMOTE_AUDIO_PORT="5000"
|
||||||
|
LOCAL_AUDIO_PORT="5000"
|
||||||
|
PULSE_PORT="4713"
|
||||||
|
|
||||||
|
# Function to find an available port
|
||||||
|
find_available_port() {
|
||||||
|
local port=$1
|
||||||
|
while ! nc -z localhost $port &>/dev/null; do
|
||||||
|
((port++))
|
||||||
|
done
|
||||||
|
echo $port
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to clean up background processes on script exit
|
||||||
|
cleanup() {
|
||||||
|
echo "Cleaning up..."
|
||||||
|
if [ ! -z "$SSH_PID" ]; then
|
||||||
|
kill $SSH_PID
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
# Set up the cleanup function to run on script exit
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
# Find available ports
|
||||||
|
LOCAL_AUDIO_PORT=$(find_available_port $LOCAL_AUDIO_PORT)
|
||||||
|
PULSE_PORT=$(find_available_port $PULSE_PORT)
|
||||||
|
|
||||||
|
echo "Using local audio port: $LOCAL_AUDIO_PORT"
|
||||||
|
echo "Using PulseAudio port: $PULSE_PORT"
|
||||||
|
|
||||||
|
# Start SSH tunnel in the background
|
||||||
|
ssh -f -N -L ${LOCAL_AUDIO_PORT}:localhost:${REMOTE_AUDIO_PORT} -L ${PULSE_PORT}:localhost:4713 -p ${SSH_PORT} ${USERNAME}@${SERVER_IP}
|
||||||
|
SSH_PID=$!
|
||||||
|
|
||||||
|
# Wait a moment for the tunnel to establish
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
# Set PULSE_SERVER to use the forwarded port
|
||||||
|
export PULSE_SERVER=tcp:localhost:${PULSE_PORT}
|
||||||
|
|
||||||
|
# Start GStreamer client
|
||||||
|
#gst-launch-1.0 udpsrc uri=udp://localhost:${LOCAL_AUDIO_PORT} caps="application/x-rtp,media=audio,clock-rate=48000,encoding-name=OPUS" ! rtpopusdepay ! opusdec ! audioconvert ! autoaudiosink
|
||||||
|
gst-launch-1.0 udpsrc port=${LOCAL_AUDIO_PORT} caps="application/x-rtp,media=audio,clock-rate=48000,encoding-name=OPUS" ! rtpopusdepay ! opusdec ! audioconvert ! autoaudiosink
|
||||||
|
|
||||||
|
# The script will keep running until you stop it (Ctrl+C)
|
||||||
|
# When stopped, the cleanup function will kill the SSH tunnel
|
|
@ -18,4 +18,19 @@ su - $USERNAME -c "mkdir -p ~/.vnc && x11vnc -storepasswd $PASSWORD ~/.vnc/passw
|
||||||
# Set up X11 forwarding for the user
|
# Set up X11 forwarding for the user
|
||||||
echo "export DISPLAY=host.docker.internal:0" >> /home/$USERNAME/.bashrc
|
echo "export DISPLAY=host.docker.internal:0" >> /home/$USERNAME/.bashrc
|
||||||
|
|
||||||
echo "User $USERNAME created with the provided password."
|
# Set up PulseAudio
|
||||||
|
su - $USERNAME -c "mkdir -p ~/.config/pulse"
|
||||||
|
su - $USERNAME -c "echo 'autospawn = yes' > ~/.config/pulse/client.conf"
|
||||||
|
su - $USERNAME -c "echo 'daemon-binary = /usr/bin/pulseaudio' >> ~/.config/pulse/client.conf"
|
||||||
|
su - $USERNAME -c "echo 'enable-shm = false' >> ~/.config/pulse/client.conf"
|
||||||
|
su - $USERNAME -c "echo 'enable-memfd = yes' >> ~/.config/pulse/client.conf"
|
||||||
|
|
||||||
|
su - $USERNAME -c "echo 'load-module module-native-protocol-unix' > ~/.config/pulse/default.pa"
|
||||||
|
su - $USERNAME -c "echo 'load-module module-native-protocol-tcp auth-anonymous=1' >> ~/.config/pulse/default.pa"
|
||||||
|
su - $USERNAME -c "echo 'load-module module-always-sink' >> ~/.config/pulse/default.pa"
|
||||||
|
# su - $USERNAME -c "echo 'load-module module-null-sink' >> ~/.config/pulse/default.pa"
|
||||||
|
# su - $USERNAME -c "echo 'load-module module-pipe-sink' >> ~/.config/pulse/default.pa"
|
||||||
|
su - $USERNAME -c "echo 'load-module module-virtual-sink sink_name=virtual_output' >> ~/.config/pulse/default.pa"
|
||||||
|
su - $USERNAME -c "echo 'set-default-sink virtual_output' >> ~/.config/pulse/default.pa"
|
||||||
|
|
||||||
|
echo "User $USERNAME created with the provided password and PulseAudio configured."
|
|
@ -33,7 +33,7 @@ services:
|
||||||
- SYS_ADMIN
|
- SYS_ADMIN
|
||||||
security_opt:
|
security_opt:
|
||||||
- seccomp:unconfined
|
- seccomp:unconfined
|
||||||
command: ["/bin/bash", "-c", "/usr/local/bin/create_ubuntu_user.sh ${USER_NAME} ${PASSWORD} && /usr/sbin/sshd -D"]
|
command: ["/bin/bash", "-c", "/usr/local/bin/create_ubuntu_user.sh ${USER_NAME} ${PASSWORD} && /usr/local/bin/start_services.sh"]
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
frontend:
|
frontend:
|
||||||
|
|
11
setup.sh
Executable file
11
setup.sh
Executable file
|
@ -0,0 +1,11 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# setup.sh
|
||||||
|
|
||||||
|
# Build the base image
|
||||||
|
docker build -t ubuntu_dev_env .
|
||||||
|
|
||||||
|
# Create networks
|
||||||
|
docker network create frontend
|
||||||
|
docker network create backend
|
||||||
|
|
13
start.sh
13
start.sh
|
@ -1,13 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Start SSH
|
|
||||||
/usr/sbin/sshd
|
|
||||||
|
|
||||||
# Start Xvfb
|
|
||||||
Xvfb :1 -screen 0 1024x768x16 &
|
|
||||||
|
|
||||||
# Start VNC server
|
|
||||||
vncserver :1 -geometry 1024x768 -depth 16 -SecurityTypes None
|
|
||||||
|
|
||||||
# Keep the container running
|
|
||||||
tail -f /dev/null
|
|
32
start_services.sh
Executable file
32
start_services.sh
Executable file
|
@ -0,0 +1,32 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Start D-Bus
|
||||||
|
mkdir -p /var/run/dbus
|
||||||
|
dbus-daemon --system --fork
|
||||||
|
|
||||||
|
# Start SSH
|
||||||
|
/usr/sbin/sshd
|
||||||
|
|
||||||
|
# Start Xvfb
|
||||||
|
Xvfb :1 -screen 0 1024x768x16 &
|
||||||
|
|
||||||
|
# Start VNC server
|
||||||
|
vncserver :1 -geometry 1024x768 -depth 16 -SecurityTypes None
|
||||||
|
|
||||||
|
# Start PulseAudio
|
||||||
|
su - $USER_NAME -c "pulseaudio --start -D --verbose"
|
||||||
|
|
||||||
|
# Set up virtual audio output
|
||||||
|
su - $USER_NAME -c "pactl unload-module module-null-sink || true"
|
||||||
|
su - $USER_NAME -c "pactl unload-module module-pipe-sink || true"
|
||||||
|
su - $USER_NAME -c "pactl load-module module-virtual-sink sink_name=virtual_output"
|
||||||
|
su - $USER_NAME -c "pactl set-default-sink virtual_output"
|
||||||
|
|
||||||
|
# Ensure all audio streams are moved to the virtual_output
|
||||||
|
su - $USER_NAME -c "pactl list short sink-inputs | cut -f1 | while read stream; do pactl move-sink-input \$stream virtual_output; done"
|
||||||
|
|
||||||
|
# Start audio streaming
|
||||||
|
su - $USER_NAME -c "gst-launch-1.0 pulsesrc device=virtual_output.monitor ! audioconvert ! opusenc ! rtpopuspay ! udpsink host=host.docker.internal port=5000 &"
|
||||||
|
|
||||||
|
# Keep the container running
|
||||||
|
tail -f /dev/null
|
Loading…
Reference in New Issue
Block a user