# 桌面共享
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)