Разработка платформы стриминга музыки
Мы разрабатываем музыкальные стриминговые платформы, которые выдерживают нагрузку тысяч одновременных прослушиваний, обеспечивают low-latency воспроизведение и корректный учёт роялти. В нашем стеке — React, Next.js, PHP/Laravel, PostgreSQL, Elasticsearch и Cloudflare CDN. За 5+ лет мы реализовали более 10 проектов для независимых лейблов и крупных медиа. Задача не в том, чтобы отдать mp3 через HTTP — нужно транскодировать аудио в несколько битрейтов, защитить контент от скачивания, реализовать поиск по каталогу и персонализированные рекомендации. Мы сопровождаем проекты на всех этапах: от выбора архитектуры до нагрузочного тестирования и деплоя. Ниже — архитектура, протоколы и ключевые решения из нашего опыта.
Как обеспечить low-latency воспроизведение?
Выбор протокола доставки — первый компромисс между задержкой и сложностью.
Progressive download — самый простой вариант. Файл отдаётся через обычный HTTP с поддержкой Range-запросов. Браузер буферизует и воспроизводит. Подходит для небольших библиотек без строгих ограничений на скачивание.
location /audio/ { root /var/media; add_header Accept-Ranges bytes; add_header Cache-Control "no-store"; # для DRM } HLS (HTTP Live Streaming) — стандарт для продакшна. Файл нарезается на сегменты по 5–10 секунд, клиент подгружает по манифесту. Позволяет адаптивный битрейт (ABR): клиент переключается между 128/256/320 kbps в зависимости от канала. Для нарезки используем FFmpeg с фильтром asplit.
MPEG-DASH — альтернатива HLS, лучше поддерживает DRM через EME. Если нужна защита контента уровня лейблов — DASH + Widevine/FairPlay. Подробнее о протоколах можно прочитать в документации HTTP Live Streaming.
| Характеристика | HLS | MPEG-DASH |
|---|---|---|
| Совместимость с браузерами | Нативно в Safari, через плееры в Chrome/Firefox | Нативно в Chrome/Edge, через плееры в Safari |
| Поддержка DRM | FairPlay (Safari) + Widevine (через плеер) | Widevine, PlayReady, FairPlay |
| Сложность реализации | Средняя | Высокая |
| Адаптивный битрейт | Да (ABR) | Да (DASH) |
Для большинства проектов выбираем HLS — он проще в реализации и поддерживается всеми современными плеерами (hls.js, Video.js).
Как защитить контент от нелегального распространения?
Подписанные URL с коротким TTL — минимальная защита. Генерируем URL на 60 секунд с привязкой к IP пользователя:
public function stream(Request $request, int $trackId): JsonResponse { $track = Track::findOrFail($trackId); if (!$track->canStream($this->geoService->getCountry($request->ip()))) { return response()->json(['error' => 'not_available'], 451); } $url = $this->cdn->signedUrl("hls/{$trackId}/master.m3u8", 60, $request->ip()); StreamEvent::dispatch($trackId, $request->user()->id, now()); return response()->json(['url' => $url]); } Для лейблов, требующих аппаратной защиты, добавляем DRM через EME. В этом случае CDN (Cloudflare Stream, AWS MediaPackage) сами обрабатывают шифрование и выдачу лицензий.
Архитектура обработки контента
Загрузка трека — не просто сохранение файла, а конвейер: Upload → Validation → Transcoding → Waveform → Fingerprint → CDN → DB.
from celery import chain @app.task def process_upload(track_id, raw_path): chain( validate_audio.s(track_id, raw_path), transcode_variants.s(), generate_waveform.s(), fingerprint_audio.s(), push_to_cdn.s(), update_track_status.s('ready') ).delay() Транскодинг выполняем в три потока: 128k AAC (стриминг), 320k MP3 (скачивание), FLAC (hi-fi). Для каждого битрейта генерируем HLS-сегменты.
Waveform — обязательный элемент плеера. Используем утилиту audiowaveform от BBC, на фронтенде рендерим через кастомный Canvas.
Система прав — реляционная модель с проверкой территории и типа прав:
CREATE TABLE tracks ( id BIGSERIAL PRIMARY KEY, title TEXT NOT NULL, duration_sec INT, isrc CHAR(12), status TEXT DEFAULT 'processing' ); CREATE TABLE track_rights ( track_id BIGINT REFERENCES tracks(id), territory CHAR(2), -- NULL = worldwide right_type TEXT, -- 'stream', 'download', 'sync' holder_id BIGINT, expires_at TIMESTAMPTZ, PRIMARY KEY (track_id, territory, right_type) ); Поиск и рекомендации
Полнотекстовый поиск по каталогу организуем через Elasticsearch с анализом транслитерации и фонетики. Рекомендательный движок строим на коллаборативной фильтрации (матричная факторизация) — он требует отдельного трека разработки.
Масштабирование и CDN
HLS-сегменты — статические файлы, идеально для CDN. При пиковых нагрузках (новый релиз популярного исполнителя) используем origin shield — промежуточный кеш между CDN и хранилищем, чтобы не положить S3. Манифесты .m3u8 кешируются с коротким TTL (5–30 секунд), сегменты — на 365 дней с меткой immutable, так как имена включают хеш контента.
Роялти-учёт
Каждое прослушивание длительностью ≥30 секунд считается монетизируемым стримом (стандарт IFPI). Собираем heartbeat-события каждые 30 секунд через Kafka, агрегируем monthly.
Офлайн-режим (PWA)
Для мобильных пользователей реализуем кеширование аудиосегментов через Service Worker. Пользователь может скачать треки в свою библиотеку и слушать офлайн. Кеш привязан к аккаунту и очищается при отписке.
Что входит в работу
| Этап | Длительность | Результат |
|---|---|---|
| Аналитика и проектирование | 1–2 недели | Техническое задание, архитектура, выбор стека |
| Реализация базового стриминга | 8–10 недель | Рабочий плеер, загрузка треков, HLS-транскодинг, подписанные URL |
| Система прав и роялти | 4–6 недель | Модель прав, интеграция с CDN, агрегация стримов |
| Запуск и оптимизация | 2–4 недели | Нагрузочное тестирование, кеширование, документация |
Дополнительные модули (рекомендации, PWA, мобильные приложения, DRM) обсуждаются отдельно, в зависимости от требований. Наша команда имеет 5+ лет опыта в разработке аудиоплатформ, реализовала более 10 проектов для стриминга и радио. Свяжитесь с нами для оценки вашего проекта — мы поможем выбрать оптимальную архитектуру и сроки.







