1# 屏幕录制 2 3屏幕录制主要为主屏幕录屏功能。 4 5开发者可以调用录屏(AVScreenCapture)模块的Native API接口,完成屏幕录制,采集设备内、麦克风等的音视频源数据。当开发直播、办公等应用时,可以调用录屏模块获取音视频原始码流,然后通过流的方式流转到其他模块处理,达成直播时共享桌面的场景。 6 7录屏模块和窗口(Window)、图形(Graphic)等模块完成整个视频采集的流程。 8 9当前在进行屏幕录制时默认使用主屏,图形默认根据主屏生产录屏帧数据到显示数据缓冲队列,录屏框架从显示数据缓冲队列获取数据进行相应消费处理。 10 11## 开发指导 12 13使用AVScreenCapture录制屏幕涉及到AVScreenCapture实例的创建、音视频采集参数的配置、采集的开始与停止、资源的释放等。本开发指导将以一次录制屏幕数据的过程为例,向开发者讲解如何使用AVScreenCapture进行屏幕录制,详细的API声明请参考[AVScreenCapture API参考](../reference/native-apis/_a_v_screen_capture.md)。 14 15使用AVScreenCapture时要明确其状态的变化,在创建实例后,调用对应的方法可以进入指定的状态实现对应的行为。 16在确定的状态下执行不合适的方法会导致AVScreenCapture发生错误,开发者需要在调用状态转换的方法前进行状态检查,避免程序运行异常。 17 18### 权限说明 19 20在开发前,请根据应用实际需求,参考[访问控制授权申请指导](../security/accesstoken-guidelines.md)申请以下权限: 21 22| 权限名 | 说明 | 授权方式 | 权限级别 | 23| ------ | ----- | --------| ------- | 24| ohos.permission.CAPTURE_SCREEN | 允许应用截取屏幕图像。| system_grant | system_core | 25| ohos.permission.MICROPHONE | 允许应用使用麦克风(可选)。<br>如需录制麦克风源的音频,需要申请该权限。| user_grant | normal | 26 27### 开发步骤及注意事项 28 29开发者可以通过以下几个步骤来实现一个简单的屏幕录制功能。 30 311. 创建AVScreenCapture实例capture。 32 33 ```c++ 34 OH_AVScreenCapture* capture = AVScreenCapture_Create(); 35 ``` 36 372. 配置屏幕录制参数。 38 创建AVScreenCapture实例capture后,可以设置屏幕录制所需要的参数。 39 40 ```c++ 41 OH_AudioCaptureInfo miccapinfo = { 42 .audioSampleRate = 16000, 43 .audioChannels = 2, 44 .audioSource = OH_MIC 45 }; 46 47 OH_VideoCaptureInfo videocapinfo = { 48 .videoFrameWidth = display->GetWidth(), 49 .videoFrameHeight = display->Height(), 50 .videoSource = OH_VIDEO_SOURCE_SURFACE_RGBA 51 }; 52 53 OH_AudioInfo audioinfo = { 54 .micCapInfo = miccapinfo, 55 }; 56 57 OH_VideoInfo videoinfo = { 58 .videoCapInfo = videocapinfo 59 }; 60 61 OH_RecorderInfo recorderinfo = { 62 .url = name 63 }; 64 65 OH_AVScreenCaptureConfig config = { 66 .captureMode = OH_CAPTURE_HOME_SCREEN, 67 .dataType = OH_ORIGINAL_STREAM, 68 .audioInfo = audioinfo, 69 .videoInfo = videoinfo, 70 .recorderInfo = recorderinfo 71 }; 72 73 OH_AVScreenCapture_Init(capture, config); 74 ``` 75 763. 设置麦克风开关。 77 78 ```c++ 79 bool isMic = true; 80 OH_AVScreenCapture_SetMicrophoneEnabled(capture, isMic); 81 ``` 82 834. 回调函数的设置,主要监听录屏过程中的错误事件的发生,音频流和视频流数据的产生事件。 84 85 ```c++ 86 OH_AVScreenCaptureCallback callback; 87 callback.onAudioBufferAvailable = OnAudioBufferAvailable; 88 callback.onVideoBufferAvailable = OnVideoBufferAvailable; 89 OH_AVScreenCapture_SetCallback(capture, callback); 90 ``` 91 925. 调用StartScreenCapture方法开始进行屏幕录制。 93 94 ```c++ 95 OH_AVScreenCapture_StartScreenCapture(capture); 96 ``` 97 986. 调用StopScreenCapture()方法停止录制。 99 100 ```c++ 101 OH_AVScreenCapture_StopScreenCapture(capture_); 102 ``` 103 1047. 调用AcquireAudioBuffer()获取音频原始码流数据 105 106 ```c++ 107 OH_AVScreenCapture_AcquireAudioBuffer(capture, &audiobuffer, type); 108 ``` 109 1108. 调用AcquireVideoBuffer()获取视频原始码流数据。 111 112 ```c++ 113 OH_NativeBuffer* buffer = OH_ScreenCapture_AcquireVideoBuffer(capture, &fence, ×tamp, &damage); 114 ``` 115 1169. 调用ReleaseAudioBuffer方法释放音频buffer。 117 118 ```c++ 119 OH_ScreenCapture_ReleaseAudioBuffer(capture, type); 120 ``` 121 12210. 调用ReleaseVideoBuffer()释放视频数据。 123 124 ```c++ 125 OH_ScreenCapture_ReleaseVideoBuffer(capture); 126 ``` 127 12811. 调用release()方法销毁实例,释放资源。 129 130 ```c++ 131 OH_AVScreenCapture_Release(capture); 132 ``` 133 134### 完整示例 135 136下面展示了使用AVScreenCapture屏幕录制的完整示例代码。 137目前阶段流程结束后返回的buffer为原始码流,针对原始码流可以进行编码并以mp4等文件格式保存以供播放。编码格式与文件格式当前阶段仅作预留,待后续版本实现。 138 139```c++ 140 141#include "multimedia/player_framework/native_avscreen_capture.h" 142#include "multimedia/player_framework/native_avscreen_capture_base.h" 143#include "multimedia/player_framework/native_avscreen_capture_errors.h" 144 145void OnError(struct OH_AVScreenCapture *capture, int32_t errorCode) 146{ 147 (void) capture; 148 (void) errorCode; 149} 150 151void OnAudioBufferAvailable(struct OH_AVScreenCapture *capture, bool isReady, OH_AudioCapSourceType type) 152{ 153 if (isReady) { 154 OH_AudioBuffer *audiobuffer = (struct OH_AudioBuffer*) malloc (sizeof(OH_AudioBuffer)); 155 //获取音频流 156 int32_t ret = OH_AVScreenCapture_AcquireAudioBuffer(capture, &audiobuffer, type); 157 /* get buffer */ 158 (void)audiobuffer->buf; 159 /* getbuffer size */ 160 (void)audiobuffer->size; 161 /* get audiobuffer timestamp */ 162 (void)audiobuffer->timestamp; 163 free(audiobuffer); 164 audiobuffer = nullptr; 165 //释放音频流 166 int32_t ret = OH_ScreenCapture_ReleaseAudioBuffer(capture, type); 167 } 168} 169 170void OnVideoBufferAvailable(struct OH_ScreenCapture *capture, bool isReady) 171{ 172 if (isReady) { 173 int32_t fence = 0; 174 int64_t timestamp = 0; 175 struct OH_Rect damage; 176 //获取视频流 177 OH_NativeBuffer* buffer = OH_ScreenCapture_AcquireVideoBuffer(capture, &fence, ×tamp, &damage); 178 void *virAddr = nullptr; 179 OH_NativeBuffer_Map(buffer, &virAddr); //获取buffer 180 OH_NativeBuffer_Config config; 181 OH_NativeBuffer_GetNativeBufferConfig(buffer, config); //获取config信息 宽,高,format 182 // fence, timestampe, damage 获取fence,时间戳,坐标信息 183 OH_NativeBuffer_UnMap(buffer); //释放buffer 184 //释放视频流 185 int32_t ret = OH_ScreenCapture_ReleaseVideoBuffer(capture); 186 } 187} 188 189int main() 190{ 191 //实例化ScreenCapture 192 struct OH_AVScreenCapture* capture = OH_AVScreenCapture_Create(void); 193 //设置回调 194 struct OH_AVScreenCaptureCallback callback; 195 callback.onError = OnError; 196 callack.onAudioBufferAvailable = OnAudioBufferAvailable ; 197 callack.onVideoBufferAvailable = OnVideoBufferAvailable; 198 int32_t ret = OH_AVScreenCapture_SetCallback(capture, callback); 199 //初始化录屏,传入配置信息OH_AVScreenRecorderConfig 200 OH_AudioCaptureInfo miccapinfo = { 201 .audioSampleRate = 16000, 202 .audioChannels = 2, 203 .audioSource = OH_MIC 204 }; 205 OH_VideoCaptureInfo videocapinfo = { 206 .videoFrameWidth = 720, 207 .videoFrameHeight = 1280, 208 .videoSource = OH_VIDEO_SOURCE_SURFACE_RGBA 209 }; 210 OH_AudioInfo audioinfo = { 211 .micCapInfo = miccapinfo, 212 }; 213 OH_VideoInfo videoinfo = { 214 .videoCapInfo = videocapinfo 215 }; 216 OH_AVScreenCaptureConfig config = { 217 .captureMode = OH_CAPTURE_HOME_SCREEN, 218 .dataType = OH_ORIGINAL_STREAM, 219 .audioInfo = audioinfo, 220 .videoInfo = videoinfo, 221 .recorderInfo = recorderinfo 222 }; 223 OH_AVScreenCapture_Init(capture, config); 224 int32_t ret = OH_AVScreenCapture_Init(capture, &config); 225 //开始录屏 226 int32_t ret = OH_AVScreenCapture_StartScreenCapture(capture); 227 //mic开关设置 228 int32_t ret = OH_ScreenCapture_SetMicrophoneEnable(capture, true); 229 sleep(10); //录制10s 230 //结束录屏 231 int32_t ret = OH_ScreenCapture_StopScreenCapture(capture); 232 //释放ScreenCapture 233 int32_t ret = OH_ScreenCapture_Realease(capture); 234 return 0; 235} 236``` 237