Simulcast
Simulcast는 비디오를 다양한 화질로 송신하고, 네트워크 상황에 따라 적절한 화질을 선택하여 수신하는 기능입니다.
자세한 설명은 아래 WebRTC Glossary를 참고해주십시오.
Simulcast - WebRTC Glossary
WebRTC Glossary

지원범위

방송과 그룹통화만 simulcast를 지원합니다. 1:1 통화는 simulcast를 지원하지 않습니다. Simulcast는 비디오만 관여하고, 오디오는 관여하지 않습니다.
플랫폼
지원
Web - 송출
O
Web - 수신
O
Android - 송출
O (SDK v2.6.3 이상)
Android - 수신
O
iOS - 송출
O (SDK v2.6.15 이상)
iOS - 수신
O
아래와 같이 코덱을 지원합니다. 권장하는 코덱은 VP8 입니다.
코덱
지원여부
VP8
O
VP9
X
AV1
X
H.264
O
웹 브라우저는 최신 Chrome, Firefox를 지원합니다. WebRTC를 지원하는 여타 웹 브라우저에서 simulcast가 동작할 수 있습니다.

규격

송출 시 선택할 수 있는 해상도는 Capture resolution 컬럼의 값을 참고하십시오.
수신 시 선택되는 해상도는 송출 해상도와 layer 선택(HIGH, MEDIUM, LOW)에 따라 정해집니다. Layer 선택은 아래 "수신" 섹션에서 설명합니다.
Capture resolution
LOW
MEDIUM
HIGH
1920x1080
320x180
640x360
1920x1080
1280x720
320x180
640x360
1280x720
960x540
under 320x180
480x270
960x540
640x360
under 320x180
640x360
disabled
480x270
under 320x180
480x270
disabled
320x180
320x180
disabled
disabled

Simulcast 내부에 대해 자세히 알고 싶으면, 아래 소스코드를 참고하시기 바랍니다.
1
struct SimulcastFormat {
2
int width;
3
int height;
4
// The maximum number of simulcast layers can be used for
5
// resolutions at |widthxheigh|.
6
size_t max_layers;
7
// The maximum bitrate for encoding stream at |widthxheight|, when we are
8
// not sending the next higher spatial stream.
9
int max_bitrate_kbps;
10
// The target bitrate for encoding stream at |widthxheight|, when this layer
11
// is not the highest layer (i.e., when we are sending another higher spatial
12
// stream).
13
int target_bitrate_kbps;
14
// The minimum bitrate needed for encoding stream at |widthxheight|.
15
int min_bitrate_kbps;
16
};
17
// These tables describe from which resolution we can use how many
18
// simulcast layers at what bitrates (maximum, target, and minimum).
19
// Important!! Keep this table from high resolution to low resolution.
20
// clang-format off
21
const SimulcastFormat kSimulcastFormats[] = {
22
{1920, 1080, 3, 5000, 4000, 800},
23
{1280, 720, 3, 2500, 2500, 600},
24
{960, 540, 3, 900, 900, 450},
25
{640, 360, 2, 700, 500, 150},
26
{480, 270, 2, 450, 350, 150},
27
{320, 180, 1, 200, 150, 30},
28
{0, 0, 1, 200, 150, 30}
29
};
Copied!

Chrome의 simulcast 구현

media/engine/simulcast.cc - external/webrtc - Git at Google

Firefox의 simulcast 구현

https://hg.mozilla.org/mozilla-central/file/default/media/webrtc/trunk/webrtc/media/engine/simulcast.cc
hg.mozilla.org

송출 (beta)

송출 시 아래와 같이 simulcast: true설정을 적용합니다.
Web
Android
iOS - Swift
iOS - ObjC
1
const config = {
2
rtc: {
3
simulcast: true
4
},
5
media : {
6
video : {
7
width: 1280,
8
height: 720
9
}
10
}
11
}
12
13
const remon = new Remon({ config })
Copied!
1
// sdk v2.6.3 부터 지원
2
// RemonCast
3
RemonCast.builder()
4
.context( android_context )
5
.videoCodec( "VP8" )
6
.videoWidth( 1920 )
7
.videoHeight( 1080 )
8
.simulcast( true )
9
.build();
10
11
// RemonConference
12
var remonConferece = RemonConference()
13
remonConference.create {
14
it.context( android_context )
15
.videoWidth( 1920 )
16
.videoHeight( 1080 )
17
.videoCodec( "VP8" )
18
.simulcast( true )
19
}.then{
20
}.close{
21
}
Copied!
1
// sdk v2.6.15 부터 지원
2
// RemonCast
3
let remonCast = RemonCast()
4
remonCast.videoWidth = 1920
5
remonCast.videoHeight = 1080
6
remonCast.videoCodec = "VP8"
7
remonCast.simulcast = true
8
9
// RemonConference
10
var remonConference = RemonConference()
11
remonConference.create{ participant in
12
participant.videoWidth = 1920
13
participant.videoHeight = 1080
14
participant.videoCodec = "VP8"
15
participant.simulcast = true
16
}.then{ channel in
17
}.close{
18
}.error{ error in
19
}
20
Copied!
1
// sdk v2.6.15 부터 지원
2
RemonCast *remonCast = [RemonCast new];
3
remonCast.videoWidth = 1920;
4
remonCast.videoHeight = 1080;
5
remonCast.videoCodec = "VP8";
6
remonCast.simulcast = true;
Copied!
Web SDK는 fps를 낮추어 정해진 대역폭에서 움직임을 떨어뜨리고 고화질의 이미지를 보여주거나 maxBandwidth를 낮추어 저화질의 이미지를 보여주는 등의 최적화를 시도할 수 있습니다. 이런 설정은 추가적인 인코더의 연산을 일으키므로 가급적 변경하지 않는 것이 좋습니다. 필요하다면 입력장치의 설정을 변경하는 것이 좋습니다. Android, iOS SDK는 fps, maxBandwidth 등 세부적인 조절은 불가능하며, 내부에 설정된 기준대로만 화질이 선택됩니다.
Simulcast를 적용한 송출은 모바일 기기의 CPU, 배터리 사용량을 다소 높이는 점에 유의하십시오.

수신 (beta)

수신 시 아래와 같이 Simulcast layer를 선택합니다. 선택지는 HIGH, MEDIUM, LOW입니다.
Web
Android
iOS - Swift
iOS - ObjC
1
const remon = new Remon()
2
3
remon.setVideoQulity('HIGH')
4
remon.setVideoQulity('LOW')
Copied!
1
// RemonCast
2
remonCast.switchSimulcastLayer( "HIGH" ); // "HIGH", "MEDIUM", "LOW"
3
4
// RemonConference
5
var participant = remonConference.getClient(1) as RemonParticipant
6
participant.switchSimulcastLayer( "LOW" )
Copied!
1
// RemonCast
2
let remonCast = RemonCast()
3
remonCast.switchSimulcastLayer(bandwidth:.HIGH) // .HIGH || .MEDIUM || .LOW
4
5
// RemonConference
6
let participant = remonConference.getClient(index: 1 )
7
participant?.switchSimulcastLayer(bandwidth:.LOW)
Copied!
1
// 2.4.21 부터 지원
2
RemonCast *remonCast = [RemonCast new];
3
4
// .HIGH || .MEDIUM || .LOW
5
[remonCast switchSimulcastLayerWithBandwidth:objc_RemonBandwidth.HIGH];
Copied!
SDK는 fps, 비디오 특성 등을 참고하여 자동으로 낮은 화질로 변경합니다. 자동으로 높은 화질로 변경하지는 않습니다. 높은 화질로 변경은 앱의 특성에 따라 개발사가 구현하시길 권합니다.
Last modified 1yr ago