全部產品
Search
文件中心

ApsaraVideo Live:Mac端實現螢幕畫面分享

更新時間:Mar 20, 2026

本文將為您介紹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。

  • false表示編碼器會響應他人入會等主要畫面格請求,主要畫面格間隔和設定的值不嚴格匹配。

  • true表示編碼器不響應其他主要畫面格請求,嚴格按照設定的值產生主要畫面格。可能會造成訂閱者首幀變慢。

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];