Skip to main content

Dual Stream Mode

Dual stream mode refers to publishing both a high-quality (large) and a low-quality (small) video stream when sharing video resources.

The SDK enables dual stream publishing by default, automatically generating both streams for each video publisher. The small stream's resolution automatically follows the large stream's settings.

tip

In multi-party RTC calls, dual stream mode effectively reduces downstream bandwidth consumption. Subscribers can optionally request the small stream as needed.

The resolution mapping between small and large streams is as follows:

Large Stream ResolutionSmall Stream ResolutionAspect Ratio
176X144176X14411:9
180X180180X1801:1
256X144256X14416:9
240X180240X1804:3
320X180256X14416:9
240X240180X1801:1
320X240240X1804:3
360X360180X1801:1
480X360240X1804:3
640X360256X14416:9
480X480180X1801:1
640X480240X1804:3
720X480240X1803:2
848X480256X1449:5
960X720240X1804:3
1280X720256X14416:9
1920X1080256X14416:9

Enabling/Disabling Dual Stream

Configure dual stream mode during engine initialization by specifying the video setup parameters. When enabled, publishers will automatically generate both streams.

/// Enable dual stream during engine creation
RCRTCVideoSetup videoSetup = RCRTCVideoSetup.create(enableTinyStream: true);
RCRTCEngineSetup engineSetup = RCRTCEngineSetup.create(videoSetup: videoSetup);
engine = RCRTCEngine.create(engineSetup);

/// Disable dual stream during engine creation
RCRTCVideoSetup videoSetup = RCRTCVideoSetup.create(enableTinyStream: false);
RCRTCEngineSetup engineSetup = RCRTCEngineSetup.create(videoSetup: videoSetup);
engine = RCRTCEngine.create(engineSetup);

Configuring Small Stream Properties

When dual stream is enabled, set small stream parameters by passing true to the tiny parameter in setVideoConfig:

RCRTCVideoConfig config = RCRTCVideoConfig.create(
minBitrate: 200,
maxBitrate: 900,
fps: RCRTCVideoFps.fps_15,
resolution: RCRTCVideoResolution.resolution_480_640,
);
engine.setVideoConfig(config, true);

Switching Streams as Subscriber

If remote users enabled dual stream before joining, local subscribers can request either stream via the tiny parameter in subscribe:

/// Subscribe to large stream
engine.subscribe(userId, RCRTCMediaType.audio_video, false);

/// Subscribe to small stream
engine.subscribe(userId, RCRTCMediaType.audio_video, true);