屏幕分享
接口介绍
SDK 支持实时采集屏幕、窗口的画面并以视频的形式发布出去;在预览、发布过程中,视频流的分辨率会根据窗口的大小调整而实时变化;其方法定义在 QNVideoInterface
接口类中,主要如下:
// 屏幕、窗口信息结构体
struct CameraCapability
{
int id; // 窗口 id,唯一标识
std::string title; // 窗口标题
bool is_screen; // 是否是显示器,true:显示器;false:窗口
};
// 获取当前可被抓取的屏幕和窗口的数量(最小化的窗口不支持)
virtual int GetScreenWindowCount() = 0;
// 获取指定序号的屏幕、窗口信息,以 ScreenWindowInfo 的格式返回
// @param index_ 屏幕、窗口序号,0 ~ GetScreenWindowCount()
// @return ScreenWindowInfo 结构体,如果指定窗口不存在,则 ScreenWindowInfo::id 小于 0
virtual ScreenWindowInfo& GetScreenWindowInfo(const int& index_) const = 0;
示例代码
// 获取当前选中窗口的 source id
int source_id(-1);
CString wnd_title;
GetDlgItem(IDC_COMBO_SCREEN)->GetWindowTextW(wnd_title);
for (auto&& itor : _screen_info_map) {
if (itor.second.title.compare(unicode2utf(wnd_title.GetBuffer())) == 0) {
source_id = itor.first;
break;
}
}
if (-1 == source_id) {
return;
}
// 创建对应的视频 TrackInfo, 即 TrackSourceType 为 tst_ScreenCasts 的 TrackInfo
auto video_track_ptr = qiniu_v2::TrackInfo::CreateVideoTrackInfo(
std::to_string(source_id),
SCREENCASTS_TAG,
GetDlgItem(IDC_STATIC_VIDEO_PREVIEW2)->m_hWnd,
640,
480,
30,
500000,
qiniu_v2::tst_ScreenCasts,
false,
false
);
qiniu_v2::TrackInfoList track_list;
track_list.emplace_back(video_track_ptr);
auto ret = _rtc_room_interface->PublishTracks(track_list);
if (ret != 0) {
MessageBox(_T("发布失败,请检查设备状态是否可用?或者不要操作太快!"));
} else {
// 在 QNRoomListener::OnPublishTracksResult 中等待回调通知是否发布成功
}
// 释放 CreateVideoTrackInfo 创建的 TrackInfo
video_track_ptr->Release();
注:创建屏幕采集视频 Track 时,其分辨率尺寸默认写成 640 * 480 即可,实际采集时会以窗口/屏幕的实际尺寸为准;