Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Leveraging Open Source to Create Virtual Live C...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Flávio Ribeiro
July 01, 2020
Programming
250
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Leveraging Open Source to Create Virtual Live Channels from On-Demand Video
Flávio Ribeiro
July 01, 2020
More Decks by Flávio Ribeiro
See All by Flávio Ribeiro
Building a Live Streaming Stack for Big Brother
flavioribeiro
0
82
Engineering a Live Streaming Workflow for Super Bowl 53 at CBS
flavioribeiro
0
220
Live Streaming Challenges & How we are Dealing with Them
flavioribeiro
0
320
How Video Works?
flavioribeiro
2
820
Improving the Video Delivery at The New York Times
flavioribeiro
1
390
Building a Closed Captions Ecosystem at The New York Times
flavioribeiro
0
230
Snickers: Open Source HTTP API for Media Encoding
flavioribeiro
0
350
The New York Times: Flash Free Video in 2016
flavioribeiro
0
120
Towards the Application of WebRTC Peer-to-Peer to Scale Live Video Streaming over the Internet
flavioribeiro
1
210
Other Decks in Programming
See All in Programming
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
430
AI時代のTerminal環境を UNIX哲学で設計・運用する
yasunori0418
1
240
[2026-10-14](C)Re:ゼロから始める異世界生活〜始まりの終わりと終わりの始まり〜
tosite
0
160
Inertia Rails: The One-Person Framework with React & Friends
skryukov
0
120
PyConTW 2026 - AI Coding 不只是工具升級, 區域醫院醫療資訊系統協作開發與資訊團隊轉型實踐
cclai999
0
200
Compiling a real-world CLI tool to native with Static Hermes
tmikov2023
0
130
残高管理から台帳サービスへの進化
artoy
1
210
コードで差別化できない時代の ソフトウェアエンジニアリング / Software Engineering in an Era Where Code Doesn’t Differentiate
kishida
2
200
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
240
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
Modernizing iOS Apps
seyfoyun
0
120
Vue Fes Japan の “作る側”に関わってみて
naokihaba
1
190
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.9k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
Designing for humans not robots
tammielis
254
26k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
490
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
340
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
610
Product Roadmaps are Hard
iamctodd
55
13k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
860
Building Better People: How to give real-time feedback that sticks.
wjessup
371
20k
Transcript
Leveraging Open Source to Create Virtual Live Channels from On-Demand
Video July, 2020
@flavioribeiro /in/flavioribeiro /flavioribeiro Flavio Ribeiro Director of Engineering, Video Technology
Group ViacomCBS Digital
None
None
None
None
AGENDA • Why? • How?
WHY? • recycle on-demand catalog • possible new revenue streams
• pop-up channels • personalized channels • cheap "rundown/playout" alternative • cheap (no encoding) streaming alternative
ON THE FLY PACKAGING from https://open.nytimes.com/improving-our-video-experience-part-one-our-on-demand-video-platform-cf818e03353d
OUR DEPLOYMENT
OUR DEPLOYMENT
Goofy is a R&D Project For Virtual 24/7 Linear Channels
from VoD Assets
Architecture AWS S3 Scheduler Playout MP4 MP4 MP4 Google Cloud
Storage MP4 MP4 MP4 File Streamer https://github.com/nytimes/gcs-helper https://github.com/crunchyroll/evs-s3helper
SCHEDULER • REST API • Mediainfo ◦ calculate asset duration
• detect overlap/content collision
SCHEDULER $ http POST http://scheduler <<< ' { "title": "STAR
TREK SEASON 01 EP 01", "airing_time_start": "2020-07-01T18:14:52Z", "renditions": [ { "label": "720p", "url": "http://gcs-helper:2000/proxy/STARTREK_S01E01_720p.mp4" }, { "label": "540p", "url": "http://gcs-helper:2000/proxy/STARTREK_S01E01_540p.mp4" }, { "label": "360p", "url": "http://gcs-helper:2000/proxy/STARTREK_S01E01_360p.mp4" }, ]
None
PLAYOUT • fetch & display "rolling window" of scheduled content
• format JSON payload expected by the NGINX VOD Module
PLAYOUT $ http GET http://playout { "clipSegments": [305, 305], "durations":
[3045000, 3049000], "clipTimes": [ 1593174206000, 1593618600000, ], "currentTime": 1593618583000, "discontinuity": true, "initialClipIndex": 890, "initialSegmentIndex": 84913, "playlistType": "live", "sequences": [ { "clips": [ {"path": "/proxy/STARTREK_S01E01_720p.mp4", "type": "source"}, {"path": "/proxy/STARTREK_S01E02_720p.mp4", "type": "source"} ], "language": "eng" }, { "clips": [ {"path": "/proxy/STARTREK_S01E01_640p.mp4", "type": "source"}, {"path": "/proxy/STARTREK_S01E02_640p.mp4", "type": "source"} ], "language": "eng" } ] }
PLAYOUT $ http GET http://playout { "clipSegments": [305, 305], "durations":
[3045000, 3049000], "clipTimes": [ 1593174206000, 1593618600000, ], "currentTime": 1593618583000, "discontinuity": true, "initialClipIndex": 890, "initialSegmentIndex": 84913, "playlistType": "live", "sequences": [ { "clips": [ {"path": "/proxy/STARTREK_S01E01_720p.mp4", "type": "source"}, {"path": "/proxy/STARTREK_S01E02_720p.mp4", "type": "source"} ], "language": "eng" }, { "clips": [ {"path": "/proxy/STARTREK_S01E01_640p.mp4", "type": "source"}, {"path": "/proxy/STARTREK_S01E02_640p.mp4", "type": "source"} ], "language": "eng" } ] } from scheduler airing time since epoch # of clips in the past (+1) # of segments in the past sum(clip durations) / segment length
NGINX http { vod_mode mapped; vod_upstream_location /goofy-playout-map; vod_hls_segment_file_name_prefix "segment"; vod_segment_duration
10000; vod_align_segments_to_key_frames on; vod_live_window_duration 60000; upstream goofy-playout { server playout:2828; } server { listen 80; server_name localhost; location /goofy-playout-map { rewrite ^/goofy-playout-map/h/(.*)$ /$2 break; proxy_pass http://goofy-playout; proxy_http_version 1.1; proxy_set_header Connection ""; } location /h { vod hls; add_header Access-Control-Allow-Headers '*'; add_header Access-Control-Allow-Methods 'GET, HEAD, OPTIONS'; add_header Access-Control-Allow-Origin '*'; } }
NGINX http { vod_mode mapped; vod_upstream_location /goofy-playout-map; vod_hls_segment_file_name_prefix "segment"; vod_segment_duration
10000; vod_align_segments_to_key_frames on; vod_live_window_duration 60000; upstream goofy-playout { server playout:2828; } server { listen 80; server_name localhost; location /goofy-playout-map { rewrite ^/goofy-playout-map/h/(.*)$ /$2 break; proxy_pass http://goofy-playout; proxy_http_version 1.1; proxy_set_header Connection ""; } location /h { vod hls; add_header Access-Control-Allow-Headers '*'; add_header Access-Control-Allow-Methods 'GET, HEAD, OPTIONS'; add_header Access-Control-Allow-Origin '*'; } } point vod module to the playout service Initiate vod module in mapped mode create a location for the hls delivery
None
FUTURE • UI/CMS for linear "programming"
None
FUTURE • UI/CMS for linear "programming" • ads support (via
scte-35 manifest decoration)
FUTURE • UI/CMS for linear "programming" • ads support (via
scte-35 manifest decoration) • support for mixed "real" live and virtual live
FUTURE • UI/CMS for linear "programming" • ads support (via
scte-35 manifest decoration) • support for mixed "real" live and virtual live • support for personalized slots on the linear feed • DASH (variant bitrates on the VOD library)
Thanks!