ZLS: A Reliable Live Streaming Protocol
ZLS is still experimental and subject to change!
ZLS: Overview
ZLS is an HTTP-based live streaming protocol (producer-side) that does its best to work well in difficult environments, typically outdoors over a a cellular network, e.g., unreliable 4G/LTE and 5G.
ZLS allows pushing multiple streams, each stream consisting of multiple segments of different kinds: video, audio, subtitles, and user-defined data. The latter is useful to pass arbitrary info used for custom overlays, for example. Each stream has a defined priority, so when the network is instable and unreliable, only highest-priority streams continue to be pushed, typically the audio stream.
Goals
Priority of stream when the connection is degraded. A stream may be temporarily dropped to avoid congestion and allow other more important stream to pass. For example, audio segments may pass while video segments are dropped for a few seconds until the connection is strong enough again, so the audience can at least hear.
HTTP-based: because it makes implementing servers and clients easy.
Segments-based: because it makes interoparibility with the end delivery phrase easier, typically using HLS or DASH. Segments can be re-used as is.
Where ZLS worked so far
ZLS has been tested on the following configurations:
- Indoors: home fiber
- Outdoors: Streets of Paris and suburbs (4G/5G)
- Underground: Tunnels of the Paris Métro where network is degraded between two stations
- Underground: Tunnels of the RER (regional commuter train) where network is even more degraded between two stations
Why not use...
...RTMP?
- RTMP works well in a reliable network setup, typically between a broadband connection and a Twitch POP.
- It's a difficult protocol to implement and to work with.
- Not really open.
...SRT?
- The normal version of SRT is UDP-based. It may be beneficial because of the low latency and to have control on the head-of-line blocking problem. However, we may suspect mobile carriers to treat UDP flows weirdly and unreliably.
- SRT supports a "too late" packet dropping mechanism, which is useful. But it cannot drop only certain kind of packets selectively natively. In ZLS, each stream has a priority level which defines how "too late" segments are dropped.