GPU Passthrough for 24/7 YouTube Live Streaming with Proxmox

· 2 min read
proxmox gpu ffmpeg streaming docker homelab

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

  1. Set up Azuracast for radio streaming
  2. Create a looping background video
  3. Use FFmpeg to combine audio + video
  4. Add song metadata overlay via Node.js
  5. Push to YouTube via Restreamer
  6. 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.

Available for rescue and re-platforming work

I take over platforms that already exist and are in trouble. Node, TypeScript, React and Laravel, mostly in regulated or high-traffic environments. If something needs rescuing, re-platforming or finishing, my full history is on the CV.

Related Posts

Comments