Vai al contenuto

Streaming video

Nexo riproduce i video MP4 di un bucket come stream HLS, impacchettati al volo: niente transcodifica e niente da preparare. Un video caricato con nexoctl cp, dalla console o da qualsiasi client S3 si riproduce subito nella console, e un link di streaming lo condivide con chi non ha un account, in un browser o in qualsiasi player HLS.

Video supportati

Contenitore MP4 e varianti (.mp4, .m4v, .mov), con l'indice (moov) all'inizio o alla fine
Video H.264 (AVC) o H.265 (HEVC)
Audio AAC, facoltativo

I file MP4 frammentati, gli oggetti cifrati con SSE-C e gli altri codec sono rifiutati con 400: condividili come file. Gli oggetti cifrati con SSE-S3 o SSE-KMS vanno in streaming come gli altri.

I segmenti sono tagliati sui keyframe del video, circa ogni 6 secondi: un video codificato con un keyframe ogni 1-2 secondi (il default della maggior parte degli encoder e delle videocamere) si sposta con precisione.

Nella console

L'anteprima di un video MP4 nel browser degli oggetti è uno stream HLS: la riproduzione parte subito e spostarsi nel video non scarica il file. I browser senza supporto HLS ripiegano sul file.

Un link di streaming è un link di condivisione gestito: appartiene a chi lo crea, scade (al massimo 7 giorni) e si revoca come ogni condivisione. Fornisce due URL:

  • la pagina del player del server, per le persone: https://s3.example.com/nexo/media/player/#/nexo/media/v1/…;
  • la playlist HLS, per i player (VLC, Safari, app mobili) e per le pagine che incorporano il video con hls.js: https://s3.example.com/nexo/media/v1/<bucket>/master.m3u8?….

Nella console, Condividi su un video propone Condividi come video (attivo di default per i file MP4). Con la CLI:

$ nexoctl share download --stream --expire 7d local/videos/talk.mp4
URL: local/videos/talk.mp4
Expire: 7d
Share: https://s3.example.com/nexo/media/v1/videos/master.m3u8?key=talk.mp4&X-Amz-Algorithm=…
Player: https://s3.example.com/nexo/media/player/#/nexo/media/v1/videos/master.m3u8?key=talk.mp4&X-Amz-Algorithm=…
ID: 2xk4m7q9fz3a (revoke with: nexoctl share revoke local 2xk4m7q9fz3a)

Revocare la condivisione ferma la riproduzione: playlist e segmenti sono firmati dalla condivisione, fino alla sua scadenza. Un link è legato alla versione del video per cui è stato creato: se l'oggetto viene sovrascritto, un player aperto si ferma (412) e un nuovo link riproduce la nuova versione.

La pagina del player e le playlist sono servite dal listener S3, quindi un link di streaming funziona anche quando su Internet è esposta solo l'API S3. La pagina non contiene dati: la playlist viaggia nel frammento del suo URL (dopo #), che i browser non inviano mai a un server.

API HLS

Gli stream seguono l'autorizzazione di GetObject: chi può leggere un oggetto può riprodurlo.

Percorso (listener S3) Contenuto
/nexo/media/v1/{bucket}/master.m3u8?key=…[&versionId=…] master playlist
/nexo/media/v1/{bucket}/media.m3u8?key=…&rev=… media playlist (VOD)
/nexo/media/v1/{bucket}/init.mp4?key=…&rev=… segmento di inizializzazione fMP4
/nexo/media/v1/{bucket}/segment.m4s?key=…&rev=…&n=… segmento fMP4 n
/nexo/media/player/ pagina pubblica del player

Una richiesta può essere anonima (un bucket leggibile da tutti), firmata negli header o presigned. Gli URI di una master playlist presigned sono a loro volta presigned con le stesse credenziali, fino alla stessa scadenza: qualsiasi master playlist presigned (nexoctl share download --raw del percorso della master, un SDK) si riproduce in un player senza credenziali. rev è l'ETag dell'oggetto: gli URI rispondono 412 quando cambia.

La console serve la stessa presentazione ai suoi utenti sotto /api/v1/buckets/{bucket}/objects/hls/ con la loro sessione (Admin API).

Gli stream video contano nei limiti di richieste dell'API S3, a differenza degli altri percorsi /nexo/ (probe di salute, metriche).