视频大小流
功能介绍
当用户 A 开启大流时,会发送多个不同分辨率的视频码流到服务端;此时,不同的用户需要订阅 A 的视频流时可以根据自己的需要或者服务端的策略来订阅到不同质量的视频流。
开启大小流
通过接口 QNTrackInfoBuilder#enableMultiStream
来启用大小流功能:
public abstract QNTrackInfoBuilder enableMultiStream(boolean enable);
开启大小流功能后,发送端可以根据统计信息回调 onStatisticsUpdated
来感知发送情况。
订阅大小流
当对方有开启大小流时,订阅端可以通过 QNRTCEngineEventListener#onRemotePublished
中的QNTrackInfo#getSubConfigures
获取流信息。
1 订阅时指定特定流
在获到大小流信息后,可以通过以下代码来在订阅 Track 时指定特定流:
# 指定订阅 QNTrackProfile.MEDIUM
QNTrackInfo targetTrack = remoteTracks.get(id);
if (targetTrack.getSubConfigures() != null && targetTrack.getSubConfigures().size() > 0) {
for (QNTrackSubConfiguration conf : targetTrack.getSubConfigures()) {
if (conf.getProfile().equals(QNTrackProfile.MEDIUM)) {
conf.setChooseToSub(true);
} else {
conf.setChooseToSub(false);
}
}
}
mQNRTCEngine.subscribeTracks(Collections.singletonList(targetTrack));
2 订阅后切换特定流
当订阅有大小流的 Track 后,可以根据需要需要来切换另外质量的流:
QNTrackInfo targetTrack = mRemoteTrackInfos.get(id);
# choose 表示用户需要切换的流 QNTrackProfile
for (QNTrackSubConfiguration layer : targetTrack.getSubConfigures()) {
if (layer.getProfile().equals(choose.getProfile())) {
layer.setChooseToSub(true);
} else {
layer.setChooseToSub(false);
}
}
mQNRTCEngine.updateSubscribeTracks(Collections.singletonList(targetTrack));
当切换完成后,将通过回调 QNRTCEngineEventListener#onSubscribedProfileChanged
告知:
public void onSubscribedProfileChanged(String user, List<QNTrackInfo> trackInfoList) {
for (QNTrackInfo trackInfo : trackInfoList) {
for (QNTrackSubConfiguration config : trackInfo.getSubConfigures()) {
if (config.isProfileSubscribed()) {
Log.i(TAG, "subscribed " + config.getProfile());
break;
}
}
}
}
注意事项
- 开启大小流功能设置编码宽高最低为 1280 x 720
- 目前仅支持在发送端发布单路视频 track 的场景下,使用大小流功能
- 大小流场景下,需要保证固定分辨率
QNRTCSetting#setMaintainResolution
选项的开启 - 保持
BWEPolicy.TCC
,可通过QNRTCSetting#setBWEPolicy
设置 - 对于开启大小流的用户,建议保证有良好的网络环境,保证多流发送质量