Skip to main content

Audio Processing Pipeline

Путь аудиофайла от загрузки до стриминга.

Общий flow​

Artist uploads MP3/WAV/FLAC
↓
POST /api/v1/tracks
↓
Файл сохраняется во временное хранилище
↓
Задача добавляется в BullMQ очередь "audio-processing"
↓
AudioProcessor worker (BullMQ)
↓
Один FFmpeg-процесс создаёт CMAF (fMP4, AAC-LC): по файлу на 128 / 192 / 320 kbps
с выровненными фрагментами и байтовым индексом
↓
Файлы загружаются в S3-compatible object storage
↓
TrackFile записи создаются в БД
↓
Track.processingStatus → "READY"
↓
GET /api/v1/tracks/:id/manifest + GET /api/v1/tracks/:id/cmaf/:bitrate (Range)

BullMQ очередь​

Очередь audio-processing настроена с retry-механизмом:

{
jobId: `convert-audio-${trackId}-${sourceFileName}`,
attempts: 5,
backoff: { type: 'exponential', delay: 5_000 },
removeOnComplete: { age: 3_600, count: 1_000 },
removeOnFail: { age: 604_800, count: 5_000 },
}
  • 5 попыток с экспоненциальной задержкой (5с → 10с → 20с → ...)
  • Завершённые задачи хранятся 1 час
  • Упавшие задачи хранятся 7 дней для диагностики

Статусы обработки​

Трек может находиться в одном из состояний:

СтатусОписание
PROCESSINGЗадача в очереди или выполняется
READYКонвертация завершена, стриминг доступен
FAILEDВсе попытки исчерпаны

Поля в БД: processingStatus, processingError, processingAttempts, processingStartedAt, processingFinishedAt.

Битрейты​

Генерируются только те битрейты, которые не превышают битрейт исходного файла:

const TARGET_AUDIO_BITRATES = [128, 192, 320] // kbps

Если исходный файл 192 kbps — генерируются только варианты 128 и 192.

Структура файлов​

CMAF — единственный формат хранения (ADR-0065). Каждая загрузка пишется в собственное неизменяемое поколение:

tracks/:trackId/generations/:generation/
└── cmaf/
├── 128.m4a
├── 192.m4a
└── 320.m4a

Стриминг​

# Список качеств и индекс фрагментов
GET /api/v1/tracks/:id/manifest

# Байтовый диапазон файла одного качества
GET /api/v1/tracks/:id/cmaf/:bitrate
Range: bytes=0-1048575

Подробнее о стриминге на клиенте: Audio Streaming

Конвертация​

Использует пакет @bitrate/converter (FFmpeg wrapper). Поддерживаемые входные форматы: MP3, WAV, FLAC, M4A, OGG, OPUS.