Разработка мобильного 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 для правильного direction
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.
Spatial audio
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-видео, монокулярное или стереоскопическое, форматы.
Разработка плеера: sphere rendering, UV-маппинг для формата файлов, head tracking синхронизация.
Стриминг: HLS/DASH интеграция, адаптивное качество, offline кеширование.
Spatial audio интеграция.
Тестирование на целевых устройствах в Cardboard, оценка latency и motion sickness.
Ориентиры по срокам
Базовый плеер для монокулярного 360-видео с локальным воспроизведением — 1 неделя. Полнофункциональный плеер со стримингом, spatial audio, стереоскопическим форматом и offline — 3–6 недель.







