Remix nPVR enables the creation of a flexible, scalable, performant and reliable catch up or nPVR service while minimizing storage overhead.
Utilising Unified Capture to create a time based segment archive and Unified Remix to prepare playlists based on the archive provides a number of advantages over traditional nPVR solutions:
- no storage duplication, if nPVR "recordings" overlap the content will still only be stored once
- easy changes without any repackaging or re-encoding, it's possible to update the start or end time of a recording based on broadcast as-runs just by updating the playlist
- easy to cut out breaks by creating a playlist which only includes the primary content
The solution makes use of 3 Unified Streaming Platform products:
- Capture, to create an archive of time chunks.
- Remix, to combine these into programmes (pseudo-recordings) for playout
- Origin, for Just-In-Time packaging to all supported streaming formats
Remix nPVR allows for the following use case:
words about each component
Unified Origin - Live¶
This Origin is used for Live playout.
Unified Origin - Live capture target¶
Separate Origin used just for capturing / archiving. This ensures that the archiving process has no impact on regular live playout, and vice versa. This would also have different options, e.g. no DRM, longer archive / DVR window.
Unified Origin - VOD nPVR playout¶
VOD playout Origin for nPVR content. Takes the reference MP4 playlist created by Remix and plays out all streaming formats.
Based on a SMIL input compares the scheduled sources and produces a single output reference MP4 representation of the playlist. Remix uses a set of heuristics to match tracks between separate input sources to enable the production of a seamless output presentation.
Creates a playlist based on a request URL.
The SMIL Origin must return a SMIL 2.0 (Synchronized Multimedia Integration Language) playlist.
SMIL functionality supported by Remix¶
- outputDescription meta element in head to point to target profile
- without setting this, the first clip in the playlist will be used for the target profile
- seq, sequence of clips to playout
- par, combine multiple files into a single clip as part of the sequence, e.g. if different bitrates are stored in separate source files
- clipBegin, clipEnd, to select only parts of the clip rather than whole
- currently only supports using the "wallclock(ISO 8601)" format, not all formats included in SMIL 2.0
An SMIL playlist for a simple use case which will play a pre-roll bumper and 30 seconds of Tears of Steel is:
<?xml version="1.0" encoding="utf-8"?> <smil xmlns="http://www.w3.org/2001/SMIL20/Language"> <head/> <body> <seq> <video src="http://sample-content/logo_5s_dref.mp4"/> <video src="http://sample-content/tears-of-steel-dref.mp4" clipEnd="wallclock(1970-01-01T00:00:30.000Z)"/> </seq> </body> </smil>
Pre-roll and mid-roll advertisements with Sintel main content. Targetting Sintel for the output profile.
<?xml version='1.0' encoding='UTF-8'?> <smil xmlns="http://www.w3.org/2001/SMIL20/Language"> <head> <meta name="outputDescription" content="http://storage/main/sintel/sintel_dref.mp4"/> </head> <body> <seq> <video src="http://storage/ads/origin/origin08_x264.mp4"/> <video src="http://storage/main/sintel/sintel_dref.mp4" clipEnd="wallclock(1970-01-01T00:00:30.000Z)"/> <video src="http://storage/ads/capture/capture10_x264.mp4"/> <video src="http://storage/main/sintel/sintel_dref.mp4" clipBegin="wallclock(1970-01-01T00:00:30.000Z)" clipEnd="wallclock(1970-01-01T00:01:00.000Z)"/> </seq> </body> </smil>
Based on different bitrates in separate MP4s as part of a VAST response from an ad network (Freewheel in this case), use <par> to combine into a single item.
<?xml version="1.0" encoding="utf-8"?> <smil xmlns="http://www.w3.org/2001/SMIL20/Language"> <head> </head> <body> <seq> <par> <video src="http://freewheel-mtgx-tv.akamaized.net/path/to/files/file_1280.mp4" /> <video src="http://freewheel-mtgx-tv.akamaized.net/path/to/files/file_1024.mp4" /> <video src="http://freewheel-mtgx-tv.akamaized.net/path/to/files/file_768.mp4" /> <video src="http://freewheel-mtgx-tv.akamaized.net/path/to/files/file_480.mp4" /> </par> <video src="http://local-storage.unified-streaming.com/demo/tears-of-steel/tears-of-steel-teaser-no-jpg.ism" /> </seq> </body> </smil>
- Archiver utilising Capture
TODO: expand the above.
Remix nPVR is flexible when it comes to deployment options, as both Unified Origin and Remix are stateless and work over HTTP. This means it can easily be deployed on both physical or virtual hosts, or using container technology such as Docker.
Our GitHub Remix Demo has each component running in a separate Docker container, and uses Docker Compose to deploy and configure them to produce a working environment.
Supported OS and software versions¶
Remix requires Apache 2.4.x
Recommended OS and web server versions are:
|Alpine Linux v3.4||Apache/2.4.27|
Remix nPVR can be deployed using various approaches:
- Bare metal
- Virtual machines as for instance Amazon EC2
- Container environments managaed by for instance Kubernetes
TODO: expand the above.
Capture runs against the live publishing point, there are two options:
- use an URL (http://...) and capture from another instance
- use an URI (file:///...) and capture on the origin itself
In both cases the following is recommended:
- 10 Gb/s
- RAID10 (or similar)
TODO: expand the above.
The size of the equired storage is the following: archive length * bitrates.
Note however that it is possibe to make to make the archive sparse by deleting unreferenced archive segments.
- Content must be accesible to both Remix and Unified Origins on the same URL
- Content encoding profiles should match (which it will as Capture extracts the content from the publishing point, which does not change).
- Redundant setup for the ingest to prevent gaps caused by:
- encoder failures
- upstream distribution failures, e.g. satellite outage, playout issue