Field 02 of 07

Audio streaming

Continuous background listening that never cuts out.

Proven on :Sydica

Since July 2024

  • gapless
  • Media Session API
  • Web Audio AnalyserNode
  • préchargement de la piste suivante
  • cache Isar embarqué
  • stale-while-revalidate
  • feed Redis ZSET

Code Mes Rêves

Alexis Kouakou

0:004:17

Start playback: the waveform is built from the real signal.

Queue

3 tracks
  • 4:17
  • 3:22
  • 5:27

Drag to reorder

Media Session controls — lock screen

Code Mes Rêves

Alexis Kouakou

The audio service runs in the background: system controls and Bluetooth headsets drive playback.

Live telemetry

MP3
Startup latency
Next track preloaded0 %

Triggered from the current track — one track ahead only.

Buffer available
0,0 s
Dropouts since start
0
Codec / sample rate
MP3 · 48,0 kHz
Average bitrate
192 kb/s

Media Session

Inactive

Lock-screen controls

Play · pause · next · previous

The tracks in this demo are my own: nothing to credit, and the Sydica catalogue stays with its rights holders.

0
Coupures depuis le début
3
Débits transcodés

AAC

The mechanism

How it works.

Téléversement

piste source

API Laravel

transcodage AAC · 3 débits

CDN

segments audio

Cache Isar embarqué

écoute hors ligne

Feed Redis ZSET

stale-while-revalidate

Client

file d'attente · préchargement N+1 · AnalyserNode

Côté serveur — le catalogue.

Le feed est servi depuis Redis, en ZSET pour le classement et en hash pour les métadonnées, avec une stratégie stale-while-revalidate : on rend immédiatement la version en cache, puis on la rafraîchit en arrière-plan. L'utilisateur ne reste jamais devant un écran vide, et la base n'est pas sollicitée à chaque ouverture.

Côté client — l'enchaînement sans blanc.

La piste suivante est mise en tampon avant la fin de la courante, ce qui supprime le silence à la transition. Le catalogue consulté est mis en cache localement dans une base Isar embarquée : l'application reste navigable hors ligne, et les pistes déjà écoutées restent jouables. Le service audio tourne en arrière-plan, ce qui permet aux contrôles système et aux casques Bluetooth de piloter la lecture.

The trade-offs

What I ruled out, and why.

A technical choice without its cost is not a choice, it is a preference.

01

Streamer ou télécharger ?

The problem

Le streaming pur consomme à chaque écoute et coupe dès que le réseau flanche ; le téléchargement complet occupe le stockage et pose la question des droits.

The options

Streaming pur · téléchargement complet · streaming avec cache local.

What I chose

Streaming avec cache local des pistes déjà écoutées, plafonné et purgé en LRU.

The cost

La première écoute d'un titre reste tributaire du réseau.

02

Combien de pistes précharger ?

The problem

Précharger la piste suivante supprime le silence à la transition, mais sur une file de vingt titres dont l'auditeur n'en écoutera que trois, dix-sept préchargements sont perdus.

The options

Aucun préchargement · une piste d'avance · toute la file.

What I chose

Une seule piste d'avance, déclenchée à 70 % de la piste courante.

The cost

Un saut manuel rapide dans la file ne bénéficie pas du tampon.

03

Forme d'onde : navigateur ou serveur ?

The problem

L'AnalyserNode est gratuit mais ne connaît que la portion déjà lue ; une forme d'onde pré-calculée montre tout le morceau mais demande un traitement à l'ingestion et un fichier de plus à servir.

The options

AnalyserNode côté navigateur · forme d'onde pré-calculée côté serveur.

What I chose

AnalyserNode, dessiné au fil de la lecture.

The cost

La forme d'onde n'est pas visible d'emblée sur toute la durée du morceau.

Proof in the code

Two real extracts.

lib/audio_helpers/audio_handler.dart

Extract to be supplied

lib/audio_helpers/player_invoke.dart

Extract to be supplied

Code Mes Rêves

Alexis Kouakou