屏幕共享
  • iOS
  • Android
  • macOS : Objective-C
  • Windows
  • Electron
  • 下载
  • 跑通示例源码
  • 快速开始
  • API 文档
  • 常见问题
  • 文档中心
  • 屏幕共享
  • 快速开始
  • 窗口共享

窗口共享

更新时间:2021-09-30 11:25

1 简介

设置成窗口共享后,可以分享桌面不同窗口的内容。

本文主要讲述如何设置窗口共享,详情请参考示例Demo

2 步骤

1. 初始化

/*
设置日志路径和级别
*/
NSString* logpath = @"/Users/**/ZegoScreenCapture/Mac_OSX/ScreenCaptureDemo";

zego_screencapture_set_log_level(kZegoLogLevelDebug, [logpath cStringUsingEncoding:NSASCIIStringEncoding]);

/*
设置捕获错误回调
*/
zego_screencapture_reg_capture_error_notify(zego_screencapture_capture_error_notify , NULL);

/*
设置捕获数据回调
*/
zego_screencapture_reg_captured_frame_available_notify(frame_available_notify, NULL);
/*
初始化
*/
zego_screencapture_init();

2. 设置捕获参数

/*
设置桌面共享的采集帧率,即OnCapturedFrameAvailable每秒回调次数
*/
zego_screencapture_set_fps(framerate);

/*
设置是否同时捕捉光标
*/
zego_screencapture_set_cursor_visible(checked);

/*
设置是否在捕捉到共享画面的同时显示点击动画
*/
zego_screencapture_enable_click_animation(checked);

/*
设置视频采集的格式
*/
//zego_screencapture_set_capture_video_pixel_format(kZegoPixelFormatBGRA32);
zego_screencapture_set_capture_video_pixel_format(kZegoPixelFormatCVImageBuffer);

3.获取捕获窗口

通过枚举窗口来获取窗口

/*
刷新窗口列表,EnumWindowList得到列表数据后深拷贝带走,FreeWindowList与之配对
*/
int windowListLen = 0;
const struct ZegoThumbnailWindowInfo * windowList = zego_windowthumbnail_find_windows(&windowListLen);

for (int i = 0; i < windowListLen; i++)
{
    //NSLog(@"[***] windowID: %d title: %s", windowList[i].handle, windowList[i].title);
    ZegoWindowItem *windowItem = [[ZegoWindowItem alloc] init];
    struct ZegoThumbnailWindowInfo info = windowList[i];
    windowItem.windowID = (CGWindowID)windowList[i].handle;
    windowItem.title = [NSString stringWithUTF8String:(windowList[i].window_title)];
    [self.dataArray addObject:windowItem];
}
//释放窗口列表
zego_screencapture_free_window_list(windowList);

通过缩略图获取窗口

详情见窗口缩略图

4.设置捕获窗口

/*
设置需要捕获的窗口
*/
zego_screencapture_set_target_window(windowItem.windowID);

/*
设置需要过滤的窗口(只有在设置捕获窗口的时候才能过滤窗口。屏幕也当做窗口调用zego_screencapture_set_target_window后调用此方法)
*/
zego_screencapture_set_excluded_windows(windowList,count,YES/NO);

5.开始捕获

/*
启动捕获
*/
zego_screencapture_start_capture();

6.数据接收

void frame_available_notify(void *data, uint32_t length, const struct ZegoScreenCaptureVideoCaptureFormat *video_frame_format, uint64_t reference_time, uint32_t reference_time_scale, void *user_data)
{
    CMTime pts= CMTimeMake(reference_time, reference_time_scale);

    ZegoVideoCaptureScreenFactory *captureFactory = [ZegoAVKitManager shareInstance].captureFactory;
    if (captureFactory)
    {
        if(isCapture)
        //推流 
        [captureFactory.screenDevice captureOutputPixelBuffer:data timeStamp:pts];
    }
}

7.停止捕获

/*
停止捕获
*/
zego_screencapture_stop_capture();
本篇目录