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

屏幕共享

更新时间:2023-03-02 16:45

1 简介

本产品为旧版产品,实时音视频已提供更为全面且强大的屏幕共享功能。

设置成屏幕共享后,在多显示器下可以根据屏幕名称共享不同的显示器内容。

本文主要讲述如何设置屏幕共享,详情请见 示例 Demo

2 采集调用流程

1 初始化

请确保在初始化之后,再注册回调通知,否则会导致收不到回调数据。

/*
初始化
*/
zego_screencapture_init();

/*
日志路径
*/
NSString* logpath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/ZegoScreenCaptureLogFile"];   
/*
设置日志级别和路径
*/
zego_screencapture_set_log_level(4, [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_set_log_level 方法,设置自定义日志路径 logpath ,屏幕采集才会生成相关日志。

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 获取捕获屏幕

通过枚举屏幕来获取屏幕名称

/*
 刷新屏幕列表,EnumScreenList 得到列表数据后深拷贝带走,FreeScreenList 与之配对
*/
   int screenListLen = 0;
    const struct ZegoScreenCaptureScreenItem *screenList = zego_screencapture_enum_screen_list(&screenListLen);

    for(int i = 0; i < screenListLen; ++i)
    {
        //NSLog(@"[***] screenID: %d, isPrimary: %d", screenList[i].name, screenList[i].is_primary);
        ZegoScreenItem *screenItem = [[ZegoScreenItem alloc] init];
        screenItem.screenID = (CGDirectDisplayID)screenList[i].name;
        screenItem.isPrimary = screenList[i].is_primary;

        [self.m_screenList addObject:screenItem];
    }
    zego_screencapture_free_screen_list(screenList);

通过窗口缩略图来获取屏幕名称

详情请参见 窗口缩略图

4 设置捕获屏幕

/*
若选择分享整个屏幕,则将当前设置的屏幕screenID传入
*/
zego_screencapture_set_target_screen([_m_screenList objectAtIndex:0].screenID);

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();

3 采集和推流调用时序图

本篇目录