实现屏幕共享说明 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 为客户定义的配置结构体
*/
AliEngineScreenShareEncoderConfiguration encoderConfig;
encoderConfig.dimensions = AliEngineVideoDimensions(config.dimensions.width, config.dimensions.height);
encoderConfig.frameRate = (AliEngineFrameRate)config.frameRate;
encoderConfig.bitrate = (int)config.bitrate;
encoderConfig.rotationMode = (AliEngineRotationMode)config.rotationMode;
encoderConfig.keyFrameInterval = (int)config.keyFrameInterval;
encoderConfig.forceStrictKeyFrameInterval = config.forceStrictKeyFrameInterval;
mpEngine->setScreenShareEncoderConfiguration(canvas, AliEngineVideoTrackScreen);2. 设置屏幕共享画面预览如果需要预览屏幕共享画面,请调用SetLocalViewConfig为屏幕共享流(AliEngineVideoTrackScreen)配置显示视图。
AliEngineVideoCanvas canvas;
canvas.renderMode = AliEngineRenderModeFill;
/* 配置好显示的窗口句柄 */
canvas.displayView = (void*)hWnd;
canvas.scaleMode = AliEngineVideoScale_16_9;
mpEngine->SetLocalViewConfig(canvas, AliEngineVideoTrackScreen);3. (远端)观看屏幕共享如果需要观看远端用户的屏幕共享画面,可以在OnRemoteTrackAvailableNotify回调中为屏幕共享画面SetRemoteViewConfig设置显示视图。
void ARTCEventListernerImpl::OnRemoteTrackAvailableNotify(const char *uid,
AliEngineAudioTrack audioTrack,
AliEngineVideoTrack videoTrack) {
char logBuffer[MAX_LOG_STRING_SIZE];
snprintf(logBuffer, USE_LOG_STRING_SIZE, "user %s push video=%d audio=%d", uid, videoTrack, audioTrack);
SendMessageA(this->mLogHandle, LB_ADDSTRING, WPARAM(), (LPARAM)logBuffer);
mDlg->HandleTrackChangeEvent(uid, audioTrack, videoTrack);
}
void CARTCExampleDlg::HandleTrackChangeEvent(const char *uid,
AliEngineAudioTrack audioTrack,
AliEngineVideoTrack videoTrack) {
if ((videoTrack & AliEngineVideoTrackScreen) > 0) {
if ((videoTrack & AliEngineVideoTrackCamera) == 0) {
AliEngineVideoCanvas canvas;
canvas.displayView = nullptr;
mEngine->SetRemoteViewConfig(canvas, uid, AliEngineVideoTrackCamera);
}
{
AliEngineVideoCanvas canvas;
canvas.displayView = mRemoteView.GetSafeHwnd();
mEngine->SetRemoteViewConfig(canvas, uid, AliEngineVideoTrackScreen);
}
return;
}
if ( (videoTrack & AliEngineVideoTrackCamera) > 0) {
AliEngineVideoCanvas canvas;
canvas.displayView = mRemoteView.GetSafeHwnd();
mEngine->SetRemoteViewConfig(canvas, uid, AliEngineVideoTrackCamera );
}
}4. 开启屏幕共享调用 StartScreenShareByScreenRegion开启屏幕共享。
说明 需要配置 mScreenConfig.isPushStream。
/*
* 共享屏幕局部
*/
RECT rc;
::GetWindowRect(::GetDesktopWindow(), &rc);
AliEngineScreenShareRegion screenRegion;
screenRegion.originX = (float)rc.left;
screenRegion.originY = (float)rc.top;
screenRegion.width = (float)(rc.right - rc.left);
screenRegion.height = (float)(rc.bottom - rc.top);
AliEngineScreenShareConfig mScreenConfig;
mScreenConfig.isShareByRegion = false;
mScreenConfig.shareRegion = screenRegion;
/*
如果不推流,只预览,可以设置为FALSE,
如果预览的同时推流,则设置为TRUE,可以跳过步骤5(更新配置)直接推流。
*/
mScreenConfig.isPushStream = FALSE ;
mpEngine->StartScreenShareByScreenRegion(screenRegion, mScreenConfig);5. (可选)更新配置如果需要更新屏幕共享的配置,可以调用UpdateScreenShareConfig进行。
/* 设置为屏幕共享推流 */
mScreenConfig.isPushStream = TRUE ;
/* 如果想共享局部 */
mScreenConfig.isShareByRegion = true ;
screenRegion.originX = (float)rc.left;
screenRegion.originY = (float)rc.top;
screenRegion.width = (float)(rc.right - rc.left);
screenRegion.height = (float)(rc.bottom - rc.top);
mScreenConfig.isShareByRegion = true;
mScreenConfig.shareRegion = screenRegion;
mpEngine->UpdateScreenShareConfig(mScreenConfig);6. 停止屏幕共享mpEngine->StopScreenShare();