Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
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
78
Engineering a Live Streaming Workflow for Super Bowl 53 at CBS
flavioribeiro
0
210
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
220
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
200
Other Decks in Programming
See All in Programming
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.7k
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
180
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
590
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
4
380
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
190
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
160
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
150
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
210
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
210
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
120
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
260
Go 1.27 における memory allocation の高速化
andpad
0
110
Featured
See All Featured
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
450
Designing for Performance
lara
611
70k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
640
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Exploring anti-patterns in Rails
aemeredith
3
460
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Ruling the World: When Life Gets Gamed
codingconduct
0
290
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
850
Mind Mapping
helmedeiros
PRO
1
300
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
210
Everyday Curiosity
cassininazir
0
270
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!