Мобільний VR-додаток для перегляду 360°-відео
360°-відео — це не звичайне відео в сферичній оболонці. Це equirectangular-проекція, яку потрібно розгорнути на сферу навколо користувача, синхронізувати з рухом голови та уникнути артефактів на сшивці — все при частоті кадрів, достатній для комфортного VR.
Технічна сторона: sphere mapping
Equirectangular-відео (2:1 співвідношення сторін, стандарт YouTube та Facebook 360) відображається на інвертовану сферу — користувач дивиться зсередини. Розрізнювальна здатність для комфортного перегляду: мінімум 4K (3840×2160), бажано 5,7K або 8K. При 4K на кожне око приходиться ~30 пікселів на градус — це межа, нижче якої видна "сітка" пікселів.
У Unity створіть інвертовану сферу з нормалями, спрямованими всередину:
// Стандартна Unity Sphere + спеціальний матеріал
// Або через пакет com.unity.xr.management
// Шейдер для 360-відео
// vert: передайте UV як є
// frag: семплюйте _MainTex з UV, горизонтальний flip для правильної орієнтації
На нативному Android через MediaPlayer + OpenGL ES:
// Створіть Surface для MediaPlayer, рендеримо як texture на сферу
SurfaceTexture surfaceTexture = new SurfaceTexture(textureId);
Surface surface = new Surface(surfaceTexture);
mediaPlayer.setSurface(surface);
mediaPlayer.prepareAsync();
На iOS — AVPlayer + SCNSphere у SceneKit або RealityKit:
let sphere = SCNSphere(radius: 10)
sphere.firstMaterial?.isDoubleSided = true // або інвертовані нормалі
sphere.firstMaterial?.diffuse.contents = avPlayer
let sphereNode = SCNNode(geometry: sphere)
sphereNode.scale = SCNVector3(-1, 1, 1) // flip X для правильного напрямку
sceneView.scene.rootNode.addChildNode(sphereNode)
Стереоскопічне 360: top-bottom та side-by-side формати
Звичайне 360-відео — монокулярне. Стереоскопічне 360 (справжній VR-ефект глибини) кодується двома способами:
- Top-Bottom (TB): верхня половина кадру = лівий видобуток, нижня = правий. Співвідношення сторін 1:1 замість 2:1.
- Side-by-Side (SBS): лівий видобуток — ліва половина, правий — права половина. Співвідношення 4:1.
При рендеринні на сферу передайте тип формату у шейдер та коректно семплюйте UV для кожного ока.
Стрімінг: HLS/DASH для 360
360-відео — це файли 2–8 GB для 10-хвилинного контенту при 4K–8K. Завантаження цілком перед відтворенням неприйнятно. Рішення — адаптивний стрімінг.
Для 360 HLS потрібна особлива нарізка на сегменти з урахуванням spherical projection — ідеально використовувати Spatial Media spec від Google, який вставляє метадані про тип проекції прямо у файл. ffmpeg з флагом --spherical при створенні маніфесту.
Адаптивне переключення бітрейту критично: при поворотах голови вся сфера видима, але основне навантаження — на зоні перед взглядом. Viewport-dependent streaming (або Tile-based streaming) видає високу розрізнювальну здатність лише для поточного напрямку взгляду. Це знижує трафік у 3–5 разів. Реалізується через MPEG-OMAF або користувацький DASH-сервер з інформацією про Viewport.
Просторовий звук
360-відео без позиційного звуку — це половина враження. Ambisonics (формат B-format або AmbiX) — просторовий формат, у якому звук автоматично орієнтується під напрямок взгляду.
На Android — AndroidMediaPlayer + Resonance Audio SDK від Google (вбудований у Google Cardboard SDK). На iOS — AVAudioEngine з AVAudioEnvironmentNode для просторового позиціонування джерел.
Unity: пакет com.google.resonance-audio або вбудований Unity Spatial Audio з підтримкою Ambisonics з Audio Settings.
Кеширування та offline
Користувач хочет дивитися 360-тури без інтернету. Передзавантаження: фоновий DownloadManager (Android) / URLSessionDownloadTask (iOS), зберігання сегментів HLS на пристрої. Для каталогу турів — SQLite з метаданими (preview-frame, тривалість, опис) та шляхами до локальних файлів.
Робочий процес
Визначте контент-стратегію: джерела 360-відео, монокулярне або стереоскопічне, формати.
Розроблюйте плеєр: сферичний рендеринг, UV-маппінг для форматів файлів, синхронізація head tracking.
Стрімінг: інтеграція HLS/DASH, адаптивна якість, offline кеширування.
Інтеграція просторового звуку.
Тестування на цільових пристроях у Cardboard, оцінка latency та motion sickness.
Оцінка часу
Базовий плеєр для монокулярного 360-відео з локальним відтворенням — 1 тиждень. Повнофункціональний плеєр зі стрімінгом, просторовим звуком, стереоскопічним форматом та offline — 3–6 тижнів.







