How to decentralize
Live Video Streaming
CASTO
@acidsound
Zero-Latency Decentralized
Broadcasting Web
PUMP UP THE VOLUME (1990)
VIDEO
Legacy Video Streaming
streamer
transcoding
Content Delivery Network
viewer
Huge computation cost/time
RTMP
HLS
HLS
CASTO
streamer
viewer
webRTC
VP8
H264
VP8
H264
SFU
* SFU: selective forwarding unit
SFU
SFU
SFU
SFU
SFU
webRTC
Traditional | CASTO | |
---|---|---|
Transcoding | SAAS Transcoding Media Server |
x |
Storage | AWS, Azure, GCP | x (delivery only) |
Delivery | CDN | P2P |
webRTC
webRTC + ?
IPFS(Interplanetary File System)
Decentralized
But ...
Is it suitable for live streaming ?
Distributed
File
System
What if the file gets bigger?
$ ipfs object get QmR45FmbVVrixReBwJkhEKde2qwHYaQzGxu4ZoDeswuF9w
{“Links”: [{
“Name”: “”,
“Hash”: “QmYSK2JyM3RyDyB52caZCTKFR3HKniEcMnNJYdk8DQ6KKB”,
“Size”: 262158},
{“Name”: “”,
“Hash”: “QmQeUqdjFmaxuJewStqCLUoKrR9khqb4Edw9TfRQQdfWz3”,
“Size”: 262158},
{“Name”: “”,
“Hash”: “Qma98bk1hjiRZDTmYmfiUXDj8hXXt7uGA5roU5mfUb3sVG”,
“Size”: 178947}],
“Data”: “\u0008\u0002\u0018* \u0010 \u0010 \n”}
Can't guarantee discover & broadcasting time
The solution is ??
IPFS Stack
What we really need
Modular Network Stack
We got them ALL
you pick what YOU want
Ethereum <3 libp2p
Polkadot <3 libp2p
and CASTO <3 libp2p !!
CodeLab
PeerInfo: Identification
/* peer의 생성 */
peerInfo = await new Promise((resolve, reject)=>PeerInfo.create((err,peerInfo)=>err && reject(err) || resolve(peerInfo)));
/* peer가 가질 수 있는 복수의 multiaddr 추가 */
peerInfo.multiaddrs.add(multiaddr(`/dns4/star-signal.cloud.ipfs.team/wss/p2p-webrtc-star/ipfs/${peerInfo.id.toB58String()}`));
Transport
Discover
Dial/Handle
Summary
1. Create PeerInfo (A & B)
2. Create a Node (A & B)
3. Run a Node (A & B)
4. Discover a Node (A -> B)
5. Dial the discovered Node (A -> B)
6. If successfully dialed, create a connection (A -> B)
5-1. Handle the dial (B -> A)
6-1. If successfully handled,
create a connection (B -> A)
And then
Peers exchange
webRTC connection info
for live streaming
Streamer
Relay
Viewer
Star (libp2p)
STUN/TURN (webRTC)
discover
streaming
CASTO Architecture
dial
dial
peerConnection
peerConnection
what libp2p does
1. Discover a Peer
2. Identify the Peer
3. When disconnected,
go back to #1
what webRTC does
1. Create a PeerConnection based on the identified Peer
2. Start live streaming
streamer
viewer
webRTC
VP8
H264
VP8
H264
SFU
* SFU: selective forwarding unit
SFU
SFU
SFU
SFU
SFU
webRTC
peer
* libp2p POV
peer
peer
peer
peer
peer
peer
peer
discovery
Why not use libp2p
for live streaming?
It's possible
BUT
webRTC is better at
Codec, Simulcast and Statistics
for media streaming
webRTC Protocol
webRTC Implementation
CASTO SDK
const casto = new CASTO();
media.srcObject = await casto.start();
Let's start with just 2 lines :D
ISSUES
NAT Traverse
Issues
What if they are under the same Public IP, but different router? (NAT-NAT)
What is one is on WIFI, but the other is using LTE?
What if the router bans UDP port for webRTC?
STUN/TURN server gets centralized!
Compatibility
Issues
Time solves the problem most of the time (Safari sucks..)
Safari started supporting webRTC Video just a year ago
New SDP Format - Possibility of flexible effective relay
Audio compatibility issues different browsers
Performance
Issues
Various Peer Discovery methods
Apply mDNS in a private Network
Peer/Content Routing using kadDHT
Performance tuning for different browsers
What's next ?
Multiple Depth Nodes
Next CASTO
Simulcast
Token Incentives
Web Client SDK
More docs
Cool tutorials & sample
Partners
STAY TUNED!
How to decentralize the live streaming video (eng)
By Lee Jaeho
How to decentralize the live streaming video (eng)
- 1,199