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
진짜로 필요한 것
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!
How to decentralize the live streaming video
By Lee Jaeho
How to decentralize the live streaming video
- 1,192