视频大小流功能介绍
视频大小流
功能介绍
当用户 A 开启大流时,会发送多个不同分辨率的视频码流到服务端;此时,不同的用户需要订阅 A 的视频流时可以根据自己的需要或者服务端的策略来订阅到不同质量的视频流。
开启大小流
通过接口 QNTrackInfo
中的 multi_stream_enable
来启用大小流功能:
static QNTrackInfo* CreateVideoTrackInfo(
const string& camera_device_id_,
const string& tag_,
void* render_hwnd_,
int width_,
int height_,
int max_fps_,
int max_bitrate_,
TrackSourceType type_,
bool is_master_ = false,
bool multi_stream_enable_ = false // 是否开启多流功能,默认为 false
);
开启大小流功能后,发送端可以根据统计信息回调 OnStatisticsUpdated
来感知发送情况。
订阅大小流
当对方有开启大小流时,订阅端可以通过 QNRoomInterface
中的 OnSubscribeTracksResult
获取流信息。
1 订阅时指定特定流
在获到大小流信息后,可以通过以下代码来在订阅 Track 时指定特定流:
// 指定订阅 QNTrackProfile.HIGH
for (auto&& itor : track_list_) {
auto tmp_track_ptr = qiniu_v2::QNTrackInfo::Copy(itor);
// 默认订阅的 profile 为 HIGH
if (tmp_track_ptr->GetKind().compare("video") == 0) {
for (auto&& layeritor : tmp_track_ptr->GetLayerInfo())
{
if (layeritor.mProfile == qiniu_v2::HIGH) {
layeritor.mChooseToSub = true;
}
}
}
}
_rtc_room_interface->SubscribeTracks(sub_tracks_list);
2 订阅后切换特定流
当订阅有大小流的 Track 后,可以根据需要需要来切换另外质量的流:
qiniu_v2::QNTrackProfile video_profile = qiniu_v2::QNTrackProfile::HIGH;
for (auto&& itor : _remote_tracks_map) {
if (itor.second->track_info_ptr->GetKind().compare("video") == 0) {
auto tmp_track_ptr = qiniu_v2::QNTrackInfo::Copy(itor.second->track_info_ptr);
for (auto&& layer_itor : tmp_track_ptr->GetLayerInfo()) {
if (layer_itor.mProfile == video_profile) {
layer_itor.mChooseToSub = true;
}
}
sub_tracks_list.emplace_back(tmp_track_ptr);
}
}
_rtc_room_interface->UpdateSubscribeTracks(sub_tracks_list);
当切换完成后,将通过回调 QNRoomListener#OnSetSubscribeTracksProfileResult
告知:
void CRtcDemoV2::OnSetSubscribeTracksProfileResult(
int error_code_,
const string& error_str_,
const qiniu_v2::TrackInfoList& track_list_
)
{
// 切换 profile 后,将对应的生效状态 mActive 置为 true。
for (auto&& itor : track_list_)
{
auto tmp_itor = _remote_tracks_map.find(itor->GetTrackId());
if (tmp_itor == _remote_tracks_map.end()) {
continue;
}
if (tmp_itor->second->track_info_ptr->GetKind().compare(VIDEO_KIND_TYPE) == 0) {
for (auto&& layer_itor : itor->GetLayerInfo())
{
if (layer_itor.mActive) {
for (auto&& cur_itor : tmp_itor->second->track_info_ptr->GetLayerInfo()) {
if (layer_itor.mProfile == cur_itor.mProfile) {
cur_itor.mActive = true;
if (cur_itor.mProfile == qiniu_v2::HIGH) {
((CComboBox*)GetDlgItem(IDC_COMBO_SUBSCRIBE_PROFILE))->SetCurSel(0);
} else if (cur_itor.mProfile == qiniu_v2::MEDIUM) {
((CComboBox*)GetDlgItem(IDC_COMBO_SUBSCRIBE_PROFILE))->SetCurSel(1);
} else if (cur_itor.mProfile == qiniu_v2::LOW) {
((CComboBox*)GetDlgItem(IDC_COMBO_SUBSCRIBE_PROFILE))->SetCurSel(2);
}
} else {
cur_itor.mActive = false;
}
cur_itor.mChooseToSub = false;
}
}
}
}
}
for (auto&& itor : track_list_) {
itor->Release();
}
}
注意事项
- 开启大小流功能设置编码宽高最低为 1280 x 720
- 目前只支持对在发送端使用单路视频 Track 时开启大小流功能
- 保持
TCC
- 对于开启大小流的用户,建议保证有良好的网络环境,保证多流发送质量