# 桌面共享
AnyChat提供桌面共享功能:[桌面共享](http://bbs.anychat.cn/forum.php?mod=viewthread&tid=550)
功能的实现原理如下:
1. 内置一个“Native Screen Camera”的摄像头设备
2. 当切换到该设备时便可以实现桌面共享,将本地的桌面图像进行采集传输
3. 其它用户看到的视频便是桌面图像,而不是摄像头的视频
4. 本地桌面数据采集时,会在鼠标周围显示一个绿色的边框,表示桌面共享的区域大小
5. 通过调节本地采集分辩率、码率等参数,可以调节桌面共享的区域大小、视频质量
## 调用示例
### 初始化桌面共享
```
BRAC_SetSDKOption(BRAC_SO_CORESDK_SCREENCAMERACTRL, 1);
```
### 打开桌面共享--切换摄像头方式
```
// 枚举摄像头设备(包括桌面共享虚拟摄像头)
var videoDevices = BRAC_EnumVideoDevices(BRAC_DEVICE_VIDEOCAPTURE);
// 把摄像头切换成桌面共享虚拟摄像头
var screenDevice = videoDevices[videoDevices.length-1]; // 桌面共享摄像头一般为摄像头数组的最后一个
BRAC_SelectVideoCapture(BRAC_DEVICE_VIDEOCAPTURE, screenDevice); // deviceName传桌面共享摄像头的设备名
// 打开本地摄像头
BRAC_UserCameraControl(-1, 1); // 第二个参数表示打开或关闭:1 打开,0 关闭
// 设置视频显示位置
BRAC_SetVideoPos(mSelfUserId, div, 'objectId'); //div为用作显示区域的Div DOM对象,'objectId'为生成的视频插件object的标签id
```
### 打开桌面共享--打开多路流方式
```
// 枚举摄像头设备(包括桌面共享虚拟摄像头)
var videoDevices = BRAC_EnumVideoDevices(BRAC_DEVICE_VIDEOCAPTURE);
// 绑定流号,这里以把桌面共享摄像头绑定为5号流为例
var screenDevice = videoDevices[videoDevices.length-1]; // 桌面共享摄像头一般为摄像头数组的最后一个
BRAC_SetUserStreamInfo(mSelfUserId, 5, BRAC_SO_LOCALVIDEO_DEVICENAME, screenDevice);
// 打开5号流(第三个参数传入视频流号)
BRAC_UserCameraControlEx(mSelfUserId, 1, 5, 0, ""); // 第二个参数表示打开或关闭:1 打开,0 关闭
// 设置5号流显示位置(最后一个参数传入视频流号)
BRAC_SetVideoPos(mSelfUserId, div, 'objectId', 5); //div为用作显示区域的Div DOM对象,'objectId'为生成的视频插件object的标签id
```
*以上两种打开桌面共享方式,按照实际需求和场景选择其中一种即可,本节结尾会扩展介绍切换摄像头与多路音视频输入的区别*
### 桌面共享参数控制
AnyChat开放桌面共享参数控制接口:[桌面共享参数控制](http://bbs.anychat.cn/forum.php?mod=viewthread&tid=2865)
#### 接口定义及控制参数定义
```
// 桌面共享参数控制接口参数
var BRAC_SO_LOCALVIDEO_SCREENFLAGS = 109; // 屏幕采集标志(参数为int型)
// 桌面共享控制参数定义
var ANYCHAT_SCREENSOURCE_FLAGS_DISABLECURSOR = 0x01; // 禁止采集鼠标光标
var ANYCHAT_SCREENSOURCE_FLAGS_DISABLEBORDER = 0x02; // 禁止边框显示
var ANYCHAT_SCREENSOURCE_FLAGS_DISABLETRACE = 0x04; // 禁止鼠标追踪
```
#### 桌面共享控制参数说明
1. 禁止采集鼠标光标:默认采集桌面视频时,会采集鼠标光标,如果不需要在视频上显示鼠标光标(如远程协助场景),则需要迭加该标志位
2. 禁止边框显示:默认情况下,当采集分辨率小于屏幕分辨率时,会在采集区域周围显示一个绿色的边框,如果不需要显示该边框,则可以迭加该标志位去掉边框显示
3. 禁止鼠标追踪:默认情况下,当采集分辨率小于屏幕分辨率时,采集区域会跟随鼠标的移动而移动,如果需要固定采集区域,则可以迭加该标志位
#### 使用示例
```
// 设置某项控制参数
var flag1 = ANYCHAT_SCREENSOURCE_FLAGS_DISABLECURSOR; // 禁止采集光标
BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_SCREENFLAGS, flag1);
// 设置多项控制参数(加起来即可)
var flag2 = ANYCHAT_SCREENSOURCE_FLAGS_DISABLECURSOR + ANYCHAT_SCREENSOURCE_FLAGS_DISABLEBORDER; // 禁止采集光标+禁止边框显示
BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_SCREENFLAGS, flag2);
```
*注意:需要在打开摄像头前调用该接口*
### 扩展介绍:切换摄像头与多路音视频输入的区别
1. 首先,需要认清一件事:**AnyChat所有视频流都是带有流号的,默认使用0号流**
2. 切换摄像头接口(BRAC_SelectVideoCapture)指的是切换0号流的摄像头设备,用户摄像头控制接口(BRAC_UserCameraControl)所操作也是指0号流的摄像头设备
3. 切换摄像头接口比较死板、简单,适用于一次只展示一个视频的场景;多路音视频输入接口比较复杂,灵活,适用于一次需要展示多个视频的场景
多路音视频输入接口的使用及多路视频流情况下的录像可参考:[AnyChat多路音视频显示与录制开发指南](http://bbs.anychat.cn/forum.php?mod=viewthread&tid=3950)