# AVScreenCapture录屏自定义场景

AVScreenCapture支持应用完成场景化的自定义配置，具体配置可参考下述指导。

#### 设置录屏策略

#### 蜂窝通话设置

从API version 20开始支持蜂窝通话设置。

使用OH\_AVScreenCapture\_StrategyForKeepCaptureDuringCall设置蜂窝通话时是否保持录屏。

```
OH_AVScreenCapture_CaptureStrategy* strategy = OH_AVScreenCapture_CreateCaptureStrategy();
OH_AVScreenCapture_StrategyForKeepCaptureDuringCall(strategy, true);
OH_AVScreenCapture_SetCaptureStrategy(capture, strategy);
OH_AVScreenCapture_ReleaseCaptureStrategy(strategy);
```

#### 设置B帧编码

从API version 20开始支持设置B帧编码。

使用OH\_AVScreenCapture\_StrategyForBFramesEncoding设置是否使用B帧编码，用于减小录制文件的大小。

```
OH_AVScreenCapture_CaptureStrategy* strategy = OH_AVScreenCapture_CreateCaptureStrategy();
OH_AVScreenCapture_StrategyForBFramesEncoding(strategy, true);
OH_AVScreenCapture_SetCaptureStrategy(capture, strategy);
OH_AVScreenCapture_ReleaseCaptureStrategy(strategy);
```

#### 设置屏幕捕获Picker

从API version 20开始，支持在PC/2in1设备上设置屏幕捕获Picker。

从API version 23开始，支持在Phone/Tablet设备上设置屏幕捕获Picker。

使用OH\_AVScreenCapture\_StrategyForPickerPopUp设置是否弹出屏幕捕获Picker。

```
// 创建CaptureStrategy对象。
OH_AVScreenCapture_CaptureStrategy* strategy = OH_AVScreenCapture_CreateCaptureStrategy();

// 设置是否弹出屏幕捕获Picker。
// 设置为true，代表录屏启动后统一弹出Picker。
OH_AVScreenCapture_StrategyForPickerPopUp(strategy, true);

// 设置CaptureStrategy到AVScreenCapture实例。
OH_AVScreenCapture_SetCaptureStrategy(capture, strategy);

// 释放CaptureStrategy对象。
OH_AVScreenCapture_ReleaseCaptureStrategy(strategy);
```

#### 设置旋转适配

从API version 20开始支持设置旋转适配。

使用OH\_AVScreenCapture\_StrategyForCanvasFollowRotation，可设置录屏时是否自动跟随屏幕旋转。

调用此接口完成设置后，无需再调用OH\_AVScreenCapture\_ResizeCanvas手动修改分辨率。

```
OH_AVScreenCapture_CaptureStrategy* strategy = OH_AVScreenCapture_CreateCaptureStrategy();
// 设为true，表示跟随屏幕旋转，并在横竖屏旋转后，自动调换虚拟屏尺寸，确保输出画面及时跟随旋转。
OH_AVScreenCapture_StrategyForCanvasFollowRotation(strategy, true);
OH_AVScreenCapture_SetCaptureStrategy(capture, strategy);
OH_AVScreenCapture_ReleaseCaptureStrategy(strategy);
```

#### 设置麦克风开关

使用OH\_AVScreenCapture\_SetMicrophoneEnabled，可设置在录屏过程中是否开启麦克风，默认麦克风开关为开启状态。

使用麦克风录制，需要：

*   配置麦克风权限ohos.permission.MICROPHONE，配置方式请参见向用户申请权限。
*   申请长时任务，申请方式请参见申请长时任务。

```
bool isMic = true;
OH_AVScreenCapture_SetMicrophoneEnabled(g_avCapture, isMic);
```

#### 隐私设置

从API version 20开始，支持使用OH\_AVScreenCapture\_StrategyForPrivacyMaskMode设置录屏隐私窗口屏蔽模式。

```
// value值设为0，表示全屏屏蔽模式。value值设为1，表示窗口屏蔽模式。默认为全屏屏蔽模式。开发者可根据实际需求选择合适取值。
int value = PRIVACY_MASK_MODE_FULL_SCREEN;
OH_AVScreenCapture_CaptureStrategy* strategy = OH_AVScreenCapture_CreateCaptureStrategy();
OH_AVScreenCapture_StrategyForPrivacyMaskMode(strategy, value);
OH_AVScreenCapture_SetCaptureStrategy(capture, strategy);
OH_AVScreenCapture_ReleaseCaptureStrategy(strategy);
```

在API version 12时，支持使用OH\_AVScreenCapture\_SkipPrivacyMode设置录屏时的豁免隐私窗口。目前设置豁免隐私窗口需要传入所有隐私子窗口和主窗口ID，传空数组取消豁免隐私窗口。

```
std::vector<int> windowIdsSkipPrivacy = {};
OH_AVScreenCapture_SkipPrivacyMode(capture, windowIdsSkipPrivacy.empty() ? nullptr : &windowIdsSkipPrivacy[0],
    static_cast<int32_t>(windowIdsSkipPrivacy.size()));
```

#### 设置捕获区域

从API version 20开始支持设置捕获区域。

可以根据需要设置区域坐标和大小，使用OH\_AVScreenCapture\_SetCaptureArea设置想要捕获的区域，如下方创建了一个从（0，0）为起点的宽100px，高100px的矩形区域。此接口在录屏开始前后都可以设置。

```
OH_Rect* region = new OH_Rect;
region->x = 0;
region->y = 0;
region->width = CAPTURE_REGION_SIZE;
region->height = CAPTURE_REGION_SIZE;
uint64_t regionDisplayId = 0; // 传入矩形区域所在的屏幕ID。
OH_AVScreenCapture_SetCaptureArea(capture, regionDisplayId, region);
delete region;
region = nullptr;
```

#### 设置捕获光标

从API version 15开始支持设置捕获光标。

使用OH\_AVScreenCapture\_ShowCursor设置光标显示开关，开始录屏前后均可调用。

```
OH_AVScreenCapture_ShowCursor(g_avCapture, false);
```

#### 设置最大帧率

从API version 14开始支持设置最大帧率。

使用OH\_AVScreenCapture\_SetMaxVideoFrameRate设置录屏时的最大帧率，需在录屏启动后被调用。

```
OH_AVScreenCapture_SetMaxVideoFrameRate(g_avCapture, CAPTURE_VIDEO_FRAME_RATE);
```

#### 设置屏幕分辨率

使用OH\_AVScreenCapture\_ResizeCanvas调整录屏分辨率，需在启动后调用。分辨率有范围限制，视频的宽度和高度最大值不能超过OH\_AVCapability\_GetVideoWidthRange和OH\_AVCapability\_GetVideoHeightRange接口中定义的范围。

```
OH_AVScreenCapture_ResizeCanvas(g_avCapture, CANVAS_RESIZE_WIDTH, CANVAS_RESIZE_HEIGHT);
```

#### 设置内容过滤

选择录屏时要过滤的声音和窗口。

使用OH\_AVScreenCapture\_ContentFilter\_AddAudioContent设置可过滤的声音，包含系统音和应用自身声音。

使用OH\_AVScreenCapture\_ContentFilter\_AddWindowContent设置可过滤的窗口，通过窗口ID来指定。

```
OH_AVScreenCapture_ContentFilter *contentFilter = OH_AVScreenCapture_CreateContentFilter();
// 添加过滤通知音。
OH_AVScreenCapture_ContentFilter_AddAudioContent(contentFilter, OH_SCREEN_CAPTURE_NOTIFICATION_AUDIO);
// 如果需要排除指定窗口，先填充窗口ID数组。
std::vector<int> windowIdsExclude = {};
OH_AVScreenCapture_ContentFilter_AddWindowContent(contentFilter, windowIdsExclude.empty() ?
    nullptr : &windowIdsExclude[0], static_cast<int32_t>(windowIdsExclude.size()));

OH_AVScreenCapture_ExcludeContent(capture, contentFilter);
OH_AVScreenCapture_ReleaseContentFilter(contentFilter);
contentFilter = nullptr;
```

#### 更多资源

*   API参考：详细的API描述请见native\_avscreen\_capture.h。
    
*   示例工程：该示例调用了媒体AVScreenCapture组件提供的接口能力，提供屏幕捕获的功能，详情见录屏示例工程。