Прототип децентрализованного (в плане вычислений) стриминга, переносящий нагрузку по декодированию тяжелых форматов (FLAC 24-bit/192kHz) с сервера на клиент через WebAssembly.
Роль: Хранилище контента и контроллер доступа.
- Слой хранения: Организация медиатеки в виде блочного хранилища (файловая система/S3).
- Стриминг-модуль: Поддержка
HTTP Range Requests(стандарт RFC 7233) для частичной загрузки аудио-файлов. - Слой безопасности: Валидация прав доступа (JWT/Session) перед стримингом сырого бинарного потока.
- API Метаданных: Отдача JSON с характеристиками трека (Sample Rate, Bit Depth, FLAC-заголовки).
Роль: Оркестрация потока данных и интерфейс.
- Transport Layer: Реализация буферизированной загрузки чанков данных через
Fetch API+ReadableStream. - Wasm Bridge: Загрузка, инициализация и управление памятью Rust-модуля.
- Audio Pipeline: Управление контекстом
Web Audio API. ИспользованиеAudioWorkletдля безразрывного (gapless) воспроизведения в отдельном низкоприоритетном потоке.
Роль: Низкоуровневая бинарная обработка.
- Demuxer: Выделение метаданных и разметка границ фреймов из входящего байтового потока.
- LPC Engine: Математическое восстановление сигнала на основе коэффициентов линейного предсказания (Linear Predictive Coding).
- Bit-depth Transformer: Преобразование 24-битных целочисленных сэмплов в 32-битные с плавающей точкой (f32) для корректного восприятия браузером.
- Клиент запрашивает метаданные трека.
- Сервер возвращает параметры (частота, битность) и токен доступа.
- Клиент настраивает
AudioContextна целевую частоту (например, 192кГц).
- Клиент запрашивает первый фрагмент файла (0-N байт).
- Сервер проверяет права и стримит бинарный поток.
- Байты передаются в общую память (SharedArrayBuffer) между JS и Wasm.
- Поиск синхрокода: Rust-модуль ищет маркер начала фрейма FLAC
11111111 111110. - Парсинг заголовка фрейма: Извлечение информации о размере блока.
- Восстановление (LPC): * Расчет остатка (residual).
- Применение формулы предсказания: .
- Вывод: Формирование PCM-буфера.
- Декодированные PCM-данные передаются в
AudioWorkletProcessor. - Планирование воспроизведения (Scheduling) с микросекундной точностью для исключения щелчков.
- Вывод на системное аудио-устройство.
- Контейнеризация: Docker-образ с мультистадийной сборкой (сборка Go-бинарника и Next.js статики).
- Оркестрация: Docker Compose (App + Nginx/Traefik для терминирования TLS).
- Ограничение: Браузеры могут ограничивать Sample Rate.
- Решение: Анализ
AudioContext.sampleRateи программный ресемплинг в Rust, если устройство вывода не поддерживает 192кГц. - Ограничение: Большой вес Hi-Res файлов.
- Решение: Опережающее кширование (Look-ahead buffering) следующего чанка данных во время декодирования текущего.