合流配置
什么是合流转推 RTMP
合流转推 RTMP 就是将房间中用户们已经发布发布的多路音视频流,通过指定的布局合成一路音视频流,然后将这路流以 RTMP 的形式推送到目标 RTMP 服务器。可以用来实现实时音视频云的旁路直播,媒体数据存储等功能。
合流方案介绍
七牛实时音视频云采用的合流方案是服务端合流,客户端只负责发送信令控制各个用户合流画面的位置大小等信息。 所以 SDK 所暴露的合流方法就是控制每个用户在最终合流画面上的大小和位置。 关于合流方案的详细介绍参见 服务端合流
关于 SDK 暴露的合流方法,这里有 2 种可以选用。
- 直接配置每个 Track 的合流参数 addMergeStreamTracks 和 removeMergeStreamTracks
- 使用 SDK 提供的默认模版 setDefaultMergeStream
// 将 2 个 Track 添加到合流中,视频 Track 需要指定 x,y,w,h,stretchMode
await myRoom.addMergeStreamTracks([
{trackId: "xxx", x: 0, y: 0, w: 100, h: 100, stretchMode: "aspectFill" },
{trackId: "xxxxx"}
]);
// 将 2 个 Track 从合流中剔除
await myRoom.removeMergeStreamTracks(["xxx", "xxxx"]);
// 使用默认模版
// 参数是输出画面的宽高
myRoom.setDefaultMergeStream(1280, 720);
SDK 提供了默认的合流模版来供开发者方便地使用合流。合流模版采用的合流逻辑为下面将要讨论的多人连麦场景,即房间中只有一位用户控制合流。所以使用的过程中请确保房间中只有一个用户调用默认合流模版。
默认模版的逻辑是将房间中所有的音视频流都添加到合流中,对于视频画面的布局,默认模版的逻辑是 充满画面 和 尽量等分,当房间内出现流状态更新时也会自动地更新合流画面,只需调用一次即可。
在使用合流模版的过程中,如果有更换控制合流用户的需求,只需要让旧的合流用户退出房间,新的用户直接再次调用合流模版即可。
如果您不想使用默认模版,接下来讨论自己控制各个 Track 合流配置的方案。首先,SDK 没有对合流做任何的权限控制,这意味着任意一个用户都能够通过调用 SDK 的合流接口来控制房间其他用户的合流配置。所以针对不同的场景,可以使用不同的控制方案来实现合流,这里我们讨论三种主要的情况。
合流场景-主播观众一对一连麦
在这种场景下,房间中固定只有 2 个用户,一个为主播一个为观众。一般来说这种情况下布局已经是固定的了,主播占据画面主部分,观众占据画面附部分。所以完全可以在端上通过判断当前用户角色直接调用自己角色相应的合流配置。即每个用户自己通过角色来控制自己的合流配置。
if (当前用户是主播) {
await myRTC.addMergeStreamTracks({...主播的合流配置...})
} else {
await myRTC.addMergeStreamTracks({...观众的合流配置...})
}
合流场景-多人连麦
在多人连麦的场景下整个合流过程就显得比较复杂了。如果类似于一对一连麦的方案,让各个用户控制自己的合流配置,面对房间中随时会出现的用户离开/用户加入等情况,整个的合流布局就可能会因此发生变动。也就是说,一个用户的 加入/离开 可能会导致多个用户的合流配置需要更新,在这种情况下,我们不推荐单个用户控制自己的合流配置,转而让一个用户去控制房间中所有用户的合流配置可能是更好的方案。
我们的合流模版使用的也是这种方案,所以调用合流模版时需要确保房间中只有一个人调用。在这种设计下,让一个用户去监听房间所有的流状态事件,统一控制布局来控制这个房间所有用户的合流画面。
大家可能会发现,负责合流的用户在这个设计中扮演重要的角色,如果负责合流的用户退出,如何继续连麦?在这里,我们也分为 2 种情况讨论
有房主概念的多人连麦
在这种场景前提下,房间会有一个房主的概念,房主退出房间关闭。所以在这种场景下,直接使用上文中多人连麦的逻辑就可以了,即将房主设置成负责合流的用户,当房主退出,就直接关闭房间就好。
无房主概念的多人连麦(视频会议等)
在这种场景下,就会面临着负责合流的用户可能会退出的问题。事实上,就算负责合流的用户退出,合流也不会停止(除非调用 stopMergeStream)。所以,我们只需要重新选择一个房间内的用户来掌管合流权限就能无缝的继续控制合流画面更新。
在这里,重新选择房间内用户来控制合流权限就需要业务服务器的配合了,在合流权限交接的过程中,必须要保证 2 点。
- 交接前后房间中只能有一人控制合流
- 交接过程同时需要提供一定的信息,使得新合流用户可以复现当前的合流布局
这里再多说一句,因为 SDK 合流控制本身并没有太多的限制和要求,所以上述 2 种方案仅仅是其中一种解决方案,在有业务服务器的配合下,完全可以根据自己的实际业务需求定制自己的合流逻辑。