9.7 KiB
Quick Sync - Adaptive Streaming
Overview
Quick Sync is an adaptive streaming system that automatically adjusts audio quality based on network speed and system resources for optimal playback experience.
Features
Adaptive Quality Selection
- Auto Mode: Automatically selects optimal quality based on network and system
- Manual Modes: Low (64kbps), Medium (128kbps), High (256kbps), Ultra (320kbps)
- Real-time Monitoring: Continuous network speed and system resource monitoring
- Smart Buffer Management: Dynamic buffer sizing based on connection quality
Network Speed Detection
- Measures download speed using CDN test file
- Caches results for 5 minutes to reduce overhead
- Speed thresholds:
- Ultra: 5+ Mbps
- High: 2-5 Mbps
- Medium: 1-2 Mbps
- Low: 0.5-1 Mbps
System Resource Monitoring
- CPU usage monitoring
- Memory usage tracking
- Automatic quality adjustment under high system load
- Prevents playback issues during heavy resource usage
Smart Preferences
- Prefer Quality: Upgrades quality when system resources allow
- Adapt to System: Downgrades quality under heavy CPU/memory load
- Apply to Downloads: Uses Quick Sync settings for downloaded audio
Architecture
Backend Components
QuickSyncService (audio/quick_sync_service.py)
Core service for adaptive streaming logic.
Key Methods:
get_system_resources() -> Dict
Returns CPU, memory, disk usage
measure_network_speed(test_url: str, timeout: int) -> float
Measures download speed in Mbps
get_recommended_quality(user_preferences: Dict) -> Tuple[str, Dict]
Returns quality level and settings based on network/system
get_buffer_settings(quality: str, network_speed: float) -> Dict
Returns optimal buffer configuration
get_quick_sync_status(user_preferences: Dict) -> Dict
Complete status with network, system, quality info
Quality Presets:
QUALITY_PRESETS = {
'low': {'bitrate': 64, 'buffer_size': 5, 'preload': 'metadata'},
'medium': {'bitrate': 128, 'buffer_size': 10, 'preload': 'auto'},
'high': {'bitrate': 256, 'buffer_size': 15, 'preload': 'auto'},
'ultra': {'bitrate': 320, 'buffer_size': 20, 'preload': 'auto'},
'auto': {'bitrate': 0, 'buffer_size': 0, 'preload': 'auto'},
}
API Views (audio/views_quick_sync.py)
QuickSyncStatusView
- GET
/api/audio/quick-sync/status/ - Returns current status and user preferences
QuickSyncPreferencesView
- GET/POST
/api/audio/quick-sync/preferences/ - Manage user Quick Sync preferences
QuickSyncTestView
- POST
/api/audio/quick-sync/test/ - Run manual network speed test
QuickSyncQualityPresetsView
- GET
/api/audio/quick-sync/presets/ - Get available quality presets and thresholds
Frontend Components
QuickSyncContext (context/QuickSyncContext.tsx)
React context providing Quick Sync state management.
Provided Values:
interface QuickSyncContextType {
status: QuickSyncStatus | null;
preferences: QuickSyncPreferences | null;
loading: boolean;
updatePreferences: (prefs: Partial<QuickSyncPreferences>) => Promise<void>;
runSpeedTest: () => Promise<void>;
refreshStatus: () => Promise<void>;
}
Status Interface:
interface QuickSyncStatus {
network: {
speed_mbps: number;
status: 'excellent' | 'good' | 'fair' | 'poor';
};
system: {
cpu_percent: number;
memory_percent: number;
status: 'low_load' | 'moderate_load' | 'high_load';
};
quality: {
level: 'low' | 'medium' | 'high' | 'ultra' | 'auto';
bitrate: number;
description: string;
auto_selected: boolean;
};
buffer: {
buffer_size: number;
preload: string;
max_buffer_size: number;
rebuffer_threshold: number;
};
}
QuickSyncSettings Component (components/QuickSyncSettings.tsx)
Settings page UI for Quick Sync configuration.
Features:
- Real-time network speed and system resource display
- Quality mode selector (Auto/Ultra/High/Medium/Low)
- Preference toggles (prefer quality, adapt to system, apply to downloads)
- Manual speed test button
- Buffer settings information
- Visual status indicators with color-coded alerts
Usage
Backend Setup
- Install dependencies:
pip install psutil>=5.9.0
- URLs are automatically included in
audio/urls.py
Frontend Setup
- Wrap app with QuickSyncProvider in
main.tsx:
import { QuickSyncProvider } from './context/QuickSyncContext';
<QuickSyncProvider>
<AppWithTheme />
</QuickSyncProvider>
- Import QuickSyncSettings in SettingsPage:
import QuickSyncSettings from '../components/QuickSyncSettings';
<QuickSyncSettings />
Using Quick Sync in Audio Player
import { useQuickSync } from '../context/QuickSyncContext';
const Player = () => {
const { status, preferences } = useQuickSync();
// Use recommended quality
const quality = status?.quality.level || 'medium';
const bitrate = status?.quality.bitrate || 128;
// Use buffer settings
const bufferSize = status?.buffer.buffer_size || 10;
const preload = status?.buffer.preload || 'auto';
return (
<audio
preload={preload}
// Apply quality settings to audio source
/>
);
};
Quality Decision Logic
Auto Mode Flow
-
Measure Network Speed
- Download 1MB test file from CDN
- Calculate speed in Mbps
- Cache result for 5 minutes
-
Check System Resources
- Get CPU and memory usage
- Determine system load status
-
Select Base Quality
- Based on network speed thresholds
- Ultra (5+ Mbps) → High (2-5 Mbps) → Medium (1-2 Mbps) → Low (0.5-1 Mbps)
-
Adjust for System Load
- If CPU > 80% or Memory > 85%: Downgrade by 1 level
- If CPU < 30% and Memory < 50% and prefer_quality: Upgrade by 1 level
-
Apply Buffer Settings
- Larger buffer for slower connections
- Smaller buffer for fast connections
- Rebuffer threshold at 30% of buffer size
Configuration
User Preferences
Stored in Django cache with key quick_sync_prefs_{user_id}:
{
'mode': 'auto', # auto, low, medium, high, ultra
'prefer_quality': True, # Prefer higher quality when possible
'adapt_to_system': True, # Adjust based on CPU/memory
'auto_download_quality': False, # Apply to downloads
}
Cache Keys
quick_sync_network_speed: Network speed (5 min TTL)quick_sync_system_resources: System resources (5 min TTL)quick_sync_prefs_{user_id}: User preferences (no TTL)
Performance Considerations
Network Speed Testing
- Uses 1MB download to minimize overhead
- Cached for 5 minutes
- Falls back to 2.0 Mbps on error
- Uses Cloudflare speed test endpoint
System Resource Monitoring
- Uses psutil for accurate metrics
- 1-second CPU measurement interval
- Cached for 5 minutes
- Minimal performance impact
API Rate Limiting
- Status endpoint called every 5 minutes
- Manual speed test requires user action
- Preferences cached indefinitely
Troubleshooting
Network Speed Detection Issues
Problem: Speed test fails or returns unrealistic values
Solutions:
- Check CDN availability (speed.cloudflare.com)
- Verify network connectivity
- Increase timeout value (default 5s)
- Use custom test_url parameter
System Resource Monitoring Issues
Problem: CPU/memory values incorrect
Solutions:
- Ensure psutil is installed
- Check system permissions
- Verify /proc filesystem access (Linux)
Quality Not Adapting
Problem: Quality doesn't change despite network/system changes
Solutions:
- Clear cache:
cache.delete('quick_sync_network_speed') - Verify preferences: mode should be 'auto'
- Check adapt_to_system is enabled
- Run manual speed test
API Reference
GET /api/audio/quick-sync/status/
Returns Quick Sync status and preferences.
Response:
{
"status": {
"network": {
"speed_mbps": 3.5,
"status": "good"
},
"system": {
"cpu_percent": 25.0,
"memory_percent": 60.0,
"status": "low_load"
},
"quality": {
"level": "high",
"bitrate": 256,
"description": "High quality - best experience",
"auto_selected": true
},
"buffer": {
"buffer_size": 15,
"preload": "auto",
"max_buffer_size": 30,
"rebuffer_threshold": 4.5
}
},
"preferences": {
"mode": "auto",
"prefer_quality": true,
"adapt_to_system": true,
"auto_download_quality": false
}
}
POST /api/audio/quick-sync/preferences/
Update user preferences.
Request Body:
{
"mode": "auto",
"prefer_quality": true,
"adapt_to_system": true,
"auto_download_quality": false
}
POST /api/audio/quick-sync/test/
Run network speed test.
Response:
{
"network_speed_mbps": 4.2,
"system_resources": {
"cpu_percent": 30.0,
"memory_percent": 55.0
},
"recommended_quality": "high",
"timestamp": 1702656789.123
}
GET /api/audio/quick-sync/presets/
Get quality presets and thresholds.
Response:
{
"presets": {
"low": {"bitrate": 64, "buffer_size": 5, "preload": "metadata"},
"medium": {"bitrate": 128, "buffer_size": 10, "preload": "auto"},
"high": {"bitrate": 256, "buffer_size": 15, "preload": "auto"},
"ultra": {"bitrate": 320, "buffer_size": 20, "preload": "auto"}
},
"thresholds": {
"ultra": 5.0,
"high": 2.0,
"medium": 1.0,
"low": 0.5
}
}
Future Enhancements
- ABR (Adaptive Bitrate) streaming with HLS/DASH
- Bandwidth prediction using historical data
- Quality switching mid-playback
- Network type detection (WiFi/Cellular/Ethernet)
- Offline quality presets
- Per-device quality preferences
- Analytics and quality metrics
- Multi-CDN support for speed testing