文档管理中心

AVScreenCapture录屏基础流程

屏幕录制功能支持开发者获取屏幕数据,适用于屏幕录制、会议共享、直播等场景。开发者可通过调用AVScreenCapture模块的C API,采集设备内外的音视频数据源。该模块需与窗口管理(Window)、图形处理(Graphic)等模块协同工作,以完成完整的视频采集流程。

从API version 22开始,在PC/2in1设备上录屏时新增如下能力:

  • 支持在熄屏但不锁屏的情况下保持录制:需要申请权限ohos.permission.TIMEOUT_SCREENOFF_DISABLE_LOCK。配置方式请参见声明权限
  • 支持在录制屏幕时不再弹出隐私告警弹窗:需要申请权限ohos.permission.CUSTOM_SCREEN_RECORDING。配置方式请参见受限开放权限

流程介绍

基础屏幕录制功能涉及到AVScreenCapture实例创建、音视频参数配置、回调设置、开始与停止、结果处理、资源释放等步骤。

在此基础上,开发者可以根据视频录制、直播等特定场景进行更高级的设置,详情参见AVScreenCapture录屏自定义场景

基础流程如下图所示:

录屏采集的内容输出方式如下。

  • 文件形式:保存为文件,该文件可以播放、分享等。

  • 码流形式:该码流可根据场景进行不同的处理,例如将码流流转到其他模块,实现桌面共享、视频直播等。

约束与限制

  • 使用AVScreenCapture时需明确其状态变化。创建实例后,调用方法可进入指定状态。在错误状态下执行方法会导致AVScreenCapture出错。开发者应在状态转换前进行检查以避免异常。

  • 在录屏取码流场景中,屏幕录制启动时会弹出隐私保护弹框,包含“屏幕隐私保护”选项。勾选后,隐私信息(如横幅通知、控制中心、通话界面等)将被屏蔽。不同产品上的隐私信息可能有差异,以实际录制结果为准。

    隐私保护弹框:

通用开发步骤

依赖导入

在CMake脚本中链接动态库:

收起
自动换行
深色代码主题
复制
  1. target_link_libraries(entry PUBLIC libnative_avscreen_capture.so libnative_buffer.so libnative_media_core.so libnative_display_manager.so)

添加头文件:

收起
自动换行
深色代码主题
复制
  1. #include "hilog/log.h"
  2. #include "napi/native_api.h"
  3. #include <window_manager/oh_display_info.h>
  4. #include <window_manager/oh_display_manager.h>
  5. #include <multimedia/player_framework/native_avscreen_capture.h>
  6. #include <multimedia/player_framework/native_avscreen_capture_base.h>
  7. #include <multimedia/player_framework/native_avscreen_capture_errors.h>
  8. #include <multimedia/player_framework/native_avbuffer.h>
  9. #include <native_buffer/native_buffer.h>
  10. #include <vector>

创建AVScreenCapture实例

实例化对象,通过OH_AVScreenCapture_Create创建OH_AVScreenCapture

收起
自动换行
深色代码主题
复制
  1. g_avCapture = OH_AVScreenCapture_Create();

配置音频采集参数

创建AVScreenCapture实例后,可设置屏幕录制所需要的音频参数OH_AudioInfo,包括内录、麦克风音频OH_AudioCaptureInfo和输出规格OH_AudioEncInfo

如果配置了采集麦克风音频数据,需:

录屏存文件时默认只开启内录。录制过程中,麦克风可以动态开启/关闭,开启后,可同时启动内外录制。

内录音频信息必须设置,麦克风音频信息可按实际场景按需设置。

收起
自动换行
深色代码主题
复制
  1. // 录屏时获取麦克风,如果同时设置了内录和麦克风音频信息,两者参数设置需保持一致。
  2. OH_AudioCaptureInfo micCapInfo = {.audioSampleRate = 48000, .audioChannels = 2, .audioSource = OH_MIC};
  3. // 录屏时获取内录数据,内录参数必填。如果同时设置了内录和麦克风音频信息,两者参数设置需保持一致。
  4. OH_AudioCaptureInfo innerCapInfo = {.audioSampleRate = 48000, .audioChannels = 2, .audioSource = OH_ALL_PLAYBACK};
  5. // 录屏音频输出规格配置。audioBitrate保证输出文件的比特率为设置的预期比特率,和audioSampleRate无强关联。
  6. // 为保证音频质量,此处音频比特率取值为128000。如果录屏内容以语音为主,不包含音乐、游戏音效等,可以降低为96000或48000。
  7. OH_AudioEncInfo audioEncInfo = {
  8. .audioBitrate = 128000,
  9. .audioCodecformat = OH_AAC_LC
  10. };
  11. OH_AudioInfo audioInfo = {
  12. .micCapInfo = micCapInfo,
  13. .innerCapInfo = innerCapInfo,
  14. .audioEncInfo = audioEncInfo
  15. };
  16. // 可以单独设置麦克风开关。
  17. bool isMic = true;
  18. OH_AVScreenCapture_SetMicrophoneEnabled(g_avCapture, isMic);

配置视频采集参数

录屏的视频采集信息OH_VideoInfo包含录屏输入规格配置OH_VideoCaptureInfo和录屏输出规格配置OH_VideoEncInfo

收起
自动换行
深色代码主题
复制
  1. // 获取屏幕信息。
  2. uint64_t displayId = 0;
  3. NativeDisplayManager_ErrorCode ret = OH_NativeDisplayManager_GetDefaultDisplayId(&displayId);
  4. NativeDisplayManager_DisplayInfo* displayInfo = nullptr;
  5. ret = OH_NativeDisplayManager_CreateDisplayById(displayId, &displayInfo);
  6. if (ret != DISPLAY_MANAGER_OK || !displayInfo) {
  7. return;
  8. }
  9. int32_t screenWidth = displayInfo->width;
  10. int32_t screenHeight = displayInfo->height;
  11. OH_NativeDisplayManager_DestroyDisplay(displayInfo);
  12. displayInfo = nullptr;
  13. // 录屏输入规格配置。
  14. OH_VideoCaptureInfo videoCapInfo = {
  15. .videoFrameWidth = screenWidth,
  16. .videoFrameHeight = screenHeight,
  17. .videoSource = OH_VIDEO_SOURCE_SURFACE_RGBA
  18. };
  19. // 录屏输出规格配置。
  20. OH_VideoEncInfo videoEncInfo = {
  21. .videoCodec = OH_H264,
  22. .videoBitrate = 2000000,
  23. .videoFrameRate = 30
  24. };
  25. OH_VideoInfo videoInfo = {
  26. .videoCapInfo = videoCapInfo,
  27. .videoEncInfo = videoEncInfo
  28. };

初始化AVScreenCapture实例配置

AVScreenCapture实例的配置信息为OH_AVScreenCaptureConfig,包括录制数据格式OH_VideoInfo、音视频采集参数OH_AudioInfo、录屏模式OH_CaptureMode等,录屏模式包含OH_CAPTURE_HOME_SCREEN、OH_CAPTURE_SPECIFIED_SCREEN、OH_CAPTURE_SPECIFIED_WINDOW。

配置完成后通过OH_AVScreenCapture_Init将配置项设置到OH_AVScreenCapture中。

说明

根据不同的录屏场景,可选择不同的录屏模式,详情见录屏模式说明。在PC/2in1设备上,不同录屏模式会有不同弹窗表现,详情见弹窗模式说明

收起
自动换行
深色代码主题
复制
  1. // 初始化录屏,传入配置信息OH_AVScreenCaptureConfig。
  2. config = {
  3. .captureMode = OH_CAPTURE_HOME_SCREEN, // 录屏模式设置。
  4. .dataType = OH_ORIGINAL_STREAM, // 录屏数据类型,原始码流或文件。
  5. .audioInfo = audioInfo,
  6. .videoInfo = videoInfo
  7. };
  8. // 在StartScreenCapture_01()函数中调用OH_AVScreenCapture_Init方法将配置项设置到OH_AVScreenCapture中。

设置数据更新、状态切换、错误上报的回调

回调函数主要用来监听录屏过程中的错误发生、音视频流生成和录屏状态变更等事件,详细内容请参考:错误回调OH_AVScreenCaptureOnError、状态回调OH_AVScreenCapture_SetStateCallback和获取数据回调OH_AVScreenCapture_SetDataCallback

收起
自动换行
深色代码主题
复制
  1. // 设置回调。
  2. // 错误事件发生回调函数OnError()。
  3. void OnError(OH_AVScreenCapture *capture, int32_t errorCode, void *userData)
  4. {
  5. (void)capture;
  6. OH_LOG_INFO(LOG_APP, "==ScreenCaptureSample== ScreenCapture OnError errorCode is %{public}d", errorCode);
  7. (void)userData;
  8. }
  9. // 状态变更事件处理函数OnStateChange()。
  10. void OnStateChange(struct OH_AVScreenCapture *capture, OH_AVScreenCaptureStateCode stateCode, void *userData)
  11. {
  12. if (stateCode == OH_SCREEN_CAPTURE_STATE_STARTED) {
  13. OH_LOG_INFO(LOG_APP, "==ScreenCaptureSample== ScreenCapture OnStateChange started");
  14. // 处理状态变更。
  15. // 可选,配置录屏旋转。
  16. int32_t ret = OH_AVScreenCapture_SetCanvasRotation(capture, true);
  17. // 可选,修改Canvas分辨率。
  18. ret = OH_AVScreenCapture_ResizeCanvas(g_avCapture, CANVAS_RESIZE_WIDTH, CANVAS_RESIZE_HEIGHT);
  19. // 可选,设置是否显示光标。
  20. ret = OH_AVScreenCapture_ShowCursor(g_avCapture, true);
  21. // 可选,设置视频最大帧率。
  22. ret = OH_AVScreenCapture_SetMaxVideoFrameRate(g_avCapture, CAPTURE_VIDEO_FRAME_RATE);
  23. }
  24. if (stateCode == OH_SCREEN_CAPTURE_STATE_INTERRUPTED_BY_OTHER) {
  25. // 处理状态变更。
  26. }
  27. (void)userData;
  28. }
  29. // 获取并处理音视频原始码流数据回调函数OnBufferAvailable()。
  30. void HandleVideoBuffer(OH_AVBuffer *buffer)
  31. {
  32. OH_NativeBuffer *nativebuffer = OH_AVBuffer_GetNativeBuffer(buffer);
  33. if (nativebuffer == nullptr) {
  34. return;
  35. }
  36. int bufferLen = OH_AVBuffer_GetCapacity(buffer);
  37. OH_AVCodecBufferAttr info;
  38. int32_t ret = OH_AVBuffer_GetBufferAttr(buffer, &info);
  39. OH_LOG_INFO(LOG_APP, "==ScreenCaptureSample== ScreenCapture size %{public}d", info.size);
  40. OH_LOG_INFO(LOG_APP, "==ScreenCaptureSample== ScreenCapture bufferLen %{public}d", bufferLen);
  41. OH_NativeBuffer_Config config;
  42. OH_NativeBuffer_GetConfig(nativebuffer, &config);
  43. OH_LOG_INFO(LOG_APP, "==ScreenCaptureSample== ScreenCapture height %{public}d width %{public}d",
  44. config.height, config.width);
  45. uint8_t *buf = OH_AVBuffer_GetAddr(buffer);
  46. if (buf == nullptr) {
  47. return;
  48. }
  49. size_t written = fwrite(buf, 1, bufferLen, g_vFile);
  50. if (written != bufferLen) {
  51. OH_LOG_ERROR(LOG_APP, "fwrite failed");
  52. }
  53. OH_NativeBuffer_Unreference(nativebuffer);
  54. buffer = nullptr;
  55. OH_LOG_INFO(LOG_APP, "==ScreenCaptureSample== ScreenCapture OnBufferAvailable inner audio");
  56. }
  57. void HandleAudioBuffer(OH_AVBuffer *buffer, FILE *file, const char *logMsg)
  58. {
  59. int bufferLen = OH_AVBuffer_GetCapacity(buffer);
  60. uint8_t *buf = OH_AVBuffer_GetAddr(buffer);
  61. if (buf == nullptr) {
  62. return;
  63. }
  64. OH_LOG_INFO(LOG_APP, "==ScreenCaptureSample== ScreenCapture OnBufferAvailable inner audio");
  65. size_t written = fwrite(buf, 1, bufferLen, g_innerFile);
  66. if (written != bufferLen) {
  67. OH_LOG_ERROR(LOG_APP, "fwrite failed");
  68. }
  69. }
  70. void OnBufferAvailable(OH_AVScreenCapture *capture, OH_AVBuffer *buffer, OH_AVScreenCaptureBufferType bufferType,
  71. int64_t timestamp, void *userData)
  72. {
  73. if (!g_isRunning) {
  74. return;
  75. }
  76. OH_LOG_INFO(LOG_APP, "==ScreenCaptureSample== ScreenCapture OnBufferAvailable bufferType is %{public}d",
  77. bufferType);
  78. if (bufferType == OH_SCREEN_CAPTURE_BUFFERTYPE_VIDEO) {
  79. // 处理视频buffer。
  80. HandleVideoBuffer(buffer);
  81. } else if (bufferType == OH_SCREEN_CAPTURE_BUFFERTYPE_AUDIO_INNER) {
  82. // 处理内录buffer。
  83. HandleAudioBuffer(buffer, g_innerFile, "ScreenCapture OnBufferAvailable inner audio");
  84. } else if (bufferType == OH_SCREEN_CAPTURE_BUFFERTYPE_AUDIO_MIC) {
  85. // 处理麦克风buffer。
  86. HandleAudioBuffer(buffer, g_micFile, "ScreenCapture OnBufferAvailable mic audio");
  87. }
  88. return;
  89. }
  90. // 设置获取录屏屏幕ID的回调函数OnDisplaySelected()。
  91. void OnDisplaySelected(struct OH_AVScreenCapture *capture, uint64_t displayId, void *userData)
  92. {
  93. (void)capture;
  94. OH_LOG_INFO(LOG_APP, "==ScreenCaptureSample== ScreenCapture OnError errorCode is %{public}uld", displayId);
  95. (void)userData;
  96. }
  97. void SetCallback(struct OH_AVScreenCapture *capture)
  98. {
  99. OH_AVScreenCapture_SetErrorCallback(capture, OnError, nullptr);
  100. OH_AVScreenCapture_SetStateCallback(capture, OnStateChange, nullptr);
  101. OH_AVScreenCapture_SetDataCallback(capture, OnBufferAvailable, nullptr);
  102. OH_AVScreenCapture_SetDisplayCallback(capture, OnDisplaySelected, nullptr);
  103. }

启动录屏

启动录屏OH_AVScreenCapture_StartScreenCapture后,开始采集原始码流,通过回调OH_AVScreenCapture_OnBufferAvailable来监听当前是否有码流的产生,通过回调OH_AVScreenCapture_OnStateChange来监听启动状态的变更。

在回调接口中,可以调用获取音频码流OH_AVScreenCapture_AcquireAudioBuffer和获取视频码流OH_AVScreenCapture_AcquireVideoBuffer的接口来获取录屏的原始码流。

收起
自动换行
深色代码主题
复制
  1. result = OH_AVScreenCapture_StartScreenCapture(g_avCapture);

处理录屏数据

根据音视频采集的参数不同,会生成不同数据流,包含视频流、内录的音频流、麦克风录制的音频流,开发者可根据场景进行不同的处理,如将码流流转到其他模块,实现共享桌面、视频直播等。

收起
自动换行
深色代码主题
复制
  1. // 获取并处理音视频原始码流数据回调函数OnBufferAvailable()。
  2. void HandleVideoBuffer(OH_AVBuffer *buffer)
  3. {
  4. OH_NativeBuffer *nativebuffer = OH_AVBuffer_GetNativeBuffer(buffer);
  5. if (nativebuffer == nullptr) {
  6. return;
  7. }
  8. int bufferLen = OH_AVBuffer_GetCapacity(buffer);
  9. OH_AVCodecBufferAttr info;
  10. int32_t ret = OH_AVBuffer_GetBufferAttr(buffer, &info);
  11. OH_LOG_INFO(LOG_APP, "==ScreenCaptureSample== ScreenCapture size %{public}d", info.size);
  12. OH_LOG_INFO(LOG_APP, "==ScreenCaptureSample== ScreenCapture bufferLen %{public}d", bufferLen);
  13. OH_NativeBuffer_Config config;
  14. OH_NativeBuffer_GetConfig(nativebuffer, &config);
  15. OH_LOG_INFO(LOG_APP, "==ScreenCaptureSample== ScreenCapture height %{public}d width %{public}d",
  16. config.height, config.width);
  17. uint8_t *buf = OH_AVBuffer_GetAddr(buffer);
  18. if (buf == nullptr) {
  19. return;
  20. }
  21. size_t written = fwrite(buf, 1, bufferLen, g_vFile);
  22. if (written != bufferLen) {
  23. OH_LOG_ERROR(LOG_APP, "fwrite failed");
  24. }
  25. OH_NativeBuffer_Unreference(nativebuffer);
  26. buffer = nullptr;
  27. OH_LOG_INFO(LOG_APP, "==ScreenCaptureSample== ScreenCapture OnBufferAvailable inner audio");
  28. }
  29. void HandleAudioBuffer(OH_AVBuffer *buffer, FILE *file, const char *logMsg)
  30. {
  31. int bufferLen = OH_AVBuffer_GetCapacity(buffer);
  32. uint8_t *buf = OH_AVBuffer_GetAddr(buffer);
  33. if (buf == nullptr) {
  34. return;
  35. }
  36. OH_LOG_INFO(LOG_APP, "==ScreenCaptureSample== ScreenCapture OnBufferAvailable inner audio");
  37. size_t written = fwrite(buf, 1, bufferLen, g_innerFile);
  38. if (written != bufferLen) {
  39. OH_LOG_ERROR(LOG_APP, "fwrite failed");
  40. }
  41. }
  42. void OnBufferAvailable(OH_AVScreenCapture *capture, OH_AVBuffer *buffer, OH_AVScreenCaptureBufferType bufferType,
  43. int64_t timestamp, void *userData)
  44. {
  45. if (!g_isRunning) {
  46. return;
  47. }
  48. OH_LOG_INFO(LOG_APP, "==ScreenCaptureSample== ScreenCapture OnBufferAvailable bufferType is %{public}d",
  49. bufferType);
  50. if (bufferType == OH_SCREEN_CAPTURE_BUFFERTYPE_VIDEO) {
  51. // 处理视频buffer。
  52. HandleVideoBuffer(buffer);
  53. } else if (bufferType == OH_SCREEN_CAPTURE_BUFFERTYPE_AUDIO_INNER) {
  54. // 处理内录buffer。
  55. HandleAudioBuffer(buffer, g_innerFile, "ScreenCapture OnBufferAvailable inner audio");
  56. } else if (bufferType == OH_SCREEN_CAPTURE_BUFFERTYPE_AUDIO_MIC) {
  57. // 处理麦克风buffer。
  58. HandleAudioBuffer(buffer, g_micFile, "ScreenCapture OnBufferAvailable mic audio");
  59. }
  60. return;
  61. }

停止录屏

调用OH_AVScreenCapture_StopScreenCapture后应用会停止录屏或屏幕共享,释放麦克风。

收起
自动换行
深色代码主题
复制
  1. result = OH_AVScreenCapture_StopScreenCapture(g_avCapture);

释放资源

调用OH_AVScreenCapture_Release释放创建的OH_AVScreenCapture实例,需要在停止录屏后释放。

收起
自动换行
深色代码主题
复制
  1. result = OH_AVScreenCapture_Release(g_avCapture);
  2. if (result != AV_SCREEN_CAPTURE_ERR_BASE) {
  3. OH_LOG_ERROR(LOG_APP, "StopScreenCapture OH_AVScreenCapture_Release: %{public}d", result);
  4. }
  5. OH_LOG_INFO(LOG_APP, "OH_AVScreenCapture_Release success");
  6. g_avCapture = nullptr;

录屏模式说明

系统提供三种录屏模式:录制指定屏幕录制主屏幕录制指定窗口。通过OH_CaptureMode设置不同的录屏模式。

录屏模式会使用到屏幕ID(displayId)和窗口ID(missionIds)。获取方式请分别参考:OH_NativeDisplayManager_CreateAllDisplaysgetWindowProperties

录制指定屏幕

OH_CAPTURE_SPECIFIED_SCREEN模式。

在此模式下,录屏应用指定录制某个屏幕的内容。默认选中videoCapInfo.displayId参数对应的屏幕。如果传入的displayId对应的屏幕不存在,则不做任何选中。

收起
自动换行
深色代码主题
复制
  1. uint64_t displayId = 0;
  2. NativeDisplayManager_ErrorCode ret = OH_NativeDisplayManager_GetDefaultDisplayId(&displayId);
  3. NativeDisplayManager_DisplayInfo* displayInfo = nullptr;
  4. ret = OH_NativeDisplayManager_CreateDisplayById(displayId, &displayInfo);
  5. if (ret != DISPLAY_MANAGER_OK || !displayInfo) {
  6. return;
  7. }
  8. // 根据设备分辨率在config中配置录屏的宽度、高度。
  9. config.videoInfo.videoCapInfo.videoFrameWidth = displayInfo->width;
  10. config.videoInfo.videoCapInfo.videoFrameHeight = displayInfo->height;
  11. OH_NativeDisplayManager_DestroyDisplay(displayInfo);
  12. displayInfo = nullptr;
  13. // 设置录屏模式为OH_CAPTURE_SPECIFIED_SCREEN,传入屏幕ID。
  14. config.captureMode = OH_CAPTURE_SPECIFIED_SCREEN;
  15. config.videoInfo.videoCapInfo.displayId = 0;

如下图所示:

录制主屏幕

OH_CAPTURE_HOME_SCREEN模式。

在此模式下,录屏应用录制设备主屏幕的内容。启动录屏后,配置的videoCapInfo.displayId参数不会生效,默认生效主屏的displayId。

收起
自动换行
深色代码主题
复制
  1. uint64_t displayId = 0;
  2. NativeDisplayManager_ErrorCode ret = OH_NativeDisplayManager_GetDefaultDisplayId(&displayId);
  3. NativeDisplayManager_DisplayInfo* displayInfo = nullptr;
  4. ret = OH_NativeDisplayManager_CreateDisplayById(displayId, &displayInfo);
  5. if (ret != DISPLAY_MANAGER_OK || !displayInfo) {
  6. return;
  7. }
  8. // 根据设备分辨率在config中配置录屏的宽度、高度。
  9. config.videoInfo.videoCapInfo.videoFrameWidth = displayInfo->width;
  10. config.videoInfo.videoCapInfo.videoFrameHeight = displayInfo->height;
  11. OH_NativeDisplayManager_DestroyDisplay(displayInfo);
  12. displayInfo = nullptr;
  13. // 设置录屏模式为OH_CAPTURE_HOME_SCREEN。
  14. config.captureMode = OH_CAPTURE_HOME_SCREEN;

录制指定窗口

OH_CAPTURE_SPECIFIED_WINDOW模式。

应用需根据设备分辨率配置录屏的高度和宽度值并传入屏幕ID。

若期望录制某个指定窗口,需要设置指定的窗口ID。该场景下,启动录屏后,系统会默认选中指定的窗口。

收起
自动换行
深色代码主题
复制
  1. uint64_t displayId = 0;
  2. NativeDisplayManager_ErrorCode ret = OH_NativeDisplayManager_GetDefaultDisplayId(&displayId);
  3. NativeDisplayManager_DisplayInfo* displayInfo = nullptr;
  4. ret = OH_NativeDisplayManager_CreateDisplayById(displayId, &displayInfo);
  5. if (ret != DISPLAY_MANAGER_OK || !displayInfo) {
  6. return;
  7. }
  8. // 根据设备分辨率在config中配置录屏的宽度、高度。
  9. config.videoInfo.videoCapInfo.videoFrameWidth = displayInfo->width;
  10. config.videoInfo.videoCapInfo.videoFrameHeight = displayInfo->height;
  11. OH_NativeDisplayManager_DestroyDisplay(displayInfo);
  12. displayInfo = nullptr;
  13. // 设置录屏模式为OH_CAPTURE_SPECIFIED_WINDOW,传入屏幕ID。
  14. config.captureMode = OH_CAPTURE_SPECIFIED_WINDOW;
  15. config.videoInfo.videoCapInfo.displayId = 0;
  16. // (可选)若有期望录制的窗口,可传入单个窗口ID。
  17. g_missionIds = {61}; // 表示弹出的Picker默认选中61号窗口。
  18. config.videoInfo.videoCapInfo.missionIDs = g_missionIds.data();
  19. config.videoInfo.videoCapInfo.missionIDsLen = static_cast<int32_t>(g_missionIds.size());
  20. // 在配置参数结束后执行"g_missionIds.clear()"。

若期望同时录制多个窗口,需要传入期望录制的窗口ID列表。

收起
自动换行
深色代码主题
复制
  1. uint64_t displayId = 0;
  2. NativeDisplayManager_ErrorCode ret = OH_NativeDisplayManager_GetDefaultDisplayId(&displayId);
  3. NativeDisplayManager_DisplayInfo* displayInfo = nullptr;
  4. ret = OH_NativeDisplayManager_CreateDisplayById(displayId, &displayInfo);
  5. if (ret != DISPLAY_MANAGER_OK || !displayInfo) {
  6. return;
  7. }
  8. // 根据设备分辨率在config中配置录屏的宽度、高度。
  9. config.videoInfo.videoCapInfo.videoFrameWidth = displayInfo->width;
  10. config.videoInfo.videoCapInfo.videoFrameHeight = displayInfo->height;
  11. OH_NativeDisplayManager_DestroyDisplay(displayInfo);
  12. displayInfo = nullptr;
  13. // 设置录屏模式为OH_CAPTURE_SPECIFIED_WINDOW,传入屏幕ID。
  14. config.captureMode = OH_CAPTURE_SPECIFIED_WINDOW;
  15. config.videoInfo.videoCapInfo.displayId = 0;
  16. // 传入多个窗口ID。
  17. g_missionIds2 = {60, 61}; // 表示期望同时录制60、61号窗口。
  18. config.videoInfo.videoCapInfo.missionIDs = g_missionIds2.data();
  19. config.videoInfo.videoCapInfo.missionIDsLen = static_cast<int32_t>(g_missionIds2.size());
  20. // 在配置参数结束后执行"g_missionIds2.clear()"。

弹窗模式说明

从API version 23开始,支持PC/2in1设备、Phone/Tablet设备通过OH_AVScreenCapture_StrategyForPickerPopUp控制是否统一弹出选择共享内容弹窗。

OH_AVScreenCapture_StrategyForPickerPopUp为true

代表设备录屏启动后统一弹出picker,无需指定录屏模式。

收起
自动换行
深色代码主题
复制
  1. // 创建CaptureStrategy对象。
  2. OH_AVScreenCapture_CaptureStrategy* strategy = OH_AVScreenCapture_CreateCaptureStrategy();
  3. // 设置是否弹出屏幕捕获Picker。
  4. // 设置为true,代表录屏启动后统一弹出Picker。
  5. OH_AVScreenCapture_StrategyForPickerPopUp(strategy, true);
  6. // 设置CaptureStrategy到AVScreenCapture实例。
  7. OH_AVScreenCapture_SetCaptureStrategy(capture, strategy);
  8. // 释放CaptureStrategy对象。
  9. OH_AVScreenCapture_ReleaseCaptureStrategy(strategy);

OH_AVScreenCapture_StrategyForPickerPopUp为false

代表设备录屏启动后不弹出picker,仅弹出隐私保护弹窗,无需指定录屏模式。

收起
自动换行
深色代码主题
复制
  1. // 创建CaptureStrategy对象。
  2. OH_AVScreenCapture_CaptureStrategy* strategy = OH_AVScreenCapture_CreateCaptureStrategy();
  3. // 设置是否弹出屏幕捕获Picker。
  4. // 设置为false,代表录屏启动后统一不弹出Picker。
  5. OH_AVScreenCapture_StrategyForPickerPopUp(strategy, false);
  6. // 设置CaptureStrategy到AVScreenCapture实例。
  7. OH_AVScreenCapture_SetCaptureStrategy(capture, strategy);
  8. // 释放CaptureStrategy对象。
  9. OH_AVScreenCapture_ReleaseCaptureStrategy(strategy);

OH_AVScreenCapture_StrategyForPickerPopUp为默认值

对于PC/2in1设备、Phone/Tablet设备,录屏弹窗行为存在差异。

  • 在PC/2in1设备上,根据不同录屏模式有不同弹窗行为。

    • 录制指定屏幕(OH_CAPTURE_SPECIFIED_SCREEN):启动录屏后会弹出选择共享内容弹窗,并默认选中displayId参数对应的屏幕。
    • 录制主屏幕(OH_CAPTURE_HOME_SCREEN):启动录屏后不会弹出选择共享内容弹窗,仅弹出隐私保护弹窗,displayId参数不生效,默认使用主屏ID。
    • 录制指定窗口(OH_CAPTURE_SPECIFIED_WINDOW):传入单个窗口ID时,弹出选择共享内容弹窗并默认选中指定窗口;传入多个窗口ID时,不弹出选择共享内容弹窗,仅弹出隐私保护弹窗。
  • 在Phone/Tablet设备上,不同录屏模式下统一不弹出Picker,仅弹出隐私保护弹窗。

更多资源

在 指南 中进行搜索
请输入您想要搜索的关键词