WebRTC-확장 가능한 라이브 스트림 방송 / 멀티 캐스팅


114

문제:

WebRTC는 P2P 비디오 / 오디오 연결을 제공합니다. p2p 통화, 행 아웃에 적합합니다. 하지만 방송은 어떨까요 (일대 다, 예를 들어 1 대 10000)?

방송사 "B"와 두 명의 참석자 "A1", "A2"가 있다고 가정 해 보겠습니다. 물론 해결할 수있는 것 같습니다. B를 A1에 연결하고 B를 A2에 연결하기 만하면됩니다. 따라서 B는 비디오 / 오디오 스트림을 A1로 직접 보내고 다른 스트림을 A2로 보냅니다. B는 스트림을 두 번 보냅니다.

이제 A1, A2, ..., A10000 등 10000 명의 참석자가 있다고 가정 해 보겠습니다. 이는 B가 10000 개의 스트림을 보내야 함을 의미합니다. 각 스트림은 ~ 40KB / s이며 이는 B가이 브로드 캐스트를 유지하려면 400MB / s의 발신 인터넷 속도가 필요함을 의미합니다. 용납 할 수 없습니다.

원래 질문 (불만)

어떻게 든이 문제를 해결할 수 있습니까? B는 일부 서버에서 하나의 스트림 만 보내고 참석자는이 서버에서이 스트림을 가져옵니다. 예, 이것은이 서버의 나가는 속도가 빨라야하지만 유지할 수 있음을 의미합니다.

아니면 이것이 WebRTC 아이디어를 망치는 것을 의미할까요?

노트

최종 고객의 열악한 UX에 따라 Flash가 내 요구에 맞지 않습니다.

솔루션 (정말 아님)

26.05.2015-현재로서는 미디어 서버를 전혀 사용하지 않는 WebRTC 용 확장 가능한 방송 솔루션이 없습니다. 시장에는 서버 측 솔루션과 하이브리드 (다른 조건에 따라 p2p + 서버 측)가 있습니다.

https://github.com/muaz-khan/WebRTC-Scalable-Broadcast 와 같은 유망한 기술이 있지만 대기 시간, 전반적인 네트워크 연결 안정성, 확장 성 공식 (아마 무한 확장 가능하지 않음) 과 같은 가능한 문제에 답해야합니다. ).

제안

  1. 오디오 및 비디오 코덱을 모두 조정하여 CPU / 대역폭을 줄입니다.
  2. 미디어 서버를 구하십시오.

3
"확장 가능한 앱을 구축하는 유일한 방법은 서버 측 솔루션을 사용하는 것입니다." 꽤 분명해 보입니다. WebRTC는 대규모 방송을위한 것이 아닙니다. 이를 위해 멀티 캐스트를 지원하는 것을 사용하거나 ISP가 멀티 캐스트를 라우팅하지 않으므로 인터넷을 통해 서버 기반 일대일 연결을 사용해야합니다.
Dark Falcon

1
클라이언트에서 서버로 WebRTC를 사용하지 않는 이유는 무엇입니까? 문제는 클라이언트의 연결이 처리 할 수 ​​없다는 점에서 배포 중이므로 하나의 스팀을 서버로 보내고 거기에서 클라이언트로 스트리밍하십시오. 대역폭은 비용이 많이 들지만 각 사용자에게 단일 스트림을 보내거나 사용자가 다른 사용자에게 스트림을 보내도록 할 수는 없습니다.
Dark Falcon

1
webrtc 기반 p2p 비디오 전송을 시도하고있는 회사가 적어도 두 개 있습니다. affovi.com/rtcplayer.html- 대부분은 라이브 비디오 용입니다. 및 peer5.com- 주로 VOD 용입니다.
Svetlin Mladenov 2013 년

1
@igorpavlov 확인하고 싶을 수 있습니다 : github.com/muaz-khan/WebRTC-Scalable-Broadcast 크롬에서만 작동하지만 오디오 방송은 아직 없습니다.
Muaz Khan 2014

4
일종의 MCU 없이는 확장성에 도달 할 방법이 없습니다. WebRTC는 Peer-to-Peer로 설계되었습니다. (인턴이 인코딩되는 또 다른 스트림 인 각 스트림에 대해 고유 한 피어 연결을 사용하여) 브로드 캐스터를 완전히 슬래 밍하지 않고는 브로드 캐스트 할 수 없습니다. 피어 투 피어에서 미디어를 릴레이하는 경우 가능할 수 있지만 물론 나중에 스트림에 추가되는 모든 피어에 대해 추가 대기 시간이 발생합니다. 품질 및 확장 성을 위해 webrtc MCU 서버를 갖는 것이 유일한 현실적인 솔루션입니다.
Benjamin Trent

답변:


66

여기에서 꽤 많이 다루었 기 때문에 여기서하려는 작업은 평범하고 구식 WebRTC (엄격히 P2P)로는 불가능합니다. 앞서 말했듯이 WebRTC 연결은 각 세션에 대해 데이터를 암호화하기 위해 암호화 키를 재협상하기 때문입니다. 따라서 방송사 (B)는 참석자 수만큼 스트림을 업로드해야합니다.

그러나 매우 잘 작동하는 아주 간단한 솔루션이 있습니다. 테스트를 해봤는데 WebRTC 게이트웨이라고합니다. 야누스 는 좋은 예입니다. 완전히 오픈 소스입니다 ( github repo here ).

이것은 다음과 같이 작동합니다 : 방송사 는 WebRTC를 말하는 게이트웨이 (Janus) 에 접속합니다 . 따라서 키 협상이 있습니다. B는 Janus에게 안전하게 (암호화 된 스트림) 전송합니다.

이제 참석자가 연결되면 WebRTC 협상, 보안 키 등 Janus에 다시 연결됩니다. 이제부터 Janus는 각 참석자에게 스트림을 다시 전송합니다.

브로드 캐스터 (B)가 Janus에게 스트림을 한 번만 업로드하기 때문에 이것은 잘 작동합니다. 이제 Janus는 자체 키를 사용하여 데이터를 디코딩하고 원시 데이터 (즉, RTP 패킷)에 액세스 할 수 있으며 해당 패킷을 각 참석자에게 다시 보낼 수 있습니다 (Janus가 암호화를 처리합니다). 그리고 Janus를 서버에 배치했기 때문에 업로드 대역폭이 넓어 여러 피어로 스트리밍 할 수 있습니다.

그래서 그래, 그것은 않는 서버를 포함하지만, 해당 서버의 WebRTC를 말하고, 그것을 당신이 "자신의"당신이 중간에 데이터 손상 또는 사람에 대해 걱정할 필요가 없습니다 그래서 당신은 야누스 부분을 구현합니다. 물론 서버가 손상되지 않는 한. 하지만 할 수있는 일이 너무 많습니다.

사용이 얼마나 쉬운 지 보여주기 위해 Janus 에는 rt (c) p 패킷에 대한 포인터를 제공하는 호출 할 수있는 incoming_rtp()(and incoming_rtcp()) 라는 함수 가 있습니다. 그런 다음 각 참석자에게 보낼 수 있습니다 ( sessionsJanus가 사용하기 쉽게 저장되어 있음). 의 하나의 구현 여기를 봐 incoming_rtp()기능 , 아래 라인의 몇 모든 참석자에게 패킷을 전송하는 방법을 볼 수 있으며, 여기에 당신이 RTP 패킷을 중계하는 실제 기능을 볼 수 있습니다.

모든 것이 잘 작동하며 문서는 읽고 이해하기가 매우 쉽습니다. "echotest"예제로 시작하는 것이 좋습니다. 가장 간단하며 Janus의 내부 작동 방식을 이해할 수 있습니다. 작성해야 할 중복 코드가 많기 때문에 에코 테스트 파일을 직접 편집하여 전체 파일에서 시작하는 것이 좋습니다.

즐기세요! 내가 도왔기를 바랍니다.


1
현재 Safari (또는 WebRTC를 지원하지 않는 브라우저)에서 작동하지 않는다고 말하는 것이 사실입니까? WebRTC를 사용하여 브라우저에서 서버로 브로드 캐스트 한 다음 비디오를 HLS / HDS (또는 RTMP)로 트랜스 코딩하여 기존 브로드 캐스트 시스템에 맞도록하는 하이브리드 솔루션을 아는 사람이 있습니까?
Ben

1
@Ben 예, WebRTC를 지원하지 않는 브라우저에서는 작동하지 않습니다. (내가 이것을 쓸 때) 사파리는 분명히 이것을 지원하지 않았습니다. 그러나 오늘은 확인하지 않았습니다. 그러나 나는 여전히 그들이 WebRTC를 지원하지 않는다고 생각합니다. 하이브리드 시스템에서 사용하는 것은 전적으로 가능합니다. 실제로 제가 근무한 회사에서이 작업을 수행했습니다. 말씀 하셨듯이, 저는 브라우저에서 서버로 브로드 캐스트하고 거기에서 피드를 트랜스 코딩하기 위해 GStreamer 파이프 라인을 구축하고 연결했습니다.
nschoe

jitsi에 대한 어떤 생각? jitisi도 동일합니까?
ishandutta2007

@nschoe websocket을 사용하는 것보다 낫습니까?
Navigateur

실제로 SFU (Selective Forwarding Unit)가 작동하는 방식을 설명하고 있습니다. mediasoup
Dirk V

11

@MuazKhan이 위에서 언급했듯이 :

https://github.com/muaz-khan/WebRTC-Scalable-Broadcast

크롬에서 작동하고 아직 오디오 방송은 없지만 첫 번째 해결책 인 것 같습니다.

확장 가능한 WebRTC P2P 브로드 캐스팅 데모.

이 모듈은 단순히 socket.io를 초기화하고 대역폭 / CPU 사용 문제없이 무제한 사용자를 통해 단일 브로드 캐스트를 중계 할 수 있도록 구성합니다. 모든 것이 피어 투 피어로 발생합니다!

여기에 이미지 설명 입력

이것은 확실히 완료 할 수 있어야합니다.
다른 사람들도 이것을 달성 할 수 있습니다 : http://www.streamroot.io/


1
이 물건은 저에게 약간 구식 인 것 같습니다. 이 아이디어에 대한 업데이트 나 생각이 있습니까?
igorpavlov

또한 대기 시간 문제를 어떻게 해결합니까? 예를 들어 Peer1은 Peer5와 통신하고 Peer2는 결국 연결이 끊어집니다. 아니면이 아키텍처가 LAN에만 적합합니까?
igorpavlov

또한 Streamroot는 Peer5와 비슷합니까?
igorpavlov

7

AFAIK는 관련성이 있고 성숙한 유일한 현재 구현은 Adobe Flash Player이며, 버전 10.1 이후 P2P 비디오 브로드 캐스팅을 위해 p2p 멀티 캐스트를 지원했습니다.

http://tomkrcha.com/?p=1526 .


1
사람들은 기술을 죽이지 않습니다. 이 기술은 특히 마이크 / 카메라를 허용 할 때 매우 열악한 UX를 제공하여 자살하고 있습니다. 그것이 getusermedia가 승리하는 곳입니다.
igorpavlov

더 이상 동의 할 수 없습니다.

나쁜 UX를 제외하고 이것이 해결책이 될까요? 적은 서버?
rubo77 2015-06-03

6

인터넷에서는 IP UDP 멀티 캐스팅이 허용되지 않기 때문에 "확장 가능한"브로드 캐스팅이 불가능합니다. 그러나 이론적으로는 LAN에서 가능합니다.
Websockets의 문제는 의도적으로 RAW UDP에 대한 액세스 권한이 없으며 허용되지 않는다는 것입니다.
WebRTC의 문제점은 데이터 채널이 각 세션에 자체 암호화 키 가있는 SRTP 형식을 사용한다는 것입니다 . 따라서 누군가 "발명"하거나 API 가 모든 클라이언트간에 하나의 세션 키 를 공유 하는 방법을 허용하지 않는 한 멀티 캐스트는 쓸모가 없습니다.


1
그러나 채팅은 이미 WebRTC와 함께 작동하므로 모든 사람이 모든 메시지를 볼 수 있으므로
일대다는

@ rubo77 문자 메시지로 전송 된 데이터는 비디오 스트림으로 전송되는 데이터의 속도와 양에 비하면 아무것도 아닙니다. 따라서 채팅은 한 번에 더 많은 사용자를 쉽게 포함 할 수 있습니다.
Dirk V

5

피어 지원 전달 솔루션이 있습니다. 즉, 접근 방식이 하이브리드입니다. 서버와 피어 모두 리소스를 배포하는 데 도움이됩니다. 이것이 peer5.compeercdn.com 이 취한 접근 방식 입니다.

라이브 방송에 대해 구체적으로 이야기하는 경우 다음과 같이 표시됩니다.

  1. 브로드 캐스터는 라이브 비디오를 서버로 보냅니다.
  2. 서버는 비디오를 저장합니다 (일반적으로 모든 관련 형식으로 트랜스 코딩합니다).
  3. HLS, HDS 또는 MPEG_DASH와 호환되는이 라이브 스트림에 대한 메타 데이터가 생성되고 있습니다.
  4. 소비자는 관련 라이브 스트림을 검색하여 플레이어가 메타 데이터를 얻고 다음에 가져올 비디오 청크를 알고 있습니다.
  5. 동시에 소비자는 WebRTC를 통해 다른 소비자와 연결됩니다.
  6. 그런 다음 플레이어는 서버 또는 피어에서 직접 관련 청크를 다운로드합니다.

이러한 모델을 따르면 라이브 스트림의 비트 전송률과 뷰어의 공동 업 링크에 따라 서버 대역폭의 최대 90 %를 절약 할 수 있습니다.

면책 조항 : 저자는 Peer5에서 일하고 있습니다.


감사합니다. 나는 peer5에 대해 알고 있으며 꽤 매력적인 솔루션이라고 생각합니다. 그러나이 질문의 목적은 절대 서버리스 솔루션을 찾는 것이 었습니다 (STUN / TURN 만 허용됨).
igorpavlov

5

제 석사는 WebRTC를 사용하여 하이브리드 cdn / p2p 라이브 스트리밍 프로토콜 개발에 중점을 둡니다. http://bem.tv에 첫 번째 결과를 게시했습니다.

모든 것이 오픈 소스이며 저는 기여자를 찾고 있습니다! :-)


MCU와 같은 서버 측 소프트웨어를 사용합니까?
igorpavlov

나는 실제로 rtcio 사람들의 일부 서버 측 구성 요소를 사용하고 있습니다. github.com/rtc-io
flavioribeiro

1
신호에 해당 구성 요소를 사용하는 것 같습니다. 서버 측 비디오 스트리밍은 어떻습니까? 아니면 솔루션이 절대적으로 P2P입니까?
igorpavlov 2014 년

@igorpavlov에 대한 답변이 오래 지연되어 죄송합니다. EvoStream을 사용하여 비디오를 분할하고 비디오 소스를 반복하고 Elemental 인코더를 사용하여 EvoStream을 가리 킵니다.
flavioribeiro

미디어 서버 제공 업체입니다. 더 효율적입니까? 아마. 내가 찾고있는 것입니까? No.
igorpavlov

2

Angel Genchev의 대답은 옳은 것 같지만 WebRTC를 통해 짧은 지연 시간 방송을 허용하는 이론적 아키텍처가 있습니다. B (방송 자)가 A1 (참석자 1)에게 스트리밍한다고 상상해보십시오. 그런 다음 A2 (참석자 2)가 연결됩니다. B에서 A2로 스트리밍하는 대신 A1은 B에서 A2로 수신되는 스트리밍 비디오를 시작합니다. A1이 연결 해제되면 A2가 B로부터 수신을 시작합니다.

이 아키텍처는 대기 시간과 연결 시간 초과가없는 경우 작동 할 수 있습니다. 그래서 이론적으로는 옳지 만 실제로는 아닙니다.

현재 서버 측 솔루션을 사용하고 있습니다.


서버 측 솔루션의 스트림 속도는 어떻습니까? 공유 해주세요.
user2003356

서버 측 솔루션이란? 무엇을 사용 했습니까? 내 연구에 도움이 될 것입니다. 공유 해주세요. 감사.
user2003356 2014

서버 측 솔루션은 Tokbox의 Opentok를 의미합니다. 나는 그들을 광고하지 않고 시장에 그러한 솔루션이 많이 있지만 나는 이것을 고수합니다. 미디어 서버처럼 작동합니다. 추신 : 다자간 커뮤니케이션이란 무엇을 의미합니까? 이해가 안 돼요.
igorpavlov 2014

@igorpavlov 서버 측 webrtc를 제공하는 회사 목록을 줄 수 있습니까? Flashphoner와 Opentok 만 알고 있습니다. 감사합니다
Ramil Amerzyanov 2014 년

이것이 실제로 확장되는지 궁금합니다. 엄청난 그룹 (1000+)의 지연 시간에 대한 확장 문제가있을 것입니다.하지만 5-10 개만 있다면 꽤 잘 작동 할 것이라고 생각하지만 피어 "체인의 중간에있는 누군가가 있다면 멋진 발 작업이 필요할 것입니다." "이탈하고 모든 후속 피어를 다시 연결하는 것은 단일 체인 일 경우 엄청난 오버 헤드입니다. 바이너리 / 삼항 트리 구조를 사용하는 것이 더 나을 수 있습니다.
Benjamin Trent

2

WebRTC 확장형 솔루션을 위해 시장에서 사용할 수있는 몇 가지 솔루션이 있습니다. 지연 시간이 짧고 확장 가능한 webrtc 스트리밍을 제공합니다. 다음은 몇 가지 샘플입니다. Janus , Jitsi , Wowza , Red5pro , Ant 미디어 서버

저는 Ant Media Server의 개발자이며 Android 및 iOS SDK를 포함한 커뮤니티 및 엔터프라이즈 에디션을 모두 제공합니다. 어떻게 든 도와 드릴 수 있는지 알려주십시오.


1

일대 다 요구 사항으로 WebRTC 사용을 설명하고 있습니다. WebRTC는 P2P 스트리밍 용으로 설계되었지만 WebRTC의 낮은 지연 시간을 활용하는 동시에 많은 시청자에게 비디오를 제공 할 수있는 구성이 있습니다.

트릭은 스트리밍 클라이언트에 모든 시청자에게 부담을주지 않고 앞서 언급했듯이 "릴레이"미디어 서버를 사용하는 것입니다. 직접 만들 수 있지만 솔직히 가장 좋은 해결책은 종종 Wowza의 WebRTC Streaming 제품 과 같은 것을 사용하는 것 입니다.

휴대폰에서 효율적으로 스트리밍하려면 Wowza의 GoCoder SDK를 사용할 수 있지만 내 경험상 StreamGears 와 같은 고급 SDK 가 가장 잘 작동합니다.


1

Kurento Media Server를 사용하여 WebRTC 방송 시스템을 개발하고 있습니다. Kurento는 RTSP, WebRTC, HLS와 같은 여러 종류의 스트리밍 프로토콜을 지원합니다. 실시간 및 확장 측면에서도 잘 작동합니다.

따라서 Kurento는 현재 Youtube 또는 Twitch에서 사용되는 RTMP를 지원하지 않습니다. 저의 문제 중 하나는 이것과 동시 사용자 수입니다.

도움이 되었기를 바랍니다.


0

peer1은 getUserMedia ()를 호출하는 유일한 피어이므로 peer1은 방을 만듭니다.

  1. 따라서 peer1은 미디어를 캡처하고 공간을 시작합니다.
  2. peer2가 방에 참여하고 peer1에서 스트림 (데이터)을 가져오고 "peer2-connection"이라는 이름의 병렬 연결을 엽니 다.
  3. peer3이 방에 참여하고 peer2에서 스트림 (데이터)을 가져오고 'peer3-connection'이라는 이름의 병렬 연결을 엽니 다.

이 프로세스는 많은 피어가 서로 연결될 때 계속됩니다.

따라서이를 통해 대역폭 / CPU 사용 문제없이 무제한 사용자를 통해 단일 브로드 캐스트를 전송할 수 있습니다.

마지막으로 위의 모든 내용은 Link의 참조입니다 .


1
이 접근 방식은 이미 언급되었지만 실제로는 작동하지 않을 수 있습니다. Peer3로서 Peer2의 대역폭 성능에 관심을 가져야하는 이유는 무엇입니까? 물론 Peer2가 체인을 떠나면 Peer3이 Peer1로 폴백 할 수 있지만, 이로 인해 많은 스트림 중단, 재 연결 등이 발생할 수 있습니다. 체인에 더 많이있을수록 더 많은 고통을 받게됩니다. 예, LAN에서 작동 할 수 있지만 아마도 그럴 것입니다.
igorpavlov

병렬 브로드 캐스팅은 대역폭을 관리하지 않으며, 일단 연결이 peer2를 통해 peer1에 연결되고 peer2가 폴백되면 peer3은 peer1에 연결된 상태로 유지됩니다.
susan097

이해가 잘 안됩니다. 실제로 링크를 언급 한 것이 아니 었습니다. 이제 참조하겠습니다. 이 링크 github.com/muaz-khan/WebRTC-Scalable-Broadcast 에는 "How it works?"에 이미지가 있습니다. 부분. 이 이미지는 Peer5가 연결 해제되고 Peer8,9 및 10이 브로드 캐스트에서 연결 해제되었다고 가정 해 보겠습니다. Peer2 또는 Peer6에 연결해야하지만 이로 인해 지연이 발생합니다. 또한이 프로젝트에는 기여자도 활동도 없습니다.
igorpavlov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.