Pre-Stream Runbook
Pre-Stream Runbook
Purpose: Standardized operational procedure for live broadcasts.
Duration: ~30–45 minutes before stream start
Owner: Person managing technical setup
Phase 1: Network & Dante (10 min)
Checklist
- Ethernet cable plugged in (Mac → Dante switch dedicated port)
- No WiFi enabled (System Preferences → Network → disable WiFi)
- Dante Controller open, all devices visible
- MOTU 8PRE-ES: Green light, synced
- Dante AVIO USB nodes (×2): Green, synced
- Any other Dante devices: Green
- Network latency test:
ping -c 5 8.8.8.8 # Should show <10ms average - Dante clock status: MOTU = Primary Clock
Dante Controller → View → Network Status → Primary Clock Source should be: MOTU 8PRE-ES (Dante Connector 1)
Troubleshooting
| Issue | Fix |
|---|---|
| Dante devices showing red (not synced) | Restart MOTU: Power off 10 sec, power on, wait 30 sec |
| Network latency >30ms | Check for background uploads, switch network if available |
| WiFi still enabled | Disable in System Preferences → Network (WiFi → Turn Off) |
Phase 2: Audio System (10 min)
Checklist
- MOTU 8PRE-ES powered on (front panel lights on)
- MOTU display shows Dante inputs active (green lights for channels 1–4)
- System audio output set to MOTU:
# macOS System Settings → Sound → Output Device # Select: MOTU 8PRE-ES (not Built-in Speaker) - Test Dante audio from camera 1:
Dante Controller → Routing → Camera 1 audio → MOTU In 1 MOTU front panel → Ch 1 Input: XLR (or USB) MOTU console → Meter 1 should show green (signal detected) - Ableton Live opened, project loaded:
- File:
configs/ableton/streaming-template.als - Audio Preferences: Device = MOTU 8PRE-ES
- Sample Rate = 48 kHz
- I/O Buffer = 256 samples
- File:
- Test Ableton output:
Ableton → Create audio track → Set input to MOTU In 1 Ableton → Play a click track (top menu: Metronome) Listen in studio monitors (should hear click from Ableton) - Studio monitor levels: Dial at -6 dB (not maxed out)
Troubleshooting
| Issue | Fix |
|---|---|
| No audio from camera | Check Dante routing (did you assign camera audio to MOTU input?) |
| Ableton plays but OBS doesn’t hear it | Set OBS audio input to MOTU channels 1–2 (next phase) |
| Feedback/noise in speakers | Mute monitor output in Ableton, use headphones instead |
Phase 3: Video Capture (10 min)
Checklist
- DeckLink Quad HDMI powered on (Echo Express SE I lights on)
- Cameras powered on, HDMI cables connected to DeckLink
- Camera 1 → HDMI port 1
- Camera 2 → HDMI port 2
- Camera 3 → HDMI port 3
- Camera 4 → HDMI port 4
- OBS Studio opened, main scene loaded
- File:
configs/obs/studio-scene.json(or re-create scene)
- File:
- OBS sources visible in preview:
- Video: DeckLink Quad HDMI (4K mosaic visible)
- Audio: MOTU 8PRE-ES channels 1–2
- Both should show in preview pane
- OBS resolution confirmed (Settings → Video Output):
- Base Canvas: 4096×2160 (4K) or 3840×2160 (UHD)
- FPS: 30 or 60 (your choice)
- Render at: GPU (not CPU)
- GPU encoding enabled:
OBS → Settings → Output → Streaming → Encoder: H.264 (Apple Hardware) → Bitrate: 12,000 kbps (12 Mbps)
Troubleshooting
| Issue | Fix |
|---|---|
| DeckLink not detected in OBS | Restart OBS, check Echo Express firmware in System Report |
| Video at 1080p (not 4K) | HDMI handshake issue—unplug camera 1, wait 10 sec, plug back in |
| GPU encoder not available | Restart OBS, verify M1 Mac (not emulated on Intel) |
Phase 4: Streaming Configuration (5 min)
Checklist
- Streaming service credentials ready:
- YouTube: RTMP key copied (YouTube Studio → Go Live → Stream Settings)
- OR Twitch: RTMP key copied (Dashboard → Settings → Stream Key)
- OBS streaming settings configured:
OBS → Settings → Stream → Service: YouTube / Twitch (select one) → RTMP Server: [auto-filled based on service] → Stream Key: [paste your key] - Test stream (without going live):
OBS → File → Settings → Output → Recording Path: /tmp/test-recording.mp4 → Hit "Start Recording" → Record for 10 seconds → "Stop Recording" → Verify file created: ls -lh /tmp/test-recording.mp4 - Network connection stable:
# In terminal, monitor upload speed while true; do date ifstat -i en0 1 1 | tail -1 sleep 5 done # Look for stable ≥25 Mbps upload
Troubleshooting
| Issue | Fix |
|---|---|
| “Invalid stream key” error | Regenerate key in YouTube/Twitch dashboard, paste fresh copy |
| OBS can’t connect to RTMP | Check internet connection, try ping google.com |
| Upload speed <25 Mbps | Switch to wired Ethernet (not WiFi), reduce bitrate in OBS to 8 Mbps |
Phase 5: Caller Setup (5 min, if applicable)
Checklist
- Callers notified (email with setup instructions at least 1 hour before)
- Template:
examples/caller-onboarding-example.md
- Template:
- First caller’s OBS NDI stream confirmed active:
# On caller's machine, OBS running # In your OBS, check: OBS → Sources → [NDI Source] → right-click → Refresh # Should see caller's stream in list, click to connect - Caller video visible in OBS preview:
- Scene: “Caller 1” (or whichever scene has caller PiP)
- Caller video should appear in preview
- Audio return path tested (caller hears you):
- Dante: Caller machine has Dante interface, hearing your Ableton output
- OR Zoom: Caller joins Zoom call (separate from OBS/NDI video)
- Test: Say “testing 1-2-3” → Caller confirms heard
Troubleshooting
| Issue | Fix |
|---|---|
| Caller’s NDI not appearing in OBS | Ensure caller’s OBS is streaming NDI (not to Twitch/YouTube) |
| Caller audio lag >1 sec | Use Dante (preferred), not Zoom audio + NDI video combo |
| Caller can’t hear you | Verify Dante return path or Zoom audio channel |
Phase 6: Final Verification (5 min)
Checklist
- All systems green (run health check script):
bash software/scripts/health-check.sh # Should output: ✓ Dante synced, ✓ DeckLink detected, ✓ OBS audio input recognized - CPU/GPU load reasonable:
# Open Activity Monitor # CPU tab: <60% sustained load (should be green) # Restart Activity Monitor if needed: top -l 1 | grep "PhysMem" - Record 10-second test clip (local storage, not streaming):
OBS → File → Start Recording Wait 10 seconds OBS → File → Stop Recording Verify file in ~/Videos/OBS/ (check file size >5 MB) - Disk space confirmed:
df -h / | awk 'NR==2 {print $4}' # Should show >50 GB available - Broadcast time: Set a timer for stream start
- Notify team: “Ready to go live in 5 minutes”
Troubleshooting
| Issue | Fix |
|---|---|
| Health check shows ✗ on any item | See TROUBLESHOOTING.md for detailed remediation |
| CPU load >70% before stream | Close background apps (browser, email, etc.) |
| Disk space <20 GB | Delete old recordings, restart OBS cache |
Phase 7: Go Live (2 min)
Sequence
- T-2 min: All systems verified green
- T-1 min: Notify callers “Streaming in 60 seconds”
- T-0 sec: Click “Start Streaming” in OBS
- T+10 sec: Refresh YouTube/Twitch to confirm broadcast appears
- T+30 sec: Announce on social media (if applicable)
Monitoring During Stream
Every 10 minutes:
- OBS stats: Dropped frames should be 0
- Activity Monitor: CPU/GPU stable (not spiking)
- MOTU console: Audio levels in range (not clipping)
- Dante Controller: All devices green (clock not drifting)
If problem detected:
- See TROUBLESHOOTING.md for real-time fixes
- Worst case: Stop streaming, restart from Phase 1
Phase 8: Shutdown (5 min)
Graceful Shutdown Sequence
DO NOT power off abruptly. Follow this order:
- OBS: Click “Stop Streaming”
- Wait 10 seconds (allow platform to finalize)
- Ableton: File → Save, then quit
- OBS: File → Exit
- MOTU: Power off (let it shut down cleanly)
- DeckLink: Power off (Echo Express)
- Dante switch: Power off
- Cameras: Power off
- Mac: Shut down normally (Apple menu → Shut Down)
Post-Broadcast
- Download broadcast archive from YouTube/Twitch (for backup)
- Save OBS logs (Help → View Log File)
- Save Dante network stats (Dante Controller → Export)
- Fill out incident report (if any issues occurred):
templates/incident-report.md - Commit logs to GitHub:
cd live-streaming-pipeline git add tests/logs/broadcast-N.log git commit -m "broadcast: date, duration, issues & resolutions"
Appendix: Quick Reference
Emergency Stop
If system crashes or goes wrong:
# Force-quit all applications
killall OBS
killall "Ableton Live"
# Restart Dante network
sudo killall -9 Dante*
# Power-cycle MOTU
# (physically power off for 30 sec)
Revert to Last Known Good Configuration
cd live-streaming-pipeline
git checkout HEAD -- software/configs/
# Restart OBS with previous config
bash software/scripts/launch-studio.sh
Escalation Contacts
- DeckLink issues: Blackmagic support (support@blackmagicdesign.com)
- Dante issues: Audinate support (support@audinate.com)
- MOTU issues: MOTU support (support@motu.com)
Last Updated: 2025-01-22 Author: Your Name Version: 1.0