Paramount+: Dissected
Paramount+ is the successor of CBS All Access, and is priced at $5.99 – or $9.99 without ads. You can watch shows (NCIS, Spongebob), live TV (CBS), live sports (Champions League, NCAA) and movies (Star Trek, Indiana Jones) – there's something for everyone.
I first learnt about Paramount+ through their Super Bowl ads – cleverly branded as 'peak streaming'. I liked the atmosphere in these clips, and knew a sequel to HBO Max: Dissected was coming. So, when Paramount+ launched on the 4th of March, I signed up for the free trial.
Here's what we'll analyse in this Dissected article:
- Supported platforms
- Technical stack: UI, streaming protocols, DRM, CDN, video player, advertising, CMS, analytics, other
- Conclusion
Supported platforms
Paramount+ is on all the expected platforms and devices:
Desktop & Laptop | Mobile & Tablet | Streaming Device | Smart TV | Console |
---|---|---|---|---|
Browser | Browser | Chromecast | Vizio | PlayStation 4 |
Android | Apple TV | Android TV | Xbox One | |
iOS | Fire TV | Fire TV | Xbox Series X | |
Roku | Roku | |||
Portal | LG WebOS | |||
Xfinity | Samsung Tizen |
There's no mention of the PlayStation 5 on their website, so that's the odd one out.
Technical stack
The technical stack of Paramount+ is mature. That's no surprise, as they have a great team at ViacomCBS Streaming (formerly known as CBS Interactive). (PS. They're hiring!)
They use a combination of open-source and commercial, DRM and unprotected, client-side and server-side ad-insertion, and multiple analytics services.
User interface
Their user interface is the 3-page phalanx.
- The home page: a rectangular grid (i.e. the phalanx) with a menu bar and hero banner on top
- The asset page: a play button, a description, and related assets (in another phalanx)
- The video page
In the video view, you can hit play/pause, scrub the timeline (and see preview thumbnails), see the advertisement markers, change subtitles, toggle chromecast, and jump 10 seconds forward or back.
Hitting the pause button does something interesting: it minimizes the video, and shows a Paramount+ wallpaper. I can imagine two raisons d'être: 1) improve the brand connection; 2) show sponsored content.
Streaming protocols
Paramount+ uses a different flow for their on-demand content than for their live content.
- Their on-demand content uses HLS with FairPlay, and MPEG-DASH with PlayReady/Widevine.
- Their live content uses HLS with AES-128.
Paramount+ uses HLS v6 (and FairPlay) for Apple platforms, and MPEG-DASH (and Widevine and PlayReady) for the other platforms. Their qualities go up to 1080 on web browsers, and use H.264.
They package their streams and subtitles with the open-source Shaka Packager v2.4.3.
Sample HLS Master Playlist on macOS Safari
#EXTM3U
## Generated with https://github.com/google/shaka-packager version 562040e000-release
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:TYPE=AUDIO,URI="MTV_THEREALWORLDHOMECOMINGNEWYORK_101_HD_en-US_570329_3_aac_128/stream.m3u8",GROUP-ID="audio_aac",LANGUAGE="en",AUTOSELECT=YES,DEFAULT=YES,NAME="English",CHANNELS="2"
#EXT-X-MEDIA:TYPE=AUDIO,URI="MTV_THEREALWORLDHOMECOMINGNEWYORK_101_HD_en-US_dvs_570329_128/stream.m3u8",GROUP-ID="audio_aac",LANGUAGE="en",NAME="English AD",AUTOSELECT=YES,CHARACTERISTICS="public.accessibility.describes-video",CHANNELS="2"
#EXT-X-MEDIA:TYPE=SUBTITLES,URI="mWuix56Gb1O_xSC0nxnCPx4sx3MKJfAA_1614637127674/stream_vtt.m3u8",GROUP-ID="cbsi_webvtt",LANGUAGE="en",NAME="English",AUTOSELECT=YES
#EXT-X-STREAM-INF:BANDWIDTH=717027,AVERAGE-BANDWIDTH=578166,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=640x360,FRAME-RATE=23.981,AUDIO="audio_aac",SUBTITLES="cbsi_webvtt"
MTV_THEREALWORLDHOMECOMINGNEWYORK_101_HD_570329_375/stream.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2208506,AVERAGE-BANDWIDTH=1717001,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=960x540,FRAME-RATE=23.981,AUDIO="audio_aac",SUBTITLES="cbsi_webvtt"
MTV_THEREALWORLDHOMECOMINGNEWYORK_101_HD_570329_1500/stream.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1227876,AVERAGE-BANDWIDTH=957352,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=768x432,FRAME-RATE=23.981,AUDIO="audio_aac",SUBTITLES="cbsi_webvtt"
MTV_THEREALWORLDHOMECOMINGNEWYORK_101_HD_570329_750/stream.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2997818,AVERAGE-BANDWIDTH=2322751,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=1024x576,FRAME-RATE=23.981,AUDIO="audio_aac",SUBTITLES="cbsi_webvtt"
MTV_THEREALWORLDHOMECOMINGNEWYORK_101_HD_570329_2100/stream.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=6220425,AVERAGE-BANDWIDTH=4738550,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=23.981,AUDIO="audio_aac",SUBTITLES="cbsi_webvtt"
MTV_THEREALWORLDHOMECOMINGNEWYORK_101_HD_570329_4500/stream.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=4168264,AVERAGE-BANDWIDTH=3233571,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=1280x720,FRAME-RATE=23.981,AUDIO="audio_aac",SUBTITLES="cbsi_webvtt"
MTV_THEREALWORLDHOMECOMINGNEWYORK_101_HD_570329_3000/stream.m3u8
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=175041,AVERAGE-BANDWIDTH=75932,CODECS="avc1.640028",RESOLUTION=640x360,URI="MTV_THEREALWORLDHOMECOMINGNEWYORK_101_HD_570329_375/stream_iframe.m3u8"
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=703921,AVERAGE-BANDWIDTH=240367,CODECS="avc1.640028",RESOLUTION=960x540,URI="MTV_THEREALWORLDHOMECOMINGNEWYORK_101_HD_570329_1500/stream_iframe.m3u8"
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=358346,AVERAGE-BANDWIDTH=136569,CODECS="avc1.640028",RESOLUTION=768x432,URI="MTV_THEREALWORLDHOMECOMINGNEWYORK_101_HD_570329_750/stream_iframe.m3u8"
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=967609,AVERAGE-BANDWIDTH=313131,CODECS="avc1.640028",RESOLUTION=1024x576,URI="MTV_THEREALWORLDHOMECOMINGNEWYORK_101_HD_570329_2100/stream_iframe.m3u8"
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=1942730,AVERAGE-BANDWIDTH=612792,CODECS="avc1.640028",RESOLUTION=1920x1080,URI="MTV_THEREALWORLDHOMECOMINGNEWYORK_101_HD_570329_4500/stream_iframe.m3u8"
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=1365019,AVERAGE-BANDWIDTH=422271,CODECS="avc1.640028",RESOLUTION=1280x720,URI="MTV_THEREALWORLDHOMECOMINGNEWYORK_101_HD_570329_3000/stream_iframe.m3u8"
Sample MPEG-DASH manifest on macOS Chrome
<?xml version="1.0" encoding="UTF-8"?>
<!--Generated with https://github.com/google/shaka-packager version 562040e000-release-->
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cenc="urn:mpeg:cenc:2013" xmlns:mspr="urn:microsoft:playready" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" profiles="urn:mpeg:dash:profile:isoff-live:2011" minBufferTime="PT2S" type="static" mediaPresentationDuration="PT2612.8603515625S">
<Period id="0">
<AdaptationSet id="0" contentType="audio" lang="DD+" segmentAlignment="true">
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="c70e7386-1b86-4c84-a1db-db4cc035e56b"/>
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAVnBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAADYIARIQxw5zhhuGTISh29tMwDXlayIgcVlwWG4wQlg0WE9XU0k4WXN0c3dzb0lLSGpnTDdneU4=</cenc:pssh>
</ContentProtection>
<ContentProtection value="MSPR 2.0" schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95">
<cenc:pssh>AAADqHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAA4iIAwAAAQABAH4DPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgBoAG4ATQBPAHgANABZAGIAaABFAHkAaAAyADkAdABNAHcARABYAGwAYQB3AD0APQA8AC8ASwBJAEQAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcAA6AC8ALwBjAGIAcwBpAC4AbABpAHYAZQAuAG8AdAB0AC4AaQByAGQAZQB0AG8ALgBjAG8AbQAvAHAAbABhAHkAcgBlAGEAZAB5AC8AcgBpAGcAaAB0AHMAbQBhAG4AYQBnAGUAcgAuAGEAcwBtAHgAPwBDAHIAbQBJAGQAPQBjAGIAcwBpACYAYQBtAHAAOwBBAGMAYwBvAHUAbgB0AEkAZAA9AGMAYgBzAGkAJgBhAG0AcAA7AEMAbwBuAHQAZQBuAHQASQBkAD0AcQBZAHAAWABuADAAQgBYADQAWABPAFcAUwBJADgAWQBzAHQAcwB3AHMAbwBJAEsASABqAGcATAA3AGcAeQBOADwALwBMAEEAXwBVAFIATAA+ADwARABTAF8ASQBEAD4ARABmAEMAbQBCAFgAdwBLAGEARQB5AFQAbAA3ADgAcgBRAEkAOQB1AHEAUQA9AD0APAAvAEQAUwBfAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AdgBzAG0AUwBKAHYARABPAHgAMQBvAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</cenc:pssh>
<mspr:pro>iAMAAAEAAQB+AzwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AaABuAE0ATwB4ADQAWQBiAGgARQB5AGgAMgA5AHQATQB3AEQAWABsAGEAdwA9AD0APAAvAEsASQBEAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAOgAvAC8AYwBiAHMAaQAuAGwAaQB2AGUALgBvAHQAdAAuAGkAcgBkAGUAdABvAC4AYwBvAG0ALwBwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4AD8AQwByAG0ASQBkAD0AYwBiAHMAaQAmAGEAbQBwADsAQQBjAGMAbwB1AG4AdABJAGQAPQBjAGIAcwBpACYAYQBtAHAAOwBDAG8AbgB0AGUAbgB0AEkAZAA9AHEAWQBwAFgAbgAwAEIAWAA0AFgATwBXAFMASQA4AFkAcwB0AHMAdwBzAG8ASQBLAEgAagBnAEwANwBnAHkATgA8AC8ATABBAF8AVQBSAEwAPgA8AEQAUwBfAEkARAA+AEQAZgBDAG0AQgBYAHcASwBhAEUAeQBUAGwANwA4AHIAUQBJADkAdQBxAFEAPQA9ADwALwBEAFMAXwBJAEQAPgA8AEMASABFAEMASwBTAFUATQA+AHYAcwBtAFMASgB2AEQATwB4ADEAbwA9ADwALwBDAEgARQBDAEsAUwBVAE0APgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==</mspr:pro>
</ContentProtection>
<Representation id="0" bandwidth="194317" codecs="ec-3" mimeType="audio/mp4" audioSamplingRate="48000">
<AudioChannelConfiguration schemeIdUri="tag:dolby.com,2014:dash:audio_channel_configuration:2011" value="F801"/>
<SegmentTemplate timescale="48000" initialization="all_rise_209_jc_2398_en-US_562412_1_eac3_192/init.m4v" media="all_rise_209_jc_2398_en-US_562412_1_eac3_192/seg_$Number$.m4s" startNumber="1">
<SegmentTimeline>
<S t="0" d="288768"/>
<S t="288768" d="287232"/>
...
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
<AdaptationSet id="1" contentType="audio" lang="Dolby Digital" segmentAlignment="true">
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="c70e7386-1b86-4c84-a1db-db4cc035e56b"/>
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAVnBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAADYIARIQxw5zhhuGTISh29tMwDXlayIgcVlwWG4wQlg0WE9XU0k4WXN0c3dzb0lLSGpnTDdneU4=</cenc:pssh>
</ContentProtection>
<ContentProtection value="MSPR 2.0" schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95">
<cenc:pssh>AAADqHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAA4iIAwAAAQABAH4DPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgBoAG4ATQBPAHgANABZAGIAaABFAHkAaAAyADkAdABNAHcARABYAGwAYQB3AD0APQA8AC8ASwBJAEQAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcAA6AC8ALwBjAGIAcwBpAC4AbABpAHYAZQAuAG8AdAB0AC4AaQByAGQAZQB0AG8ALgBjAG8AbQAvAHAAbABhAHkAcgBlAGEAZAB5AC8AcgBpAGcAaAB0AHMAbQBhAG4AYQBnAGUAcgAuAGEAcwBtAHgAPwBDAHIAbQBJAGQAPQBjAGIAcwBpACYAYQBtAHAAOwBBAGMAYwBvAHUAbgB0AEkAZAA9AGMAYgBzAGkAJgBhAG0AcAA7AEMAbwBuAHQAZQBuAHQASQBkAD0AcQBZAHAAWABuADAAQgBYADQAWABPAFcAUwBJADgAWQBzAHQAcwB3AHMAbwBJAEsASABqAGcATAA3AGcAeQBOADwALwBMAEEAXwBVAFIATAA+ADwARABTAF8ASQBEAD4ARABmAEMAbQBCAFgAdwBLAGEARQB5AFQAbAA3ADgAcgBRAEkAOQB1AHEAUQA9AD0APAAvAEQAUwBfAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AdgBzAG0AUwBKAHYARABPAHgAMQBvAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</cenc:pssh>
<mspr:pro>iAMAAAEAAQB+AzwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AaABuAE0ATwB4ADQAWQBiAGgARQB5AGgAMgA5AHQATQB3AEQAWABsAGEAdwA9AD0APAAvAEsASQBEAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAOgAvAC8AYwBiAHMAaQAuAGwAaQB2AGUALgBvAHQAdAAuAGkAcgBkAGUAdABvAC4AYwBvAG0ALwBwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4AD8AQwByAG0ASQBkAD0AYwBiAHMAaQAmAGEAbQBwADsAQQBjAGMAbwB1AG4AdABJAGQAPQBjAGIAcwBpACYAYQBtAHAAOwBDAG8AbgB0AGUAbgB0AEkAZAA9AHEAWQBwAFgAbgAwAEIAWAA0AFgATwBXAFMASQA4AFkAcwB0AHMAdwBzAG8ASQBLAEgAagBnAEwANwBnAHkATgA8AC8ATABBAF8AVQBSAEwAPgA8AEQAUwBfAEkARAA+AEQAZgBDAG0AQgBYAHcASwBhAEUAeQBUAGwANwA4AHIAUQBJADkAdQBxAFEAPQA9ADwALwBEAFMAXwBJAEQAPgA8AEMASABFAEMASwBTAFUATQA+AHYAcwBtAFMASgB2AEQATwB4ADEAbwA9ADwALwBDAEgARQBDAEsAUwBVAE0APgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==</mspr:pro>
</ContentProtection>
<Representation id="1" bandwidth="386317" codecs="ac-3" mimeType="audio/mp4" audioSamplingRate="48000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="6"/>
<SegmentTemplate timescale="48000" initialization="all_rise_209_jc_2398_en-US_562412_2_ac3_384/init.m4v" media="all_rise_209_jc_2398_en-US_562412_2_ac3_384/seg_$Number$.m4s" startNumber="1">
<SegmentTimeline>
<S t="0" d="288768"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
<AdaptationSet id="2" contentType="audio" lang="en" segmentAlignment="true">
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="c70e7386-1b86-4c84-a1db-db4cc035e56b"/>
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAVnBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAADYIARIQxw5zhhuGTISh29tMwDXlayIgcVlwWG4wQlg0WE9XU0k4WXN0c3dzb0lLSGpnTDdneU4=</cenc:pssh>
</ContentProtection>
<ContentProtection value="MSPR 2.0" schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95">
<cenc:pssh>AAADqHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAA4iIAwAAAQABAH4DPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgBoAG4ATQBPAHgANABZAGIAaABFAHkAaAAyADkAdABNAHcARABYAGwAYQB3AD0APQA8AC8ASwBJAEQAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcAA6AC8ALwBjAGIAcwBpAC4AbABpAHYAZQAuAG8AdAB0AC4AaQByAGQAZQB0AG8ALgBjAG8AbQAvAHAAbABhAHkAcgBlAGEAZAB5AC8AcgBpAGcAaAB0AHMAbQBhAG4AYQBnAGUAcgAuAGEAcwBtAHgAPwBDAHIAbQBJAGQAPQBjAGIAcwBpACYAYQBtAHAAOwBBAGMAYwBvAHUAbgB0AEkAZAA9AGMAYgBzAGkAJgBhAG0AcAA7AEMAbwBuAHQAZQBuAHQASQBkAD0AcQBZAHAAWABuADAAQgBYADQAWABPAFcAUwBJADgAWQBzAHQAcwB3AHMAbwBJAEsASABqAGcATAA3AGcAeQBOADwALwBMAEEAXwBVAFIATAA+ADwARABTAF8ASQBEAD4ARABmAEMAbQBCAFgAdwBLAGEARQB5AFQAbAA3ADgAcgBRAEkAOQB1AHEAUQA9AD0APAAvAEQAUwBfAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AdgBzAG0AUwBKAHYARABPAHgAMQBvAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</cenc:pssh>
<mspr:pro>iAMAAAEAAQB+AzwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AaABuAE0ATwB4ADQAWQBiAGgARQB5AGgAMgA5AHQATQB3AEQAWABsAGEAdwA9AD0APAAvAEsASQBEAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAOgAvAC8AYwBiAHMAaQAuAGwAaQB2AGUALgBvAHQAdAAuAGkAcgBkAGUAdABvAC4AYwBvAG0ALwBwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4AD8AQwByAG0ASQBkAD0AYwBiAHMAaQAmAGEAbQBwADsAQQBjAGMAbwB1AG4AdABJAGQAPQBjAGIAcwBpACYAYQBtAHAAOwBDAG8AbgB0AGUAbgB0AEkAZAA9AHEAWQBwAFgAbgAwAEIAWAA0AFgATwBXAFMASQA4AFkAcwB0AHMAdwBzAG8ASQBLAEgAagBnAEwANwBnAHkATgA8AC8ATABBAF8AVQBSAEwAPgA8AEQAUwBfAEkARAA+AEQAZgBDAG0AQgBYAHcASwBhAEUAeQBUAGwANwA4AHIAUQBJADkAdQBxAFEAPQA9ADwALwBEAFMAXwBJAEQAPgA8AEMASABFAEMASwBTAFUATQA+AHYAcwBtAFMASgB2AEQATwB4ADEAbwA9ADwALwBDAEgARQBDAEsAUwBVAE0APgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==</mspr:pro>
</ContentProtection>
<Representation id="2" bandwidth="131093" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="48000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
<SegmentTemplate timescale="48000" initialization="all_rise_209_jc_2398_en-US_562412_3_aac_128/init.m4v" media="all_rise_209_jc_2398_en-US_562412_3_aac_128/seg_$Number$.m4s" startNumber="1">
<SegmentTimeline>
<S t="0" d="288768"/>
<S t="288768" d="287744" r="2"/>
...
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
<AdaptationSet id="3" contentType="video" maxWidth="1920" maxHeight="1080" frameRate="24000/1001" segmentAlignment="true" par="16:9">
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="c70e7386-1b86-4c84-a1db-db4cc035e56b"/>
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAVnBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAADYIARIQxw5zhhuGTISh29tMwDXlayIgcVlwWG4wQlg0WE9XU0k4WXN0c3dzb0lLSGpnTDdneU4=</cenc:pssh>
</ContentProtection>
<ContentProtection value="MSPR 2.0" schemeIdUri="urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95">
<cenc:pssh>AAADqHBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAA4iIAwAAAQABAH4DPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgBoAG4ATQBPAHgANABZAGIAaABFAHkAaAAyADkAdABNAHcARABYAGwAYQB3AD0APQA8AC8ASwBJAEQAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcAA6AC8ALwBjAGIAcwBpAC4AbABpAHYAZQAuAG8AdAB0AC4AaQByAGQAZQB0AG8ALgBjAG8AbQAvAHAAbABhAHkAcgBlAGEAZAB5AC8AcgBpAGcAaAB0AHMAbQBhAG4AYQBnAGUAcgAuAGEAcwBtAHgAPwBDAHIAbQBJAGQAPQBjAGIAcwBpACYAYQBtAHAAOwBBAGMAYwBvAHUAbgB0AEkAZAA9AGMAYgBzAGkAJgBhAG0AcAA7AEMAbwBuAHQAZQBuAHQASQBkAD0AcQBZAHAAWABuADAAQgBYADQAWABPAFcAUwBJADgAWQBzAHQAcwB3AHMAbwBJAEsASABqAGcATAA3AGcAeQBOADwALwBMAEEAXwBVAFIATAA+ADwARABTAF8ASQBEAD4ARABmAEMAbQBCAFgAdwBLAGEARQB5AFQAbAA3ADgAcgBRAEkAOQB1AHEAUQA9AD0APAAvAEQAUwBfAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AdgBzAG0AUwBKAHYARABPAHgAMQBvAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A</cenc:pssh>
<mspr:pro>iAMAAAEAAQB+AzwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AaABuAE0ATwB4ADQAWQBiAGgARQB5AGgAMgA5AHQATQB3AEQAWABsAGEAdwA9AD0APAAvAEsASQBEAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAOgAvAC8AYwBiAHMAaQAuAGwAaQB2AGUALgBvAHQAdAAuAGkAcgBkAGUAdABvAC4AYwBvAG0ALwBwAGwAYQB5AHIAZQBhAGQAeQAvAHIAaQBnAGgAdABzAG0AYQBuAGEAZwBlAHIALgBhAHMAbQB4AD8AQwByAG0ASQBkAD0AYwBiAHMAaQAmAGEAbQBwADsAQQBjAGMAbwB1AG4AdABJAGQAPQBjAGIAcwBpACYAYQBtAHAAOwBDAG8AbgB0AGUAbgB0AEkAZAA9AHEAWQBwAFgAbgAwAEIAWAA0AFgATwBXAFMASQA4AFkAcwB0AHMAdwBzAG8ASQBLAEgAagBnAEwANwBnAHkATgA8AC8ATABBAF8AVQBSAEwAPgA8AEQAUwBfAEkARAA+AEQAZgBDAG0AQgBYAHcASwBhAEUAeQBUAGwANwA4AHIAUQBJADkAdQBxAFEAPQA9ADwALwBEAFMAXwBJAEQAPgA8AEMASABFAEMASwBTAFUATQA+AHYAcwBtAFMASgB2AEQATwB4ADEAbwA9ADwALwBDAEgARQBDAEsAUwBVAE0APgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==</mspr:pro>
</ContentProtection>
<Representation id="3" bandwidth="488385" codecs="avc1.640028" mimeType="video/mp4" sar="1:1" width="640" height="360">
<SegmentTemplate timescale="24000" initialization="all_rise_209_jc_2398_562412_375/init.m4v" media="all_rise_209_jc_2398_562412_375/seg_$Number$.m4s" startNumber="1">
<SegmentTimeline>
<S t="0" d="144144" r="332"/>
<S t="47999952" d="96096"/>
<S t="48096048" d="144144" r="100"/>
<S t="62654592" d="54054"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
<Representation id="4" bandwidth="1930579" codecs="avc1.640028" mimeType="video/mp4" sar="1:1" width="960" height="540">
<SegmentTemplate timescale="24000" initialization="all_rise_209_jc_2398_562412_1500/init.m4v" media="all_rise_209_jc_2398_562412_1500/seg_$Number$.m4s" startNumber="1">
<SegmentTimeline>
<S t="0" d="144144" r="332"/>
<S t="47999952" d="96096"/>
<S t="48096048" d="144144" r="100"/>
<S t="62654592" d="54054"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
<Representation id="5" bandwidth="3853696" codecs="avc1.640028" mimeType="video/mp4" sar="1:1" width="1280" height="720">
<SegmentTemplate timescale="24000" initialization="all_rise_209_jc_2398_562412_3000/init.m4v" media="all_rise_209_jc_2398_562412_3000/seg_$Number$.m4s" startNumber="1">
<SegmentTimeline>
<S t="0" d="144144" r="332"/>
<S t="47999952" d="96096"/>
<S t="48096048" d="144144" r="100"/>
<S t="62654592" d="54054"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
<Representation id="6" bandwidth="5754510" codecs="avc1.640028" mimeType="video/mp4" sar="1:1" width="1920" height="1080">
<SegmentTemplate timescale="24000" initialization="all_rise_209_jc_2398_562412_4500/init.m4v" media="all_rise_209_jc_2398_562412_4500/seg_$Number$.m4s" startNumber="1">
<SegmentTimeline>
<S t="0" d="144144" r="332"/>
<S t="47999952" d="96096"/>
<S t="48096048" d="144144" r="100"/>
<S t="62654592" d="54054"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
<Representation id="7" bandwidth="2713495" codecs="avc1.640028" mimeType="video/mp4" sar="1:1" width="1024" height="576">
<SegmentTemplate timescale="24000" initialization="all_rise_209_jc_2398_562412_2100/init.m4v" media="all_rise_209_jc_2398_562412_2100/seg_$Number$.m4s" startNumber="1">
<SegmentTimeline>
<S t="0" d="144144" r="332"/>
<S t="47999952" d="96096"/>
<S t="48096048" d="144144" r="100"/>
<S t="62654592" d="54054"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
<Representation id="8" bandwidth="972154" codecs="avc1.640028" mimeType="video/mp4" sar="1:1" width="768" height="432">
<SegmentTemplate timescale="24000" initialization="all_rise_209_jc_2398_562412_750/init.m4v" media="all_rise_209_jc_2398_562412_750/seg_$Number$.m4s" startNumber="1">
<SegmentTimeline>
<S t="0" d="144144" r="332"/>
<S t="47999952" d="96096"/>
<S t="48096048" d="144144" r="100"/>
<S t="62654592" d="54054"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
<AdaptationSet id="4" contentType="text" lang="en" segmentAlignment="true">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="subtitle"/>
<Representation id="9" bandwidth="1156" codecs="wvtt" mimeType="application/mp4">
<SegmentTemplate timescale="1000" initialization="qYpXn0BX4XOWSI8YstswsoIKHjgL7gyN_1613952902321/vtt_init.m4v" media="qYpXn0BX4XOWSI8YstswsoIKHjgL7gyN_1613952902321/seg_$Number$.m4s" startNumber="1">
<SegmentTimeline>
<S t="0" d="6000" r="429"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
<AdaptationSet id="5" mimeType="image/jpeg" contentType="image">
<SegmentTemplate media="$RepresentationID$/tile_$Number$.jpg" duration="320" startNumber="1"/>
<Representation bandwidth="38530" id="thumb_160x90" width="640" height="720">
<EssentialProperty schemeIdUri="http://dashif.org/guidelines/thumbnail_tile" value="4x8"/>
</Representation>
<Representation bandwidth="146689" id="thumb_320x180" width="1280" height="1440">
<EssentialProperty schemeIdUri="http://dashif.org/guidelines/thumbnail_tile" value="4x8"/>
</Representation>
</AdaptationSet>
</Period>
</MPD>
Paramount+ supposedly has some titles in 4K, but I wasn't able to identify any on macOS Safari. (They could've technically targeted macOS Safari with their 4K streams because it natively supports HLS + FairPlay + 4K + HEVC.)
DRM
Irdeto is their commercial multi-DRM vendor for on-demand content. Their license URL (see below) actually hints that most of CBS Interactive uses Irdeto:
Note that they use the "older" version of Irdeto DRM – not the "newer" Irdeto Control.
They use HLS with AES-128 for their live content. Their live streams aren't well-secured (– let's refrain from going in deeper detail). I'm assuming that they'll improve the protection of these live streams in the near future.
CDN
Cedexis hosts their streams, as hinted through https://vod-gcs-cedexis.cbsaavideo.com/intl_vms/2021/02/10/1858494531800/573647_cenc_dash/stream.mpd
and https://vod-gcs-cedexis.cbsaavideo.com/intl_vms/2021/02/10/1858494531800/573647_cenc_dash/I3o4iv9Pgbm4UZNTyVsAcVBFJn0zLtpf_1614646885374/seg_4.m4s
.
It seems they also use Fastly.
Video player
Their code insinuates that they have a custom video player which can use the open-source hls.js, Dash.js and Shaka Player.
I don't know what they use other platforms, but I'll guess that it's open-source across the board?
Advertising
Their on-demand content has client-side ads powered by Google Ad Manager.
- They consistently use pre-roll advertisements, and also throw in quite a bit of mid-roll advertisements.
- I feel like their ad breaks are pretty lengthy – sometimes up to 90 seconds.
- They have client-side ad blocker detection – courtesy of the Google IMA SDK.
Their live content has server-side ads powered by two different vendors.
- Their regular "CBS Live TV" uses Syncbak for server-side ad insertion, as hinted through the URL of their HLS master playlist on macOS Chrome:
https://cbsplaylistserver.aws.syncbak.com/cpl/17761229/cbshls/2.0/7b2264657669636554797065223a382c226361706162696c6974696573223a7b223630465053223a747275657d7d/master.m3u8?access_token=e...
- 2. Their "CBS Sports TV" uses Google Dynamic Ad Insertion, as hinted through the URL of their HLS master playlist on macOS Chrome:
https://dai.google.com/linear/hls/pa/event/9Lq0ERvoSR-z9AwvFS-xYA/stream/a95594b6-f182-4adf-817f-355a0cdbf9ee:MRN2/master.m3u8
.
CMS
Paramount+ uses Comcast (AKA thePlatform AKA MPX) to "package" their stream-related information in a "SMIL manifest", including the DASH/HLS manifest URL, the client-side Google ad tag URLs, a description of the video, and more.
During video playback, Paramount+ pings a service called "Sparrow" every 10 seconds. This service helps them determine the "bookmark position" of your video. The funny thing is that this service isn't really secure. Consider the following URL:
https://sparrow.paramountplus.com/streamer/v1.0/ingest/beacon.json?contentid=V9wnXFCZ2TgIJALTcPbE3mKFyVHPD4Qg&userid=51902989&siteid=164&sessionid=1615339650913&platform=Desktop&premium=true&affiliate=false&medtime=1010&ts=1615343127&profileid=0
If you paste this URL in your address bar, and enter my real sessionid
and userid
, you'd be able to "configure my bookmarks" by setting a specific contentid
and medtime
. For me, this isn't a big security leak, but it does allow you to pull some pranks. Additionally, it isn't super trivial to acquire someones sessionid
and userid
– but it's doable.
Analytics
Paramount+ uses Conviva 4.0.1. – a recent version published in May of 2020. This insinuates that Paramount+ does a good job at maintaining their ecosystem. (That's commendable!)
They also use Nielsen – version 6.0.0.582 to be specific.
Adobe is also gathering intel, as is Comscore, as are a bunch of other services. That's not uncommon.
Other
Here are some other interesting tidbits:
- Paramount+ supports download-to-go if you select their $9.99 package.
- Paramount+ has a "Continue Watching" feature, which resumes where you left off.
- Paramount+ doesn't have a "Skip Intro" button, nor a "Play Next" button when you're at the end of your current episode. (That's pretty unfortunate.)
- There's a pretty silly bug related to subtitles and advertisements. If you seek into an ad break when an ad break is visible, Paramount+ doesn't properly hide the subtitles text box.
Regarding their apps:
- Their Roku app looks good.
- I think they're using a Chromecast CAF Receiver with a minimum amount of custom styling – but some custom styling nonetheless.
- Their iPhone (4/5) and Android (3.5/5) apps look good, but eerily similar. React Native or Flutter perhaps? There are a couple of "negative" Android reviews, but Android is harder to do well compared to iOS.
Conclusion
Definitely a passing grade, and kudos to the ViacomCBS team! You really feel that they wanted to do it the right way.
But, let's be super anal for a second, and list some theoretical improvements – ignoring the price tag:
- Multi-codec ABR. They currently seemingly only use H.264. (I might be wrong!)
- 4K. OTT services like to brag with this, but Paramount+ isn't really offering it? (I might be wrong!)
- Security. Their live content isn't really secured. Their bookmarks architecture feels vulnerable.
- Watch Together. It's hype. Not saying it's a killer feature though.
- Watchlists and notifications. I'm not able to "save" content I'm interested in. Additionally, it seems a bit tough to discover certain live events, like Champion Leagues games.
Anyway. I'm happy. Competition keeps the industry moving forward.