本文將為您介紹Mac端如何?螢幕畫面分享。
功能介紹
螢幕畫面分享功能允許使用者在視訊通話、直播過程中將自己的螢幕內容即時分享給頻道內的其他使用者,實現資訊的即時共用與可視化交流。
前提條件
在實現螢幕畫面分享前,請確保達成以下條件:
注意事項
ARTC 7.6 版本之前開啟螢幕畫面分享之前需要入會,入會流程請參考實現音視訊通話。
7.6版本之後不需要入會就可以開啟螢幕畫面分享,建議先設定
AliEngineScreenShareConfig.isPushStream為FALSE,待入會之後設定為TRUE,調用updateScreenShareConfig開啟推流。
功能實現
1.配置螢幕畫面分享編碼參數
如果需要自訂螢幕畫面分享視頻流的編碼屬性,可以調用setScreenShareEncoderConfiguration介面進行配置,包含解析度、幀率、碼率、GOP、視頻旋轉方向。
該介面在加入頻道前後均可配置,如果每次入會只需要設定一次螢幕流視頻編碼屬性,建議在入會前調用。
如果需要更新配置,可以多次調用該介面。
相關配置如下:
參數名 | 參數說明 | 預設值 |
dimensions | 視頻解析度。 | 0x0,表示推流解析度跟隨螢幕採集的解析度。最大取值為3840x2160。 |
frameRate | 視訊框架率。 | 預設幀率為 5,最大取值為 30。 |
bitrate | 視頻編碼碼率(Kbps)。 注意:碼率設定根據解析度和幀率有對應的合理範圍,該值設定在合理範圍內有效,否則SDK會自動調節碼率到有效值。 | 512 |
keyFrameInterval | 主要畫面格間隔,GOP。單位為毫秒(ms)。 | 預設值0,表示SDK內部控制主要畫面格間隔。 |
forceStrictKeyFrameInterval | 是否強制編碼器嚴格按照設定的主要畫面格間隔產生主要畫面格。 | 預設值為 false。
|
rotationMode | 推流旋轉。 | 預設值為 AliEngineRotationMode_0。可選擇 0、90、180、270 四個角度。 |
範例程式碼如下:
/*
config 為客戶定義的配置結構體
*/
AliRtcScreenShareEncoderConfiguration * encoderConfig = [[AliRtcScreenShareEncoderConfiguration alloc] init];
encoderConfig.dimensions = CGSizeMake( width_, height_);
encoderConfig.frameRate = frameRate_; // 5/10/15...
encoderConfig.bitrate = bitrate_; // 1200...
encoderConfig.rotation = AliRtcRotationMode_0; // 0/90/180/270
encoderConfig.keyFrameInterval = keyFrameInterval_; // 1/2/3秒
if (keyFrameInterval_ > 0) {
encoderConfig.forceStrictKeyFrameInterval = TRUE;
}
encoderConfig.forceStrictKeyFrameInterval = forceStrictKeyFrameInterval_;
[self.mainEngine setScreenShareEncoderConfiguration: encoderConfig];2.設定螢幕畫面分享畫面預覽
如果需要預覽螢幕畫面分享畫面,請調用setLocalViewConfig為螢幕畫面分享流(AliEngineVideoTrackScreen)配置顯示視圖。
AliVideoCanvas *canvas = [[AliVideoCanvas alloc]init];
canvas.mirrorMode = _mirrorButton.state == NSControlStateValueOn ? AliRtcRenderMirrorModeAllEnabled:AliRtcRenderMirrorModeAllDisabled;
canvas.view = renderView;
int rv = [self.mainEngine setLocalViewConfig:canvas forTrack:AliRtcVideoTrackScreen];3. (遠端)觀看螢幕畫面分享
如果需要觀看遠端使用者的螢幕畫面分享畫面,可以在onRemoteTrackAvailableNotify回調中為螢幕畫面分享畫面setRemoteViewConfig設定顯示視圖。
- (void)onRemoteTrackAvailableNotify:(NSString *)uid audioTrack:(AliRtcAudioTrack)audioTrack videoTrack:(AliRtcVideoTrack)videoTrack {
/* 主線程處理UI組件 */
dispatch_async(dispatch_get_main_queue(), ^{
AliVideoCanvas *canvas = [[AliVideoCanvas alloc]init];
if ( videoTrack == AliRtcVideoTrackScreen ) {
canvas.view = self._screenshareView;
int rv = [self.mainEngine setLocalViewConfig:canvas forTrack:AliRtcVideoTrackScreen];
} else {
/* 尋找該使用者對應的view */
canvas.view = self.findView(uid);
int rv = [self.mainEngine setLocalViewConfig:canvas forTrack:AliRtcVideoTrackScreen];
}
});
}
4. 枚舉所有可共用的案頭
調用getScreenShareSourceInfoWithType擷取可共用的視窗或案頭列表。
這個時候會有系統彈窗要求使用者開啟許可權,如果使用者不開啟後續共用都會報錯!
_screenInfoArray = [self.engine getScreenShareSourceInfoWithType:AliRtcScreenShareDesktop];
/* 添加到列表上 */
if (_screenInfoArray) {
for (AliRtcScreenSourceInfo *info in _screenInfoArray) {
//名稱+id
NSString *showString = [NSString stringWithFormat:@"%@+%@",info.sourceName,info.sourceId];
[_screenListBox addItemWithObjectValue:showString];
}
}
5. 開啟螢幕畫面分享
調用 startScreenShareWithDesktopId開啟螢幕畫面分享。
注意:需要配置 config.isPushStream,
AliRtcScreenShareConfig *config = [[AliRtcScreenShareConfig alloc]init];
/* 如果需要地區分享 */
if ( shareRegion ) {
config.isShareByRegion = TRUE ;
AliRtcScreenShareRegion *region = [[AliRtcScreenShareRegion alloc]init];
region.originX = regionRect.origin.x;
region.originY = regionRect.origin.y;
region.width = regionRect.size.width;
region.height = regionRect.size.height;
config.shareRegion = region;
} else {
config.isShareByRegion = FALSE;
}
/* 如果需要立刻推流,設定為true,否則設定為FALSE,
後面再調用updateScreenShareConfig */
if ( pushStream ) {
config.isPushStream = TRUE ;
} else {
config.isPushStream = FALSE ;
}
/* 設定案頭ID, 從_screenListBox擷取id */
int idValue = [[_screenInfoArray[_screenListBox.indexOfSelectedItem] sourceId] intValue] ;
int r = [self.engine startScreenShareWithDesktopId:idValue config:config];
NSLog(@"startScreenShareWithDesktopId:%d",r);
if ( r != 0 ) {
// 錯誤提示
}
6. (可選)更新配置
如果需要更新螢幕畫面分享的配置,可以調用updateScreenShareConfig進行。
AliRtcScreenShareConfig *config = [[AliRtcScreenShareConfig alloc]init];
/* 如果需要地區分享 */
if ( share_region ) {
config.isShareByRegion = TRUE ;
AliRtcScreenShareRegion *region = [[AliRtcScreenShareRegion alloc]init];
region.originX = regionRect.origin.x;
region.originY = regionRect.origin.y;
region.width = regionRect.size.width;
region.height = regionRect.size.height;
config.shareRegion = region;
} else {
config.isShareByRegion = FALSE;
}
/* 如果需要立刻推流,設定為true,否則設定為FALSE,
後面再調用updateScreenShareConfig */
if ( pushStream ) {
config.isPushStream = TRUE ;
} else {
config.isPushStream = FALSE ;
}
[self.engine updateScreenShareConfig:mScreenConfig];7. 停止螢幕畫面分享
[self.engine stopScreenShare];多視窗共用
配置預覽視窗、預覽和推流這些基本邏輯和上面的螢幕畫面分享一致,這裡就不單獨列出代碼。
1. 顯示所有可共用視窗
根據業務需求,選擇調用startScreenShareWithWindowId來共用對應視窗或者案頭。
_windowInfoArray = [self.engine getScreenShareSourceInfoWithType:AliRtcScreenShareWindow];
/* 顯示到listBox上 */
if (_windowInfoArray) {
for (AliRtcScreenSourceInfo *info in _windowInfoArray) {
//名稱+id
NSString *showString = [NSString stringWithFormat:@"%@+%@",info.sourceName,info.sourceId];
[_windowsListBox addItemWithObjectValue:showString];
}
}
2. 共用指定視窗
AliRtcScreenShareConfig *config = [[AliRtcScreenShareConfig alloc]init];
/* 如果需要地區分享 */
if ( shareRegion ) {
config.isShareByRegion = TRUE ;
AliRtcScreenShareRegion *region = [[AliRtcScreenShareRegion alloc]init];
region.originX = regionRect.origin.x;
region.originY = regionRect.origin.y;
region.width = regionRect.size.width;
region.height = regionRect.size.height;
config.shareRegion = region;
} else {
config.isShareByRegion = FALSE;
}
/* 如果需要立刻推流,設定為true,否則設定為FALSE,
後面如果配置好,可以再次調用updateScreenShareConfig修改推流標記 */
if ( pushStream ) {
config.isPushStream = TRUE ;
} else {
config.isPushStream = FALSE ;
}
/* 設定案頭ID, 從_windowsListBox中擷取id */
int idValue = [[_windowInfoArray[_windowsListBox.indexOfSelectedItem] sourceId] intValue] ;
int r = [self.engine startScreenShareWithWindowId:idValue config:config];
NSLog(@"startScreenShareWithWindowId:%d",r);
if ( r != 0 ) {
// 錯誤提示
}
3.停止分享對應視窗或者案頭
調用stopScreenShare停止分享。
[self.mainEngine stopScreenShare];