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
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
80
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
310
How Video Works?
flavioribeiro
2
820
Improving the Video Delivery at The New York Times
flavioribeiro
1
380
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
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
440
Intent as Code
shoppingjaws
6
1k
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
210
一人だけ、Kiroが静止する日
hideg
0
110
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
190
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
140
【高い買い物LT会】初任給で話題の国産フィジカルAIを買った話
akagami
PRO
0
160
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
140
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2k
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.3k
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
700
How I Stole PSI from Android Studio - DroidKaigi2026
worker8
0
140
Featured
See All Featured
Discover your Explorer Soul
emna__ayadi
2
1.3k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
830
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
400
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Between Models and Reality
mayunak
4
460
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Everyday Curiosity
cassininazir
0
320
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1k
What's in a price? How to price your products and services
michaelherold
247
13k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
280
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!