You need to enable JavaScript to run this app.
导航
发布和订阅 WTN 流
最近更新时间:2025.11.04 10:59:50首次发布时间:2022.04.24 12:01:04
复制全文
我的收藏
有用
有用
无用
无用

适用场景

用户发布 WTN 流以后,使用同一 appID 的用户,无需进入房间,也可以订阅和播放该流。适合大规模的,低延时和低互动需求的音视频场景,例如以下业务。

  • 教育场景,例如千人自习室,台上 1 个老师和少数学生音视频互动,台下其他学生作为观众只订阅,不发布。

  • 电商直播场景,主播端发流,观众端只订阅,不发布。但观众仍可以通过文字和主播进行互动。

前提条件

你已经集成 RTC SDK,实现了基本的音视频通话。

  • Native: 自 v3.37 开始支持
  • Web: 自 v4.41 开始支持

本文档提供的指引信息适用于 Native SDK V3.60 和 Web SDK V4.65 之前的版本。

功能实现

你可以在应用服务端和应用客户端发布 WTN 流。查看调用 OpenAPI 发布 WTN 流。本文将介绍如何在客户端发布和订阅 WTN 流。

说明:不同平台的实现的步骤相同,但接口名称、参数名称可能略有差异。以下指南以 Android RTC SDK 为例,参考对应平台的 API 文档获取更多信息。

发送端

  1. 进房。
    public int joinRoom(String token, UserInfo userInfo, boolean userVisibility, RTCRoomConfig config) {
        return 0;
    }
    

SDK 3.60开始,startPushMixedStream 方法替代了 startPushPublicStreamstartPushMixedStreamToCDN

  1. 调用 startPushMixedStream 开始发布 WTN 流。除指定 taskId 以外,你还需要传入以下参数。
    1. taskId:转推直播任务 ID,长度不超过 126 字节。 当 MixedStreamConfig 中的 PushTargetType = 0 时, 用于标识转推直播任务。你可以在同一房间内发起多个转推直播任务,并用不同的 ID 加以区分。当你需要发起多个转推直播任务时,应使用多个 ID;当你仅需发起一个转推直播任务时,建议使用空字符串。
    2. pushTargetConfig:推流目标配置参数,比如设置推流地址、WTN 流 ID。参看 MixedStreamPushTargetConfig
    3. mixedConfig:转推直播配置参数,比如设置合流的图片、视频视图布局和音频属性。
public int startPushMixedStream(String publicStreamId) {
    MixedStreamPushTargetConfig targetConfig = new MixedStreamPushTargetConfig();
	targetConfig.pushTargetType = MixedStreamPushTargetType.PUSH_TO_WTN;
	targetConfig.pushWTNStreamID = streamID;

	MixedStreamConfig mixedStreamConfig = MixedStreamConfig.defaultMixedStreamConfig();
	mixedStreamConfig.userID = 发起任务的用户ID;
	mixedStreamConfig.roomID = 房间ID;
	//视频相关参数
	mixedStreamConfig.videoConfig.width = 360;
	mixedStreamConfig.videoConfig.height = 640;
	mixedStreamConfig.videoConfig.fps = 15;
	mixedStreamConfig.videoConfig.bitrate = 500000;
	//音频相关参数
	mixedStreamConfig.audioConfig.channels = 2;
	mixedStreamConfig.audioConfig.sampleRate = 48000;
	mixedStreamConfig.audioConfig.bitrate = 64;
	//布局相关参数,以2个用户为例
	mixedStreamConfig.regions = new MixedStreamLayoutRegionConfig[2];
	for (int i = 0; i < 2; ++i) {
		MixedStreamLayoutRegionConfig region = new MixedStreamLayoutRegionConfig();
		region.roomID = 第i个用户所在的房间ID;
		region.userID = 第i个用户的ID;
		region.locationX = 第i个视频所在的左上角横坐标;
		region.locationY = 第i个视频所在的左上角纵坐标;
		region.width = 第i个视频的宽;
		region.height = 第i个视频的高;
		region.alpha = 1;
		region.zOrder = (合成后所在层数);
		region.renderMode = (MixedStreamRenderMode.MIXED_STREAM_RENDER_MODE_HIDDEN);
		region.streamType = (MixedStreamVideoType.MIXED_STREAM_VIDEO_TYPE_MAIN);
		region.mediaType = (MixedStreamMediaType.MIXED_STREAM_MEDIA_TYPE_AUDIO_AND_VIDEO);
		mixedStreamConfig.regions[i] = region;
	}
	return rtcEngine.startPushMixedStream(taskID, targetConfig, mixedStreamConfig);
}
  1. 调用 stopPushMixedStream 停止发布 WTN 流。
public int stopPushMixedStream(String taskId) {
	if (mRtcEngine != null) {
		mRtcEngine.stopPushMixedStream(taskId, MixedStreamPushTargetType.PUSH_TO_WTN);
	}
  return 0;
}

接收端

  1. 调用 setWTNRemoteVideoCanvas 绑定内部视图。需要解绑视图时,把 videoCanvas 设置为空。

如果你需要使用外部渲染器,调用 setWTNRemoteVideoSink 详见自定义视频渲染

public int setWTNRemoteVideoCanvas(String taskID, VideoCanvas canvas) {...}
  1. 调用 subscribeWTNVideoStream 开始订阅 WTN 流。

    注意

    一个客户端最多同时播放 5 路 WTN 流,请及时调用 subscribeWTNVideoStream(subscribe=false) 避免订阅的 WTN 流数量超限。

public int subscribeWTNVideoStream(String streamId, boolean subscribe) {...}
  1. 通过 回调获取 SEI 信息。远端调用 sendSEIMessage 将 SEI 信息插入视频帧中,流中的 SEI 信息将透传并融合到 WTN 流中。
    • WTN 流将透传的 SEI 数据添加到当前视频帧开始的连续 30 个视频帧中,提高 SEI 信息的可靠性。

    • 当多条视频流都包含 SEI 信息时,每条流中的 SEI 信息均将透传到 WTN 流中。 然而, WTN 流中单个视频帧允许携带的 SEI 信息不超过 4 KB。如果合并后的 SEI 信息超过 4 KB,RTC将丢弃超出的部分。例如,组成 WTN 流的三条视频流某视频帧中携带的 SEI 信息分别为 A, B, C,当 A+B+C > 4 KBA+B < 4 KB 时, WTN 流最终携带的 SEI 信息为 A + B

    • 你需要自行实现 SEI信息的处理逻辑。

public void onWTNSEIMessageReceived(String streamId, int channelId, ByteBuffer message) {
    RTCCallEngineController controller = getController();
    String callbackLog = "onPublicStreamSEIMessageReceived[streamid:" + publicStreamId
                    + " sei:" + RtmpUrlUtils.byteBufferToString(message) + "]";);
}
  1. 调用 subscribeWTNVideoStream(subscribe=false) 取消订阅 WTN 流。
// 设置 subscribe = false 来取消订阅 WTN 流。
public int subscribeWTNVideoStream(String streamId, boolean subscribe) {...}

API 参考

平台AndroidiOSMacWindowsWeb
发布 WTN 流startPushMixedStreamstartPushMixedStream:withPushTargetConfig:withMixedConfig:startPushMixedStream:withPushTargetConfig:withMixedConfig:startPushMixedStreamstartPushPublicStream
停止发布 WTN 流stopPushMixedStreamstopPushMixedStream:withPushTargetType:stopPushMixedStream:withPushTargetType:stopPushMixedStreamstopPushPublicStream
更新 WTN 流发布参数updatePushMixedStreamupdatePushMixedStream:withPushTargetConfig:withMixedConfig:updatePushMixedStream:withPushTargetConfig:withMixedConfig:updatePushMixedStreamupdatePublicStreamParam
订阅/取消 WTN 流subscribeWTNVideoStreamsubscribeWTNVideoStream:subscribe:subscribeWTNVideoStream:subscribe:subscribeWTNVideoStreamsatartPlayPublicStream
绑定 WTN 流播放视图setWTNRemoteVideoCanvassetWTNRemoteVideoCanvas:withCanvas:setWTNRemoteVideoCanvas:withCanvas:setWTNRemoteVideoCanvassetPublicStreamVideoPlayer
为 WTN 流绑定外部渲染器setWTNRemoteVideoSinksetWTNRemoteVideoSink:withSink:withConfig:setWTNRemoteVideoSink:withSink:withConfig:setPublicStreamVideoSinkgetPublicStreamTrack
接收 WTN 流中包含的 SEI 信息onWTNSEIMessageReceivedonWTNSEIMessageReceived:andChannelId:andMessage:onWTNSEIMessageReceived:andChannelId:andMessage:onWTNSEIMessageReceivedonPublicStreamSEIMessageReceived