Overview
Hyperscape captures game music and sound effects for RTMP streams using PulseAudio virtual sinks. This allows viewers to hear the game audio alongside video.Architecture
- PulseAudio - Audio server with virtual sink
- chrome_audio sink - Virtual audio device for Chrome output
- chrome_audio.monitor - Monitor device for FFmpeg capture
- FFmpeg - Captures from monitor and encodes to AAC
PulseAudio Setup
Installation
User Mode Configuration
Why user mode:- More reliable than system mode
- Better permissions handling
- Easier debugging
Virtual Sink Creation
Create chrome_audio sink:Permissions
Add user to pulse-access group:Chrome Configuration
Audio Output
Chrome automatically uses the default PulseAudio sink when launched withPULSE_SERVER set:
FFmpeg Configuration
Audio Input
Capture from PulseAudio monitor:thread_queue_size 1024- Prevent buffer underrunsuse_wallclock_as_timestamps 1- Real-time timing-f pulse- PulseAudio input format-ac 2- Stereo audio (2 channels)-ar 44100- Sample rate (44.1 kHz)chrome_audio.monitor- Monitor device (captures sink output)
Audio Processing
Async resampling for drift recovery:- Recovers from audio drift when video/audio desync
async=1000- Resample if drift exceeds 1000 samples (22ms at 44.1kHz)first_pts=0- Reset PTS to prevent timestamp issues
Audio Encoding
-c:a aac- AAC codec (required for RTMP)-b:a 128k- Audio bitrate (128 kbps default)-ar 44100- Output sample rate-flags +global_header- Required for RTMP/FLV
Environment Variables
Graceful Fallback
If PulseAudio is not available, FFmpeg automatically falls back to silent audio:- Many RTMP servers require an audio track
- Silent audio prevents stream rejection
- Better than failing the entire stream
Troubleshooting
PulseAudio Not Running
Check status:chrome_audio Sink Missing
List sinks:No Audio in Stream
Check FFmpeg is capturing:Audio Dropouts
Symptoms:- Intermittent audio cutting out
- Audio desync from video
- Crackling or stuttering
Audio/Video Desync
Symptoms:- Audio ahead or behind video
- Lip sync issues
- Audio drift over time
Permission Errors
Error:Audio Quality Settings
Bitrate
Default: 128 kbps (good quality, low bandwidth)Sample Rate
Default: 44.1 kHz (CD quality)Channels
Default: Stereo (2 channels)Monitoring
Check PulseAudio Status
Check Audio Levels
FFmpeg Audio Stats
Performance Impact
CPU Usage
PulseAudio: ~1-2% CPU FFmpeg AAC encoding: ~5-10% CPU per stream Total audio overhead: ~10-15% CPUMemory Usage
PulseAudio: ~50-100 MB RAM FFmpeg audio buffers: ~10-20 MB RAM Total audio overhead: ~100-150 MB RAMBandwidth
Audio bitrate: 128 kbps = 16 KB/s = ~1 MB/minute Impact on total stream:- Video: 4500 kbps (default)
- Audio: 128 kbps
- Total: 4628 kbps (~3% overhead)
Disabling Audio
To disable audio capture and use silent audio:- Debugging audio issues
- Reducing CPU usage
- Testing video-only streams
- Copyright concerns (music in game)
Advanced Configuration
Custom PulseAudio Config
Create custom~/.config/pulse/default.pa:
Audio Filters
Normalize audio levels:Multiple Audio Sources
Mix game audio + microphone:Deployment Integration
Vast.ai Deployment
Thedeploy-vast.sh script automatically configures PulseAudio:
PM2 Environment
Export for PM2:Audio Stability Improvements
Buffer Configuration (Commit b9d2e41)
Three key changes to prevent audio dropouts: 1. Buffer both audio and video adequately:Timing Synchronization
Problem: Audio and video can drift over time, causing desync. Solution: Three-layer sync strategy: 1. Wall clock timestamps:Testing
Test Audio Capture
Record 5 seconds:Test Full Pipeline
1. Start PulseAudio:Monitor Live Stream
Check FFmpeg audio stats:Common Issues
No Audio in Stream
Checklist:- ✅ PulseAudio running:
pulseaudio --check - ✅ chrome_audio sink exists:
pactl list short sinks | grep chrome_audio - ✅ PULSE_SERVER set:
echo $PULSE_SERVER - ✅ FFmpeg using pulse input:
pm2 logs | grep pulse - ✅ Chrome outputting audio:
pactl list sink-inputs
Audio Crackling
Causes:- Buffer underruns
- CPU overload
- Sample rate mismatch
Audio Ahead of Video
Cause: Audio processing faster than video encoding Fix:Permission Denied
Error:Related Documentation
- GPU Rendering - GPU configuration
- Deployment - Full deployment guide
- Configuration - Environment variables