GPU Passthrough for 24/7 YouTube Live Streaming with Proxmox
What We’re Building
A 24/7 YouTube live stream that plays your music library over a looping video background, with real-time song information overlay-all running on a home server with GPU acceleration.
Prerequisites
- A server with a dedicated GPU (I used an HP Z800 with a GT 710)
- Proxmox installed as hypervisor
- YouTube, account with live streaming enabled (requires 24-hour wait)
- Basic Docker knowledge
The Approach
- Set up Azuracast for radio streaming
- Create a looping background video
- Use FFmpeg to combine audio + video
- Add song metadata overlay via Node.js
- Push to YouTube via Restreamer
- Enable GPU passthrough for smooth rendering
Step 1: Set Up Azuracast
Create an Ubuntu Server VM in Proxmox, then install Docker and Azuracast:
docker-compose up -d
Add your music to playlists and configure a radio stream. Note your stream URL-you’ll need it for FFmpeg.
Step 2: Create Your Background Video
Use Premiere Pro or DaVinci Resolve to create a looping video. Key tips:
- Export at 1080p (YouTube doesn’t allow 4K streaming for most accounts)
- Keep it simple a static image or subtle animation reduces CPU load
- Ensure it loops seamlessly
Step 3: Combine Audio and Video with FFmpeg
ffmpeg -re -stream_loop -1 -i loop.mp4 \
-i http://your-azuracast-url:8000/radio.mp3 \
-c:v libx264 -preset veryfast -b:v 3000k \
-c:a aac -b:a 128k \
-f flv rtmp://a.rtmp.youtube.com/live2/YOUR_STREAM_KEY
Step 4: Add Song Metadata Overlay
Create a Node.js script that subscribes to Azuracast’s WebSocket and writes current song info to a text file:
// Subscribe to Azuracast now-playing websocket
// Write song title to /tmp/nowplaying.txt
Then modify FFmpeg to overlay the text:
-vf "drawtext=textfile=/tmp/nowplaying.txt:reload=1:fontsize=24:fontcolor=white:x=50:y=50"
Step 5: GPU Passthrough in Proxmox
This is where the magic happens. Without GPU acceleration, my 24-core CPU was at 80%. With the GT 710 handling encoding, it dropped to 4%.
Follow the Proxmox GPU passthrough guide to pass your GPU to the VM.
Then use nvidia-ffmpeg in Docker:
docker run --gpus all willprice/nvidia-ffmpeg \
-hwaccel cuda -hwaccel_output_format cuda \
# ... rest of your ffmpeg command with h264_nvenc
The Result
A smooth 24/7 stream running on minimal resources:
- GPU handles all video encoding
- Azuracast manages your music library
- Restreamer lets you push to multiple platforms simultaneously
What I’d Do Differently
Enable GPU passthrough from the start. I wasted hours troubleshooting choppy video before realising CPU encoding was the bottleneck.
This took me about 2 weekends to get working smoothly. If it helped you, let me know on Twitter/Bluesky.