Реалізація адаптації якості контенту до швидкості 5G у мобільних застосунках
5G надає пропускну спроможність, яка раніше була недоступна в мобільних мережах. Однак просто «увімкнути максимальну якість на 5G» — неправильний підхід. Швидкість 5G непостійна: 5G NSA (Non-Standalone) часто працює як LTE з мінімальними переваги на практиці, а сигнал mmWave затухає за кутом будівлі. Адаптація повинна реагувати на реальні виміряні параметри мережі, а не на тип мережі.
Вимірювання реальної пропускної спроможності
NetworkCapabilities.getLinkDownstreamBandwidthKbps() на Android повертає оцінену швидкість від радіомодуля — не фактичну поточну пропускну спроможність. Це забезпечує усереднені по технологіям значення (LTE: ~20 Мбіт/с, 5G Sub-6: ~100–400 Мбіт/с), не вимірювання поточного каналу.
Для реальної пропускної спроможності використовуйте активне зондування або пасивне спостереження фактичних HTTP-відповідей. Найточніший підхід: вимірювати пропускну спроможність реальних передач за допомогою експоненціального ковзного середнього:
// Оновлюємо оцінку пропускної спроможності з кожним завантаженням
function updateThroughputEstimate(bytesLoaded: number, durationMs: number) {
const measuredKbps = (bytesLoaded * 8) / durationMs; // kbps за ms = Мбіт/с
// EMA з alpha=0.3 — згладжує, але чутлива до нових даних
throughputEstimate = 0.7 * throughputEstimate + 0.3 * measuredKbps;
}
EMA (Exponentially Moving Average) згладжує викиди. alpha=0.3 добре працює для помірно змінних мереж. Для нестабільних мереж (mmWave) використовуйте alpha=0.5.
Рівні якості контенту
Стандартна сітка якості відео:
| Рівень | Бітрейт | Роздільність | Мінімальна пропускна спроможність |
|---|---|---|---|
| Low | 400 кбіт/с | 360p | 600 кбіт/с |
| Medium | 1,5 Мбіт/с | 720p | 2 Мбіт/с |
| High | 4 Мбіт/с | 1080p | 5 Мбіт/с |
| Ultra | 15 Мбіт/с | 4K | 20 Мбіт/с |
Для зображень: WebP з різними таблицями якості (якість JPEG 40/60/80/95 або еквіваленти WebP), або різні розміри (400px, 800px, 1600px, 3200px).
Гістерезис: запобігти частому перемиканню
Без гістерезису застосунок буде «миготіти» між рівнями якості біля порогових значень. Правило: потрібно стійке перевищення порогу на 20–30% для підвищення якості; достатньо падіння на 10% нижче мінімуму для зниження.
const UPGRADE_BUFFER = 1.3; // +30% запас для підвищення
const DOWNGRADE_THRESHOLD = 0.9; // -10% для зниження
function selectQualityLevel(currentKbps: number, currentLevel: QualityLevel): QualityLevel {
const levels = [LOW, MEDIUM, HIGH, ULTRA];
const idx = levels.indexOf(currentLevel);
// Спробуємо підвищити
if (idx < levels.length - 1) {
const next = levels[idx + 1];
if (currentKbps >= next.minKbps * UPGRADE_BUFFER) return next;
}
// Спробуємо знизити
if (idx > 0) {
if (currentKbps < currentLevel.minKbps * DOWNGRADE_THRESHOLD) return levels[idx - 1];
}
return currentLevel;
}
Крім того: не перемикайтеся частіше ніж раз на 5–10 секунд. Застосуйте debounce до змін рівня якості.
iOS: Network Path Monitor
На iOS використовуйте NWPathMonitor з Network.framework:
import Network
let monitor = NWPathMonitor()
monitor.pathUpdateHandler = { path in
if path.usesInterfaceType(.cellular) {
// Перевірте доступність 5G через path.status та isExpensive
let is5G = path.isConstrained == false // евристика, немає прямого API
DispatchQueue.main.async {
self.updateQualityForPath(path)
}
}
}
monitor.start(queue: DispatchQueue.global(qos: .background))
iOS не надає прямого API для визначення «це 5G з цими параметрами». CTTelephonyNetworkInfo.currentRadioAccessTechnology повертає тип технології: CTRadioAccessTechnologyNRNSA (5G NSA) або CTRadioAccessTechnologyNR (5G SA). Але тип ≠ швидкість. Комбінуйте з активним вимірюванням пропускної спроможності.
Передзавантаження при переході на високу швидкість
Коли виявлено 5G з високою пропускною спроможністю, ініціюйте передзавантаження наступного контенту до того, як користувач його запросить. У відео-застосунках: передзавантажте наступне відео у черзі до 50–60% під час простою. У стрічках зображень: завантажте ультра-версії видимих елементів і наступні 3–5 позицій за межами viewport.
react-native-fast-image підтримує передзавантаження через FastImage.preload([...]). На нативному iOS: URLSession з конфігурацією background дозволяє завданням тривати у фоні.
Оцінка часу
Адаптивна якість контенту з вимірюванням пропускної спроможності, гістерезисом і логікою передзавантаження: 3–5 тижнів для однієї платформи. Крос-платформена реалізація (React Native з нативними модулями): 4–7 тижнів.







