The Unified Streaming Platform now supports Remix VOD2Live, a new way of creating a linear live channel from VOD assets without the need for a live encoder. To showcase this we wanted to do something special, so we created a live channel with the best of our tutorials and masterclasses, including SSAI using our very own ads. Your favorite Unified experts on repeat 24 hours a day, with free commercials to boot!
In this blog we’ll take you through the basics of Remix VOD2Live, explain how we built the demo, how each of the components work and introduce you to the tools you’ll need to build your own VOD2Live channel.
Why VOD2Live?
Since Netflix launched ‘Direct’ as a trial in France in 2020*, VOD2Live has been ever more in the OTT zeitgeist. ‘Direct’ plays out a prepopulated schedule, making Netflix essentially a linear television experience. This step back from the traditional streaming model – viewer choice – to a traditional broadcast model – preselected playout – may seem antiquarian; actually it solves two very contemporary concerns.
First, the ‘paradox of choice’ currently plaguing your viewer. Not only do viewers have a multitude of streaming providers to choose between, but once on your platform they are confronted with a choice of hundreds if not thousands of programs. And secondly the inverse, you most likely have thousands of under-utilized hours of content sitting on your servers. With VOD2Live your viewer can request ‘I just want to watch some horror movies’ and you can offer them to tune in to a continuous stream of classics from your library.
Scheduled programming, when uncoupled from the costly and inflexible delivery of a traditional broadcast workflow, presents many interesting use cases unique to the OTT space:
One-off event channel (e.g., town hall meeting, pre-recorded product launch or concert)
Niche channel (e.g., rotating playlists of documentaries, gardening or home improvement TV)
Premium codec channel (Easily live stream Dolby VOD, or AV1 encoded content)
Brand or product channel (e.g., a BMW channel with BMW sponsored movies and ads)
Trailer or barker channel (e.g., previews of newly released series/movies to entice people to start watching your VOD assets)
Advertising channel (e.g., TelSell)
Enough sales talk, let me get back to describing how we used Remix VOD2Live to build a looping live stream of tutorials and masterclasses, we call the Live Learning Channel.
The Demo Environment
In short, our demo builds on the following steps which are part of a full Remix VOD2Live workflow:
- Preparation of source content
- Creation of a playlist to define the livestream’s schedule
- Processing of the playlist in preparation for streaming
- Making the stream available through Unified Origin
We run all of the above steps in a containerized environment, making it easy to spin up locally for testing purposes and to run both a ‘stable’ and ‘trunk’ version of the demo. As the overall Remix VOD2Live solution is pretty straightforward, we use a single container running Origin and the web frontend that hosts different players. The container is built and deployed to our Kubernetes cluster using a Helm chart, and consists of the following:
- Alpine Linux
- Apache
- Unified Origin (mod_smooth_streaming)
- Unified’s CLI tools (unified_remix, mp4split et cetera)
For those of you not familiar with Helm it’s a tool to help you define, install, and upgrade applications deployed with Kubernetes. Everything in Kubernetes can be described with a YAML file. To generate these YAML files and serve as a single source of truth, Helm uses templates (charts, in Helm language) and then manages the deployment of the services specified in these templates to the Kubernetes cluster. We will publish a deeper dive into the demo architecture in a later blog.
Preparing source content
As indicated above, the initial step of any VOD2Live workflow is to ensure your content is prepared. In short, this means all content must share a similar encoding profile:
- Codec
- GOP length
- Bit rate ladder
- Resolution
- Aspect ratio
- Frame rate
- Sample rate
And although Remix can accommodate for certain differences, for the purpose of our demo we ran FFmpeg against all the tutorials and masterclasses we recorded throughout the past year to make sure they are encoded identically. To make this process easily repeatable (when new content needs to be added), we defined everything in a Makefile.
As this process needs to run only once, we did so in a separate environment. Actually running the VOD2Live container comes next.
The ‘Schedule’
The playlist that defines the schedule is XML-based and formatted according to the SMIL specification. In our demo setup, we mount the a playlist to the container when we deploy it. Since it acts as the ‘schedule’ of the live stream it can be considered the starting point for VOD2Live, at least from our perspective. Let’s take a look:
<?xml version="1.0" encoding="UTF-8"?> <smil xmlns="http://www.w3.org/2001/SMIL20/Language"> <!--Live Learning Channel Playlist--> <head/> <body> <seq> <par> <!--Start of the schedule with a recorded presentation by Simon--> <video src="http://s3.internal.unified-streaming.com/vod2live/Playlists_Simon_v4-avc1-400k.mp4"/> <video src="http://s3.internal.unified-streaming.com/vod2live/Playlists_Simon_v4-avc1-750k.mp4"/> <video src="http://s3.internal.unified-streaming.com/vod2live/Playlists_Simon_v4-avc1-1000k.mp4"/> <video src="http://s3.internal.unified-streaming.com/vod2live/Playlists_Simon_v4-avc1-1500k.mp4"/> <video src="http://s3.internal.unified-streaming.com/vod2live/Playlists_Simon_v4-avc1-2200k.mp4"/> <video src="http://s3.internal.unified-streaming.com/vod2live/Playlists_Simon_v4-aac-128k.mp4"/> <video src="http://s3.internal.unified-streaming.com/vod2live/Playlists_Simon_v4.ismt"/> <!--Inserting a SCTE 35 splice_insert() to mark the start of ad replacement opportunity--> <EventStream xmlns="urn:mpeg:dash:schema:mpd:2011" schemeIdUri="urn:scte:scte35:2014:xml+bin"> <Event> <Signal xmlns="http://www.scte.org/schemas/35/2016"> <SpliceInfoSection> <SpliceInsert outOfNetworkIndicator="0" spliceImmediateFlag="1"> <Program/> </SpliceInsert> </SpliceInfoSection> </Signal> </Event> </EventStream> </par> <par> <!--First ad stitched into the stream (can be replaced dynamically based on the SCTE 35 markers--> <video src="http://s3.internal.unified-streaming.com/vod2live/Unified_Astronaut_A_v2-avc1-400k.mp4"/> <video src="http://s3.internal.unified-streaming.com/vod2live/Unified_Astronaut_A_v2-avc1-750k.mp4"/> <video src="http://s3.internal.unified-streaming.com/vod2live/Unified_Astronaut_A_v2-avc1-1000k.mp4"/> <video src="http://s3.internal.unified-streaming.com/vod2live/Unified_Astronaut_A_v2-avc1-1500k.mp4"/> <video src="http://s3.internal.unified-streaming.com/vod2live/Unified_Astronaut_A_v2-avc1-2200k.mp4"/> <video src="http://s3.internal.unified-streaming.com/vod2live/Unified_Astronaut_A_v2-aac-128k.mp4"/> <!--Inserting a SCTE 35 splice_insert() to mark the end of ad replacement opportunity--> <EventStream xmlns="urn:mpeg:dash:schema:mpd:2011" schemeIdUri="urn:scte:scte35:2014:xml+bin"> <Event> <Signal xmlns="http://www.scte.org/schemas/35/2016"> <SpliceInfoSection> <SpliceInsert outOfNetworkIndicator="1" spliceImmediateFlag="1"> <Program/> </SpliceInsert> </SpliceInfoSection> </Signal> </Event> </EventStream> </par> <!--Playlist is much, much longer than this, but cut short here for the sake of brevity--> </seq> </body> </smil>
As you see, it is basically a schedule; a list of content, and messages — programming, bumpers, ads, SCTE-35 markers — in the order they should be played/processed.
Processing the playlist
So, when the container spins up and finds a SMIL playlist, it processes it with Remix, which can ‘mix’ content from various sources and put it onto a continuous timeline for seamless streaming.
This part is captured in the ‘remix it’ part of below snippet form our VOD2Live container’s entrypoint script:
if [ "${1#-}" != "$1" ]; then # prep all the vod2live schedules for smil in /var/www/unified-origin/smils/*smil do target=$(echo ${smil%.smil} | sed "s@smils/@@") # remix it unified_remix --license-key /etc/usp-license.key \ -o ${target}.mp4 \ ${REMIX_OPTS} \ ${smil} # isml it mp4split --license-key /etc/usp-license.key \ -o ${target}.isml \ --vod2live \ ${MP4SPLIT_OPTS} \ ${target}.mp4 done set -- httpd "$@" fi
Remix creates a lightweight, quick to create ‘remixed’ MP4. This file references but does not contain the source media specified in the SMIL. From the assets in the playlist Remix also builds a new timeline for the stream, and stores this information in the remixed MP4.
Delivering the VOD2Live stream
With the playlist encapsulated in the ‘remixed’ MP4 all that remains is to create the server manifest containing the configuration of your live stream. Using the VOD2Live option and the remixed MP4 as input, the Origin will output the media as live, announcing only segments as they become available according to the specified start time of the stream.
This part is captured in the ‘isml it’ part of below snippet form our VOD2Live container’s entrypoint script:
if [ "${1#-}" != "$1" ]; then # prep all the vod2live schedules for smil in /var/www/unified-origin/smils/*smil do target=$(echo ${smil%.smil} | sed "s@smils/@@") # remix it unified_remix --license-key /etc/usp-license.key \ -o ${target}.mp4 \ ${REMIX_OPTS} \ ${smil} # isml it mp4split --license-key /etc/usp-license.key \ -o ${target}.isml \ --vod2live \ ${MP4SPLIT_OPTS} \ ${target}.mp4 done set -- httpd "$@" fi
By default, the stream becomes available immediately and has a start time equal to the time at which the server manifest was created. However, it is possible to specify a custom start time; to set up everything beforehand but to keep Origin from actually generating a stream when requests are made until the start time is reached. This is especially useful for use cases like exclusive live streams of prerecorded events like concerts.
Look Mom, no live encoder
All in all it sounds fairly simple, and the basic idea is, however there are two huge advantages:
- No Live Encoder
- No manifest manipulation
There is no live encoder, wow! That saves you on the infrastructure and running costs involved with a live encoder workflow. The only limiting factors to the number of channels you can run are licenses and servers. Additionally, you can work with the more difficult codecs for live such as AV1 or Dolby Atmos and overall the simpler workflow allows for a faster time to market for new channels.
No manifest manipulation. Meaning less complexity and no loss of functionality. DRM, no problem, Dynamic Ad Replacement, no problem. All the standard live options are available in VOD2Live.
Conclusion
With your Remix VOD2Live workflow set up and working within your current structure, you can create, start and stop channels with relative ease. Just make a new SMIL available, process it with Remix and you have a new channel. If we want to add more content to the Learning Channel we simply kill the current container and spin up a new one, with an updated/changed SMIL playlist mounted to it.
The overall simplicity of Remix VOD2Live means you can cheaply and easily explore new opportunities with your content. If you want to test if that 24/7 Bob Ross arts channel is a winner, schedule it! The channel doesn’t even run until someone wants to view it. If it doesn’t work, you wasted minimal effort and cost.
There you have it, the containerized Learning Channel demo brought to you by Remix VOD2Live. A simple but elegant solution for giving VOD material all the functionality of live, with less cost and effort.
See the Remix VOD2Live Learning Channels in action.
Try it for yourself, with this quick and easy hands-on, available in our documentation (note: requires a VOD2Live activated license).
Learn more about the technical requirements of Remix VOD2Live
Contact sales if you have further questions or if you would like a license to test drive VOD2Live.
ref: Netflix launched ‘Direct’ as a trial in France in 2020