• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &timestamp, &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, &timestamp, &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