How to decentralize
the Live Video Streaming

CASTO

@acidsound

Zero-Latency Decentralized
Broadcasting Protocol

볼륨을 높여라

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

그런데?

LiveStreaming에 적합해?

분산 파일 구조

파일이 커지면?

$ 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”}

탐색+전송 시간이 보장 안됨

대안은?

IPFS Stack

IPFS Stack

진짜로 필요한 것

Modular Network Stack

네가 뭘 좋아할지 몰라서 다 준비했어

필요한 것만 골라쓰면 됨

Ethereum과도 <3

Polkadot도 <3

CASTO도 좋아합니다 <3

간단한 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

요약

1. PeerInfo를 만든다

2. Node를 만든다

3. Node를 실행한다

4. Node를 발견한다

5. 발견한 Node를 Dial한다

6. Dial한 Node로부터 Connection을 맺는다

5-1. Dial한 Node에게 Handle로 응답한다

6-1. Handle에서 Connection을 맺는다

그리고

Peer간 Live Streaming에
필요한 webRTC
접속정보를 교환

Streamer

Relay

Viewer

Star (libp2p)

STUN/TURN (webRTC)

discover

streaming

CASTO Architecture

dial

dial

peerConnection

peerConnection

libp2p는

1. Peer를 발견하고

2. 다른 Peer를 식별
3. 연결유실시 다시 1번으로

webRTC는

1. 식별한 Peer를 중심으로
PeerConnection 생성

2. livestreaming 전송

streamer

viewer

webRTC

VP8
H264

VP8
H264

SFU

* SFU: selective forwarding unit

SFU

SFU

SFU

SFU

SFU

webRTC

peer

* libp2p 관점

peer

peer

peer

peer

peer

peer

peer

discovery

libp2p로 LiveStreaming
하면 안되나요?

가능함
하지만 Codec과
영상품질별(Simulcast) 전송
통계 측정등 영상 요구사항엔
webRTC 가 MediaStreaming에 더 적합

webRTC Protocol

webRTC 구현

CASTO SDK

const casto = new CASTO();
media.srcObject = await casto.start();

두줄부터 시작할께요 :D

ISSUES

NAT Traverse

Issues

같은 Public IP, 다른 공유기라면? (NAT-NAT)

한쪽은 WIFI, 한쪽은 LTE?

webRTC에서 사용하는 UDP가
공유기 레벨에서 막혀있다면?

심지어 통신사별로 정책이 다르다!

STURN/TURN 서버가 중앙화되는 문제!

Compatibility

Issues

대부분 시간이 해결해 줌 (Safari님아 자비좀...)

애플의 경우 webRTC Video가 된지 1년 겨우 넘었음

새로운 SDP Format - 유연하고 효과적인 Relay 구성 가능

오디오 재생 관련 구현이 브라우저별로 다름

Performance

Issues

다양한 Peer Discovery 방식 적용. 속도 향상.

Private Network에서 mDNS  적용하여 NAT안에서 해결

kadDHT를 통한 Peer간 Routing

Browser별 실행환경 차이에 대한 지속적 튜닝

NEXT

Multiple Depth Nodes

Next CASTO

Simulcast

Token Incentives

Web Client SDK

More docs

Cool tutorials & sample

Partners

STAY TUNED!

Made with Slides.com