已合并
内录开发指南 #155348
yangjcc创建于 7月13日
内录开发指南 #155348
已合并
yangjcc创建于 7月13日
8 个文件变更+480-38
@@ -38,11 +38,15 @@
38 <!--DelEnd-->38 <!--DelEnd-->
39- 音频录制<!--audio-recording-->39- 音频录制<!--audio-recording-->
40 - [音频录制开发概述](audio-recording-overview.md)40 - [音频录制开发概述](audio-recording-overview.md)
41- - [选择合适的录制流类型](using-right-sourcetype-for-recording.md)41+ - 开发麦克风录制(外录)功能<!--external-audio-recording-->
42- - [推荐使用OHAudio开发音频录制功能(C/C++)](using-ohaudio-for-recording.md)42+ - [选择合适的录制流类型](using-right-sourcetype-for-recording.md)
43- - [使用AudioCapturer开发音频录制功能(ArkTS)](using-audiocapturer-for-recording.md)43+ - [推荐使用OHAudio开发音频录制功能(C/C++)](using-ohaudio-for-recording.md)
44- - [低时延音频录制(C/C++)](audio-fast-recording.md)44+ - [使用AudioCapturer开发音频录制功能(ArkTS)](using-audiocapturer-for-recording.md)
45- - [实现后台录音](background-recording.md)45+ - [低时延频录制(C/C++)](audio-fast-recording.md)
46+ - [实现后台录音](background-recording.md)
47+ - 开发录制系统音频(内录)功能<!--system-audio-recording-->
lixin
lixinlixin7月16日

把外录的目录也分好,不然单独一个内录目录很奇怪

likedislike
48+ - [录制系统音频概述与接口选择](audio-recording-system-audio-overview.md)
49+ - [实现录制系统音频](implement-system-audio-recording.md)
46 - [管理麦克风静音状态](mic-management.md)50 - [管理麦克风静音状态](mic-management.md)
47 - [查询和监听其他应用录制状态](audio-recording-stream-management.md)51 - [查询和监听其他应用录制状态](audio-recording-stream-management.md)
48 - [录音并发策略说明](audio-recording-concurrency.md)52 - [录音并发策略说明](audio-recording-concurrency.md)
@@ -76,4 +80,4 @@
76- Audio Kit常见问题<!--audio-issues-->80- Audio Kit常见问题<!--audio-issues-->
77 - [使用音频快照获取问题定位信息](audio-runtime-debugging-info.md)81 - [使用音频快照获取问题定位信息](audio-runtime-debugging-info.md)
78 - [录音无声定位指导](audio-recording-no-audio-troubleshooting.md)82 - [录音无声定位指导](audio-recording-no-audio-troubleshooting.md)
79-- [Audio Kit术语](audio-glossary.md)83+- [Audio Kit术语](audio-glossary.md)
@@ -14,6 +14,8 @@
14 14 
15- [OHAudio](using-ohaudio-for-recording.md):用于音频输入的Native API,此API在设计上实现归一,同时支持普通音频通路和低时延通路。仅支持PCM格式,适用于依赖Native层实现音频输入功能的场景。15- [OHAudio](using-ohaudio-for-recording.md):用于音频输入的Native API,此API在设计上实现归一,同时支持普通音频通路和低时延通路。仅支持PCM格式,适用于依赖Native层实现音频输入功能的场景。
16 16 
17+如果开发者需要采集设备内部播放音频,可参考[实现录制系统音频](implement-system-audio-recording.md)。
18+ 
17除上述方式外,也可以通过Media Kit中的AVRecorder实现音频录制。19除上述方式外,也可以通过Media Kit中的AVRecorder实现音频录制。
18 20 
19- [AVRecorder](../media/using-avrecorder-for-recording.md):用于音频录制的ArkTS/JS API,集成了音频采集、音频编码和媒体封装的功能。开发者可以直接调用设备硬件如麦克风录音,并生成m4a音频文件。21- [AVRecorder](../media/using-avrecorder-for-recording.md):用于音频录制的ArkTS/JS API,集成了音频采集、音频编码和媒体封装的功能。开发者可以直接调用设备硬件如麦克风录音,并生成m4a音频文件。
@@ -0,0 +1,45 @@
1+# 录制系统音频概述与接口选择
2+<!--Kit: Audio Kit-->
3+<!--Subsystem: Multimedia-->
4+<!--Owner: @zyy0412-->
5+<!--Designer: @weixin_41398971-->
6+<!--Tester: @Filger-->
7+<!--Adviser: @w_Machine_cc-->
8+ 
9+从API版本26.0.0开始,Audio Kit支持应用录制系统音频。录制系统音频通常称为内录,是指设备以系统内部播放音频作为采集源进行录制。与通过麦克风采集设备周围声音的外录不同,内录直接获取设备内部应用播放的音频数据,不受周围环境噪声影响。
10+ 
11+## 适用场景
12+ 
13+内录适用于以下需要获取设备内部播放音频的场景:
14+ 
15+- 会议共享:将设备中播放的演示音频、视频声音等内容共享给参会者。
16+- 直播推流:将游戏、视频等应用播放的音频数据接入直播编码和推流链路。
17+- 音频录制:录制设备内部播放的音频,用于保存或后续编辑。
18+- 音频分析:获取内部播放音频的脉冲编码调制(Pulse Code Modulation,PCM)数据,用于听歌识曲等音频分析业务。
19+ 
20+## 内录与外录的区别
21+ 
22+| 特性 | 内录(系统音频录制) | 外录(麦克风录制) |
23+|------|---------------------|-------------------|
24+| 采集内容 | 设备内部播放的音频,不采集周围环境声音。 | 麦克风接收到的声音,可能包含周围环境声音。 |
25+| 录制质量 | 不受周围环境噪声影响。 | 可能受到周围环境噪声影响。 |
26+| 适用场景 | 直播推流、在线会议、音频录制、音频分析。 | 录音机、相机录像、语音通话、语音识别。 |
27+ 
28+## 实现与授权
29+ 
30+内录由系统从设备内部正在播放的音频中获取数据,并将音频数据提供给发起内录的应用。该过程不会通过麦克风采集周围环境声音。
31+ 
32+由于系统音频可能包含媒体内容、消息提示或其他应用播放的信息,应用请求启动内录时,系统会进行用户授权检查,以确保用户知情。不同设备形态的授权弹框表现可能存在差异,应用应以启动接口异步回调返回的状态作为授权和启动结果。
33+ 
34+## 播放端隐私保护
35+ 
36+播放端可以通过配置自身音频流的隐私属性,控制是否允许其他应用录制。标记为隐私保护的播放流不会被内录采集,例如包含通话内容、账号信息或其他隐私内容的音频流可通过该配置避免被录制。具体配置方法请参考[配置目标播放流的内录策略](implement-system-audio-recording.md#配置目标播放流的内录策略)。
37+ 
38+## 如何选择内录接口
39+ 
40+如果仅需要获取系统播放音频的PCM数据,或需要将音频数据接入自定义编码、算法和传输链路,使用[AudioCapturer](../../reference/apis-audio-kit/arkts-apis-audio-AudioCapturer.md)(ArkTS API)或[native_audiocapturer.h](../../reference/apis-audio-kit/capi-native-audiocapturer-h.md)(C API)。如果需要同时录制屏幕画面和系统音频,使用[AVScreenCapture录屏基础流程](../media/avscreencapture-c-basic-process.md)。
41+ 
42+| 接口类型 | 开放版本 | 适用场景 | 开发指导 |
43+| -------- | ------------ | -------- | -------- |
44+| AudioCapturer或OH_AudioCapturer | API版本26.0.0 | 仅需要录制系统音频,或需要将PCM数据接入自定义编码、算法和传输链路,例如直播推流、在线会议、听歌识曲和音频分析。 | [实现录制系统音频](implement-system-audio-recording.md) |
45+| AVScreenCapture录屏基础流程 | API版本10 | 需要同时录制屏幕视频和系统音频,例如屏幕录制、制作教学视频和游戏录像。 | [AVScreenCapture录屏基础流程](../media/avscreencapture-c-basic-process.md) |
@@ -0,0 +1,391 @@
1+# 实现录制系统音频
7
777_cc7月22日

上面这个图,有找金学荣 60081993进行评审么 没问题的话请UX点赞

likedislike
yangjcc
23 天前 评论:
2+<!--Kit: Audio Kit-->
3+<!--Subsystem: Multimedia-->
4+<!--Owner: @zyy0412-->
5+<!--Designer: @weixin_41398971-->
6+<!--Tester: @Filger-->
7+<!--Adviser: @w_Machine_cc-->
8+ 
9+从API版本26.0.0开始,Audio Kit支持应用使用AudioCapturer(ArkTS API)或OH_AudioCapturer(C API)录制系统音频。本文介绍具体开发方法。
10+ 
11+Phone、Tablet和TV设备支持`SystemCapability.Multimedia.Audio.PlaybackCapture`系统能力,其他设备可以通过[canIUse()](../../reference/common/js-apis-syscap.md#caniuse)检查是否支持该系统能力。使用ArkTS API开发时,仅支持Stage模型。
12+ 
13+创建AudioCapturer时通过`playbackCaptureMode`配置内录模式,创建OH_AudioCapturer时通过`OH_AudioStreamBuilder_SetPlaybackCaptureMode()`配置内录模式。
14+ 
15+配置内录模式后,需分别通过`requestPlaybackCaptureStart()``OH_AudioCapturer_RequestPlaybackCaptureStart()`启动,不支持通过`start()``OH_AudioCapturer_Start()`接口启动。
16+ 
17+如果需要同时录制屏幕画面和系统音频,请参考[AVScreenCapture录屏基础流程](../media/avscreencapture-c-basic-process.md)。
18+ 
19+## 开发指导
20+ 
21+使用AudioCapturer(ArkTS API)或OH_AudioCapturer(C API)采集内录音频的基本流程如下:
22+ 
23+1. 创建音频采集器,配置音频流参数和内录模式。
24+2. 注册音频数据回调,准备接收采集到的PCM数据。
25+3. 调用对应语言的内录启动接口,并在异步回调中确认启动结果。
26+4. 启动成功后,通过音频数据回调处理内录PCM数据。
27+5. 停止采集,取消监听并释放音频采集器资源。
28+ 
29+ArkTS开发建议搭配[AudioCapturer](../../reference/apis-audio-kit/arkts-apis-audio-AudioCapturer.md)、[AudioCapturerOptions](../../reference/apis-audio-kit/arkts-apis-audio-i.md#audiocaptureroptions8)和[AudioPlaybackCaptureMode](../../reference/apis-audio-kit/arkts-apis-audio-e.md#audioplaybackcapturemode)的API说明阅读。
30+ 
31+C/C++开发建议搭配[OH_AudioStreamBuilderStruct](../../reference/apis-audio-kit/capi-ohaudio-oh-audiostreambuilderstruct.md)、[OH_AudioCapturerStruct](../../reference/apis-audio-kit/capi-ohaudio-oh-audiocapturerstruct.md)和[OH_AudioStream_PlaybackCaptureMode](../../reference/apis-audio-kit/capi-native-audiostream-base-h.md#oh_audiostream_playbackcapturemode)的API说明阅读。
32+ 
33+### 用户授权流程
34+ 
35+应用调用内录启动接口后,系统会自动拉起隐私确认弹框,应用无需实现弹框。不同设备形态的弹框表现可能存在差异,请以实际设备表现为准。
36+ 
37+用户选择允许后,异步回调返回启动成功;用户选择拒绝,或系统未能拉起弹框时,异步回调返回用户未授权。应用应根据异步回调结果进行处理:回调返回成功时开始处理内录PCM数据;回调返回未授权或启动失败时,提示用户并释放已创建的音频采集器。
38+ 
39+启动接口为非阻塞接口。等待用户操作弹框和系统返回异步回调期间,应用不应通过循环等待、同步锁等待等方式阻塞当前线程。C API启动接口返回`AUDIOSTREAM_SUCCESS`仅表示启动请求提交成功,不能作为最终授权结果。
40+ 
41+**系统弹框示意图:**
42+ 
43+<img src="figures/playback-capture-authorization.jpg" width="320" alt="音频内录授权弹框">
44+ 
45+### AudioCapturer(ArkTS API)开发步骤及注意事项
46+ 
47+以下ArkTS示例为片段代码,开发者可根据实际业务将采集到的PCM数据写入文件、送入编码器或交给自定义音频处理模块。
48+ 
49+1. 导入模块。
50+ 
51+ ``` TypeScript
52+ import { audio } from '@kit.AudioKit';
53+ import { BusinessError } from '@kit.BasicServicesKit';
54+ ```
55+ 
56+2. 配置音频采集参数并创建AudioCapturer实例。
57+ 
58+ 创建AudioCapturer时,通过[AudioCapturerOptions](../../reference/apis-audio-kit/arkts-apis-audio-i.md#audiocaptureroptions8)中的`playbackCaptureMode`配置内录模式。该字段支持[AudioPlaybackCaptureMode](../../reference/apis-audio-kit/arkts-apis-audio-e.md#audioplaybackcapturemode)枚举值、按位或组合。未配置`playbackCaptureMode`时,AudioCapturer按普通音频采集器创建。
59+ 
60+ 当前支持的内录模式如下:
61+ 
62+ | 内录模式 | 录制范围 |
63+ | -------- | -------- |
64+ | `MODE_DEFAULT` | 默认模式,录制大部分音频流,不包括提示音流和隐私流。 |
65+ | `MODE_MEDIA` | 媒体模式,录制媒体、语音消息和未知类型的音频流。 |
66+ | `MODE_EXCLUDING_SELF` | 排除自身模式,录制除应用自身播放音频以外的音频流。 |
67+ | `MODE_MEDIA \| MODE_EXCLUDING_SELF` | 录制媒体类音频,同时排除应用自身播放的音频。 |
68+ 
69+ > **说明:**
70+ >
71+ > - 内录启动时还会进行用户授权检查,部分设备会展示系统授权或隐私提示弹窗,授权结果通过`requestPlaybackCaptureStart()`回调返回。
72+ 
73+ <!-- @[SetPlaybackCaptureMode](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/Media/Audio/AudioCaptureSampleJS/entry/src/main/ets/pages/PlaybackCapture.ets) -->
74+ ``` TypeScript
7
777_cc7月22日

需要做同源

likedislike
75+ let audioStreamInfo: audio.AudioStreamInfo = {
76+ samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000,
77+ channels: audio.AudioChannel.CHANNEL_2,
78+ sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
79+ encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
80+ };
81+ 
82+ let audioCapturerInfo: audio.AudioCapturerInfo = {
83+ source: audio.SourceType.SOURCE_TYPE_MIC,
84+ capturerFlags: 0
85+ };
86+ 
87+ let audioCapturerOptions: audio.AudioCapturerOptions = {
88+ streamInfo: audioStreamInfo,
89+ capturerInfo: audioCapturerInfo,
90+ playbackCaptureMode: audio.AudioPlaybackCaptureMode.MODE_MEDIA |
91+ audio.AudioPlaybackCaptureMode.MODE_EXCLUDING_SELF
92+ };
93+ 
94+ let audioCapturer: audio.AudioCapturer | undefined =
95+ await audio.createAudioCapturer(audioCapturerOptions);
96+ ```
O
Oopenharmony-docs-bot23 天前

此条代码评论区间+73+96

改动建议
73
73
  <!-- @[SetPlaybackCaptureMode](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/Media/Audio/AudioCaptureSampleJS/entry/src/main/ets/pages/PlaybackCapture.ets) -->
74
+
74
75
  ``` TypeScript
75
- let audioStreamInfo: audio.AudioStreamInfo = {
76
- samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000,
77
- channels: audio.AudioChannel.CHANNEL_2,
78
- sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
79
- encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
80
- };
81
-
82
- let audioCapturerInfo: audio.AudioCapturerInfo = {
83
- source: audio.SourceType.SOURCE_TYPE_MIC,
84
- capturerFlags: 0
85
- };
86
-
87
- let audioCapturerOptions: audio.AudioCapturerOptions = {
88
- streamInfo: audioStreamInfo,
89
- capturerInfo: audioCapturerInfo,
90
- playbackCaptureMode: audio.AudioPlaybackCaptureMode.MODE_MEDIA |
76
+ playbackCaptureMode: audio.AudioPlaybackCaptureMode.MODE_MEDIA |
91
- audio.AudioPlaybackCaptureMode.MODE_EXCLUDING_SELF
77
+ audio.AudioPlaybackCaptureMode.MODE_EXCLUDING_SELF
92
- };
93
-
94
- let audioCapturer: audio.AudioCapturer | undefined =
95
- await audio.createAudioCapturer(audioCapturerOptions);
96
78
  ```
应用建议
likedislike
97+ 
98+3. 调用[on('readData')](../../reference/apis-audio-kit/arkts-apis-audio-AudioCapturer.md#onreaddata11)订阅音频数据读入回调。
99+ 
100+ 回调返回PCM数据,应用可根据业务写入文件、送入编码器或交给自定义音频处理模块。以下示例统计接收到的PCM数据字节数。
101+ 
102+ ``` TypeScript
103+ let readBytes: number = 0;
104+ let isPlaybackCaptureStarted: boolean = false;
105+ let playbackCaptureRequestId: number = 0;
106+ let playbackCaptureStartState: audio.PlaybackCaptureStartState | undefined = undefined;
107+ 
108+ let readDataCallback: Callback<ArrayBuffer> = (buffer: ArrayBuffer): void => {
109+ readBytes += buffer.byteLength;
110+ };
111+ 
112+ audioCapturer.on('readData', readDataCallback);
113+ ```
114+ 
115+ > **注意:**
116+ >
117+ > `readData`回调中不建议执行耗时任务。若需要编码、网络发送或复杂算法处理,建议将PCM数据转交给独立任务处理,避免数据回调阻塞导致丢帧、卡顿或杂音。
118+ 
119+4. 调用[requestPlaybackCaptureStart()](../../reference/apis-audio-kit/arkts-apis-audio-AudioCapturer.md#requestplaybackcapturestart)请求启动内录。
120+ 
121+ 该接口为非阻塞接口,系统会继续处理用户授权检查和内录流启动,最终结果通过[PlaybackCaptureStartState](../../reference/apis-audio-kit/arkts-apis-audio-e.md#playbackcapturestartstate)返回。
122+ 
123+ 示例通过递增`playbackCaptureRequestId`标识每次启动请求。回调返回时同时校验采集器实例和请求ID,避免旧请求回调修改当前内录状态。等待授权期间,应用应继续处理其他业务,避免同步阻塞当前线程。
124+ 
125+ > **注意:**
126+ >
127+ > 内录采集器不能通过`start()`接口启动。调用`requestPlaybackCaptureStart()`后,只有收到`STATE_SUCCESS`时,应用才应认为内录已启动成功。
128+ 
129+ ``` TypeScript
wanglu11941024

加点注释呗,下同

likedislike
130+ if (audioCapturer === undefined) {
131+ return;
132+ }
133+ // 为每次异步启动请求分配唯一ID,避免旧请求回调修改当前状态。
134+ const requestId: number = ++playbackCaptureRequestId;
135+ const capturer: audio.AudioCapturer = audioCapturer;
136+ capturer.requestPlaybackCaptureStart((state: audio.PlaybackCaptureStartState): void => {
137+ if (audioCapturer !== capturer || playbackCaptureRequestId !== requestId) {
138+ return;
139+ }
140+ playbackCaptureStartState = state;
141+ 
142+ if (state === audio.PlaybackCaptureStartState.STATE_SUCCESS) {
143+ isPlaybackCaptureStarted = true;
144+ console.info('Succeeded in starting playback capture.');
145+ return;
146+ }
147+ releasePlaybackCapture().catch((error: BusinessError): void => {
148+ console.error(`Release playback capture failed, code is ${error.code}, message is ${error.message}`);
149+ });
150+ });
151+ ```
152+ 
153+ 启动结果请参考[PlaybackCaptureStartState](../../reference/apis-audio-kit/arkts-apis-audio-e.md#playbackcapturestartstate)。如果启动结果不是`STATE_SUCCESS`,应用应根据业务提示用户,并及时释放已创建的AudioCapturer实例。应用主动停止内录流后,还应忽略旧请求返回的异步回调。
154+ 
155+5. 调用[stop](../../reference/apis-audio-kit/arkts-apis-audio-AudioCapturer.md#stop8)停止采集,并调用[release](../../reference/apis-audio-kit/arkts-apis-audio-AudioCapturer.md#release8)释放AudioCapturer资源。
156+ 
157+ 应用结束内录后,需要停止AudioCapturer并释放资源。释放前应取消`readData`监听,避免对象释放后仍处理回调。
158+ 
159+ ``` TypeScript
160+ async function releasePlaybackCapture(): Promise<void> {
161+ if (audioCapturer === undefined) {
7
777_cc7月21日

这里示例代码请确认一下:audioCapturer 被声明为非可选类型 audio.AudioCapturer,后续却和 undefined 比较,并赋值为 undefined。

likedislike
yangjcc
23 天前 评论:
162+ return;
163+ }
164+ const capturer: audio.AudioCapturer = audioCapturer;
165+ audioCapturer = undefined;
166+ playbackCaptureRequestId++;
167+ capturer.off('readData', readDataCallback);
168+ try {
169+ if (isPlaybackCaptureStarted) {
170+ await capturer.stop();
171+ }
172+ } finally {
173+ isPlaybackCaptureStarted = false;
174+ await capturer.release();
175+ }
176+ }
177+ ```
178+ 
179+### OH_AudioCapturer(C API)开发步骤及注意事项
180+ 
181+以下C/C++示例为片段代码,展示创建、启动、停止和释放OH_AudioCapturer的完整生命周期。OH_AudioCapturer的基础录制流程可参考[推荐使用OHAudio开发音频录制功能(C/C++)](using-ohaudio-for-recording.md)。
182+ 
183+1. 引入头文件,并定义用于保存内录采集器及启动状态的变量。
184+ 
185+ 内录启动接口为异步接口,需要在启动函数返回后继续保存`OH_AudioCapturer`实例,确保在启动结果回调中处理失败场景,并在业务结束时停止和释放实例。互斥锁(Mutual Exclusion Lock)用于保护全局采集器指针,避免启动结果回调、重复启动和主动停止同时访问该指针。
186+ 
187+ ``` C++
188+ #include <atomic>
189+ #include <cstdint>
190+ #include <mutex>
191+ #include <ohaudio/native_audiocapturer.h>
192+ #include <ohaudio/native_audiostream_base.h>
193+ #include <ohaudio/native_audiostreambuilder.h>
194+ 
195+ constexpr int32_t PLAYBACK_CAPTURE_SAMPLE_RATE = 48000;
196+ constexpr int32_t PLAYBACK_CAPTURE_CHANNEL_COUNT = 2;
197+ constexpr uint32_t PLAYBACK_CAPTURE_MODE = AUDIOSTREAM_PLAYBACKCAPTURE_MODE_MEDIA |
198+ AUDIOSTREAM_PLAYBACKCAPTURE_MODE_EXCLUDING_SELF;
199+ 
200+ std::mutex g_playbackCaptureMutex;
201+ OH_AudioCapturer* g_playbackCaptureCapturer = nullptr;
202+ std::atomic<int32_t> g_playbackCaptureStartState{-1};
203+ std::atomic<uint64_t> g_playbackCaptureReadBytes{0};
204+ ```
205+ 
206+2. 定义音频数据回调和内录启动结果回调。
207+ 
208+ 音频数据回调返回内录PCM数据,不建议在回调中执行耗时任务。内录启动失败或用户未授权时,及时释放已创建的采集器。
209+ 
210+ ``` C++
211+ void MyOnPlaybackCaptureReadData(
212+ OH_AudioCapturer* capturer,
213+ void* userData,
214+ void* audioData,
215+ int32_t audioDataSize)
216+ {
217+ if (audioData == nullptr || audioDataSize <= 0) {
218+ return;
219+ }
220+ g_playbackCaptureReadBytes.fetch_add(static_cast<uint64_t>(audioDataSize));
221+ }
222+ 
223+ void MyOnPlaybackCaptureStart(OH_AudioCapturer* capturer, void* userData,
224+ OH_AudioStream_PlaybackCaptureStartState state)
225+ {
226+ int32_t stateValue = static_cast<int32_t>(state);
227+ g_playbackCaptureStartState.store(stateValue);
228+ 
229+ if (state == AUDIOSTREAM_PLAYBACKCAPTURE_START_STATE_SUCCESS) {
230+ return;
231+ }
232+ 
233+ OH_AudioCapturer* capturerToRelease = nullptr;
234+ {
235+ std::lock_guard<std::mutex> lock(g_playbackCaptureMutex);
236+ if (g_playbackCaptureCapturer == capturer) {
237+ capturerToRelease = g_playbackCaptureCapturer;
238+ g_playbackCaptureCapturer = nullptr;
239+ }
240+ }
241+ if (capturerToRelease != nullptr) {
242+ OH_AudioCapturer_Release(capturerToRelease);
243+ }
244+ }
245+ ```
246+ 
247+3. 创建音频采集器并配置内录模式。
248+ 
249+ 通过[OH_AudioStreamBuilder_SetPlaybackCaptureMode()](../../reference/apis-audio-kit/capi-native-audiostreambuilder-h.md#oh_audiostreambuilder_setplaybackcapturemode)配置内录模式。内录启动时,系统会进行用户授权检查,并通过启动结果回调返回授权结果。
250+ 
251+ 当前支持的内录模式如下:
252+ 
253+ | 内录模式 | 录制范围 |
254+ | -------- | -------- |
255+ | `AUDIOSTREAM_PLAYBACKCAPTURE_MODE_DEFAULT` | 默认模式,录制大部分音频流,不包括提示音流和隐私流。 |
256+ | `AUDIOSTREAM_PLAYBACKCAPTURE_MODE_MEDIA` | 媒体模式,录制媒体、语音消息和未知流等。 |
257+ | `AUDIOSTREAM_PLAYBACKCAPTURE_MODE_EXCLUDING_SELF` | 排除自身模式,录制除应用自身播放音频以外的音频流。 |
258+ | `AUDIOSTREAM_PLAYBACKCAPTURE_MODE_MEDIA \| AUDIOSTREAM_PLAYBACKCAPTURE_MODE_EXCLUDING_SELF` | 录制媒体类音频,同时排除应用自身播放的音频。 |
259+ 
260+ 单独使用排除自身模式时,会录制大部分允许被采集的音频流并排除应用自身播放的音频;与媒体模式组合时,只录制媒体类音频并排除应用自身播放的音频。
261+ 
262+ <!-- @[SetPlaybackCaptureMode](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/Media/Audio/AudioCapturerSampleC/entry/src/main/cpp/AudioCapture.cpp) -->
263+ ``` C++
264+ bool ConfigurePlaybackCaptureBuilder(OH_AudioStreamBuilder* builder)
265+ {
266+ OH_AudioStreamBuilder_SetSamplingRate(builder, PLAYBACK_CAPTURE_SAMPLE_RATE);
267+ OH_AudioStreamBuilder_SetChannelCount(builder, PLAYBACK_CAPTURE_CHANNEL_COUNT);
268+ OH_AudioStreamBuilder_SetSampleFormat(builder, AUDIOSTREAM_SAMPLE_S16LE);
269+ OH_AudioStreamBuilder_SetEncodingType(builder, AUDIOSTREAM_ENCODING_TYPE_RAW);
270+ OH_AudioStreamBuilder_SetCapturerReadDataCallback(builder, MyOnPlaybackCaptureReadData, nullptr);
271+ 
272+ OH_AudioStream_Result result =
273+ OH_AudioStreamBuilder_SetPlaybackCaptureMode(builder, PLAYBACK_CAPTURE_MODE);
274+ return result == AUDIOSTREAM_SUCCESS;
275+ }
276+ 
277+ OH_AudioCapturer* CreatePlaybackCapture()
278+ {
279+ OH_AudioStreamBuilder* builder = nullptr;
280+ OH_AudioStream_Result result =
281+ OH_AudioStreamBuilder_Create(&builder, AUDIOSTREAM_TYPE_CAPTURER);
282+ if (result != AUDIOSTREAM_SUCCESS || builder == nullptr) {
283+ return nullptr;
284+ }
285+ if (!ConfigurePlaybackCaptureBuilder(builder)) {
286+ OH_AudioStreamBuilder_Destroy(builder);
287+ return nullptr;
288+ }
289+ 
290+ OH_AudioCapturer* audioCapturer = nullptr;
291+ result = OH_AudioStreamBuilder_GenerateCapturer(builder, &audioCapturer);
292+ OH_AudioStreamBuilder_Destroy(builder);
293+ if (result != AUDIOSTREAM_SUCCESS || audioCapturer == nullptr) {
294+ return nullptr;
295+ }
296+ return audioCapturer;
297+ }
298+ 
299+ bool StorePlaybackCapture(OH_AudioCapturer* audioCapturer)
300+ {
301+ std::lock_guard<std::mutex> lock(g_playbackCaptureMutex);
302+ if (g_playbackCaptureCapturer != nullptr) {
303+ return false;
304+ }
305+ g_playbackCaptureCapturer = audioCapturer;
306+ g_playbackCaptureStartState.store(-1);
307+ g_playbackCaptureReadBytes.store(0);
308+ return true;
309+ }
310+ 
311+ <!-- @[RequestPlaybackCaptureStart](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/Media/Audio/AudioCapturerSampleC/entry/src/main/cpp/AudioCapture.cpp) -->
O
改动建议
311
- <!-- @[RequestPlaybackCaptureStart](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/Media/Audio/AudioCapturerSampleC/entry/src/main/cpp/AudioCapture.cpp) -->
311
+ <!-- @[RequestPlaybackCaptureStart](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/Media/Audio/AudioCapturerSampleC/entry/src/main/cpp/AudioCapture.cpp) -->
312
+
313
+ ``` C++
314
+ OH_AudioStream_Result result = OH_AudioCapturer_RequestPlaybackCaptureStart(
315
+ audioCapturer, MyOnPlaybackCaptureStart, nullptr);
316
+ ```
应用建议
likedislike
312+ bool RequestPlaybackCaptureStart(OH_AudioCapturer* audioCapturer)
313+ {
314+ OH_AudioStream_Result result = OH_AudioCapturer_RequestPlaybackCaptureStart(
315+ audioCapturer, MyOnPlaybackCaptureStart, nullptr);
316+ if (result == AUDIOSTREAM_SUCCESS) {
317+ return true;
318+ }
319+ 
320+ bool shouldRelease = false;
321+ {
322+ std::lock_guard<std::mutex> lock(g_playbackCaptureMutex);
323+ if (g_playbackCaptureCapturer == audioCapturer) {
324+ g_playbackCaptureCapturer = nullptr;
325+ shouldRelease = true;
326+ }
327+ }
328+ if (shouldRelease) {
329+ OH_AudioCapturer_Release(audioCapturer);
330+ }
331+ return false;
332+ }
333+ 
334+ void StartPlaybackCapture()
335+ {
336+ {
337+ std::lock_guard<std::mutex> lock(g_playbackCaptureMutex);
338+ if (g_playbackCaptureCapturer != nullptr) {
339+ return;
340+ }
341+ }
342+ 
343+ OH_AudioCapturer* audioCapturer = CreatePlaybackCapture();
344+ if (audioCapturer == nullptr) {
345+ return;
346+ }
347+ if (!StorePlaybackCapture(audioCapturer)) {
348+ OH_AudioCapturer_Release(audioCapturer);
349+ return;
350+ }
351+ RequestPlaybackCaptureStart(audioCapturer);
352+ }
353+ ```
O
Oopenharmony-docs-bot23 天前

此条代码评论区间+262+353

改动建议
262
262
  <!-- @[SetPlaybackCaptureMode](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/Media/Audio/AudioCapturerSampleC/entry/src/main/cpp/AudioCapture.cpp) -->
263
+
263
264
  ``` C++
264
- bool ConfigurePlaybackCaptureBuilder(OH_AudioStreamBuilder* builder)
265
- {
266
- OH_AudioStreamBuilder_SetSamplingRate(builder, PLAYBACK_CAPTURE_SAMPLE_RATE);
267
- OH_AudioStreamBuilder_SetChannelCount(builder, PLAYBACK_CAPTURE_CHANNEL_COUNT);
268
- OH_AudioStreamBuilder_SetSampleFormat(builder, AUDIOSTREAM_SAMPLE_S16LE);
269
- OH_AudioStreamBuilder_SetEncodingType(builder, AUDIOSTREAM_ENCODING_TYPE_RAW);
270
- OH_AudioStreamBuilder_SetCapturerReadDataCallback(builder, MyOnPlaybackCaptureReadData, nullptr);
271
-
272
- OH_AudioStream_Result result =
265
+ OH_AudioStream_Result playbackCaptureModeResult =
273
- OH_AudioStreamBuilder_SetPlaybackCaptureMode(builder, PLAYBACK_CAPTURE_MODE);
266
+ OH_AudioStreamBuilder_SetPlaybackCaptureMode(builder, PLAYBACK_CAPTURE_MODE);
274
- return result == AUDIOSTREAM_SUCCESS;
275
- }
276
-
277
- OH_AudioCapturer* CreatePlaybackCapture()
278
- {
279
- OH_AudioStreamBuilder* builder = nullptr;
280
- OH_AudioStream_Result result =
281
- OH_AudioStreamBuilder_Create(&builder, AUDIOSTREAM_TYPE_CAPTURER);
282
- if (result != AUDIOSTREAM_SUCCESS || builder == nullptr) {
283
- return nullptr;
284
- }
285
- if (!ConfigurePlaybackCaptureBuilder(builder)) {
286
- OH_AudioStreamBuilder_Destroy(builder);
287
- return nullptr;
288
- }
289
-
290
- OH_AudioCapturer* audioCapturer = nullptr;
291
- result = OH_AudioStreamBuilder_GenerateCapturer(builder, &audioCapturer);
292
- OH_AudioStreamBuilder_Destroy(builder);
293
- if (result != AUDIOSTREAM_SUCCESS || audioCapturer == nullptr) {
294
- return nullptr;
295
- }
296
- return audioCapturer;
297
- }
298
-
299
- bool StorePlaybackCapture(OH_AudioCapturer* audioCapturer)
300
- {
301
- std::lock_guard<std::mutex> lock(g_playbackCaptureMutex);
302
- if (g_playbackCaptureCapturer != nullptr) {
303
- return false;
304
- }
305
- g_playbackCaptureCapturer = audioCapturer;
306
- g_playbackCaptureStartState.store(-1);
307
- g_playbackCaptureReadBytes.store(0);
308
- return true;
309
- }
310
-
311
- <!-- @[RequestPlaybackCaptureStart](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/Media/Audio/AudioCapturerSampleC/entry/src/main/cpp/AudioCapture.cpp) -->
312
- bool RequestPlaybackCaptureStart(OH_AudioCapturer* audioCapturer)
313
- {
314
- OH_AudioStream_Result result = OH_AudioCapturer_RequestPlaybackCaptureStart(
315
- audioCapturer, MyOnPlaybackCaptureStart, nullptr);
316
- if (result == AUDIOSTREAM_SUCCESS) {
317
- return true;
318
- }
319
-
320
- bool shouldRelease = false;
321
- {
322
- std::lock_guard<std::mutex> lock(g_playbackCaptureMutex);
323
- if (g_playbackCaptureCapturer == audioCapturer) {
324
- g_playbackCaptureCapturer = nullptr;
325
- shouldRelease = true;
326
- }
327
- }
328
- if (shouldRelease) {
329
- OH_AudioCapturer_Release(audioCapturer);
330
- }
331
- return false;
332
- }
333
-
334
- void StartPlaybackCapture()
335
- {
336
- {
337
- std::lock_guard<std::mutex> lock(g_playbackCaptureMutex);
338
- if (g_playbackCaptureCapturer != nullptr) {
339
- return;
340
- }
341
- }
342
-
343
- OH_AudioCapturer* audioCapturer = CreatePlaybackCapture();
344
- if (audioCapturer == nullptr) {
345
- return;
346
- }
347
- if (!StorePlaybackCapture(audioCapturer)) {
348
- OH_AudioCapturer_Release(audioCapturer);
349
- return;
350
- }
351
- RequestPlaybackCaptureStart(audioCapturer);
352
- }
353
267
  ```
应用建议
likedislike
354+ 
355+ 生成`OH_AudioCapturer`后,构造器不再使用,需要立即调用`OH_AudioStreamBuilder_Destroy()`释放构造器资源。设置内录模式失败时也需要销毁构造器。
356+ 
357+ > **注意:**
358+ >
359+ > - `OH_AudioCapturer_RequestPlaybackCaptureStart()`返回`AUDIOSTREAM_SUCCESS`仅表示启动请求提交成功。只有异步回调返回`AUDIOSTREAM_PLAYBACKCAPTURE_START_STATE_SUCCESS`时,才表示内录启动成功。
360+ > - 用户拒绝授权或系统未能拉起授权弹框时,回调返回`AUDIOSTREAM_PLAYBACKCAPTURE_START_STATE_NOT_AUTHORIZED`
361+
362+4. 停止并释放内录采集器。
363+ 
364+ 业务结束后,通过[OH_AudioCapturer_Stop()](../../reference/apis-audio-kit/capi-native-audiocapturer-h.md#oh_audiocapturer_stop)停止采集,并通过[OH_AudioCapturer_Release()](../../reference/apis-audio-kit/capi-native-audiocapturer-h.md#oh_audiocapturer_release)释放资源。
365+ 
366+ ``` C++
367+ void StopPlaybackCapture()
368+ {
369+ OH_AudioCapturer* capturerToRelease = nullptr;
370+ {
371+ std::lock_guard<std::mutex> lock(g_playbackCaptureMutex);
372+ capturerToRelease = g_playbackCaptureCapturer;
373+ g_playbackCaptureCapturer = nullptr;
374+ }
375+ if (capturerToRelease == nullptr) {
376+ return;
377+ }
378+ 
379+ OH_AudioCapturer_Stop(capturerToRelease);
380+ OH_AudioCapturer_Release(capturerToRelease);
381+ g_playbackCaptureStartState.store(-1);
382+ g_playbackCaptureReadBytes.store(0);
383+ }
384+ ```
385+ 
386+### 配置目标播放流的内录策略
387+ 
388+播放端可以通过配置自身音频流的隐私属性,控制是否允许其他应用录制。系统建立内录采集链路时,会过滤标记为隐私保护的播放流,因此通话内容、账号信息或其他隐私内容不会被内录采集。该配置属于播放端能力,不需要内录应用额外处理。
389+ 
390+- 使用ArkTS API开发时,播放端可通过[AudioRendererOptions](../../reference/apis-audio-kit/arkts-apis-audio-i.md#audiorendereroptions8)中的`privacyType`控制播放流是否允许被其他应用录制。
391+- 使用C API开发时,播放端可通过[OH_AudioStreamBuilder_SetRendererPrivacy()](../../reference/apis-audio-kit/capi-native-audiostreambuilder-h.md#oh_audiostreambuilder_setrendererprivacy)控制播放流是否允许被其他应用录制。
@@ -50,8 +50,8 @@
50| [typedef void (\*OH_AudioCapturer_OnErrorCallback)(OH_AudioCapturer* capturer, void* userData, OH_AudioStream_Result error)](#oh_audiocapturer_onerrorcallback) | OH_AudioCapturer_OnErrorCallback | 音频录制流的错误事件回调函数。 |50| [typedef void (\*OH_AudioCapturer_OnErrorCallback)(OH_AudioCapturer* capturer, void* userData, OH_AudioStream_Result error)](#oh_audiocapturer_onerrorcallback) | OH_AudioCapturer_OnErrorCallback | 音频录制流的错误事件回调函数。 |
51| [OH_AudioStream_Result OH_AudioCapturer_GetFastStatus(OH_AudioCapturer* capturer, OH_AudioStream_FastStatus* status)](#oh_audiocapturer_getfaststatus) | - | 获取音频录制过程中的运行状态,是否在低时延状态下工作。 |51| [OH_AudioStream_Result OH_AudioCapturer_GetFastStatus(OH_AudioCapturer* capturer, OH_AudioStream_FastStatus* status)](#oh_audiocapturer_getfaststatus) | - | 获取音频录制过程中的运行状态,是否在低时延状态下工作。 |
52| [typedef void (\*OH_AudioCapturer_OnFastStatusChange)(OH_AudioCapturer* capturer, void* userData, OH_AudioStream_FastStatus status)](#oh_audiocapturer_onfaststatuschange) | OH_AudioCapturer_OnFastStatusChange | 音频录制过程中低时延状态改变事件的回调函数。 |52| [typedef void (\*OH_AudioCapturer_OnFastStatusChange)(OH_AudioCapturer* capturer, void* userData, OH_AudioStream_FastStatus status)](#oh_audiocapturer_onfaststatuschange) | OH_AudioCapturer_OnFastStatusChange | 音频录制过程中低时延状态改变事件的回调函数。 |
53-| [typedef void (\*OH_AudioCapturer_OnPlaybackCaptureStartCallback)(OH_AudioCapturer* capturer, void* userData, OH_AudioStream_PlaybackCaptureStartState state)](#oh_audiocapturer_onplaybackcapturestartcallback) | OH_AudioCapturer_OnPlaybackCaptureStartCallback | 音频录制过程中用于内录(录制的是设备内部应用的声音)启动结果的回调函数。该API暂不支持。 |53+| [typedef void (\*OH_AudioCapturer_OnPlaybackCaptureStartCallback)(OH_AudioCapturer* capturer, void* userData, OH_AudioStream_PlaybackCaptureStartState state)](#oh_audiocapturer_onplaybackcapturestartcallback) | OH_AudioCapturer_OnPlaybackCaptureStartCallback | 音频录制过程中用于内录(录制的是设备内部应用的声音)启动结果的回调函数。该API最初仅特定系统应用可用,从API版本26.0.0开始,支持任意应用使用。 |
54-| [OH_AudioStream_Result OH_AudioCapturer_RequestPlaybackCaptureStart(OH_AudioCapturer* capturer, OH_AudioCapturer_OnPlaybackCaptureStartCallback callback, void* userData)](#oh_audiocapturer_requestplaybackcapturestart) | - | 异步请求启动内录流。该函数是非阻塞的,意味着系统在接收到启动请求后,将继续处理用户授权和内录流的启动。<br> 最终结果将通过回调函数返回。该API暂不支持。 |54+| [OH_AudioStream_Result OH_AudioCapturer_RequestPlaybackCaptureStart(OH_AudioCapturer* capturer, OH_AudioCapturer_OnPlaybackCaptureStartCallback callback, void* userData)](#oh_audiocapturer_requestplaybackcapturestart) | - | 异步请求启动内录流。该函数是非阻塞的,意味着系统在接收到启动请求后,将继续处理用户授权和内录流的启动。<br>最终结果将通过回调函数返回。该API最初仅特定系统应用可用,从API版本26.0.0开始,支持任意应用使用。 |
55| [OH_AudioStream_Result OH_AudioCapturer_SetIndependentAudioSessionStrategy(OH_AudioCapturer* capturer, const OH_AudioSession_Strategy* strategy, uint32_t behavior)](#oh_audiocapturer_setindependentaudiosessionstrategy) | - | 设置独立的音频会话策略和行为参数。当音频采集器在运行状态时调用此接口后,必须重新调用接口[OH_AudioCapturer_Start](capi-native-audiocapturer-h.md#oh_audiocapturer_start)使其生效。 |55| [OH_AudioStream_Result OH_AudioCapturer_SetIndependentAudioSessionStrategy(OH_AudioCapturer* capturer, const OH_AudioSession_Strategy* strategy, uint32_t behavior)](#oh_audiocapturer_setindependentaudiosessionstrategy) | - | 设置独立的音频会话策略和行为参数。当音频采集器在运行状态时调用此接口后,必须重新调用接口[OH_AudioCapturer_Start](capi-native-audiocapturer-h.md#oh_audiocapturer_start)使其生效。 |
56| [OH_AudioStream_Result OH_AudioCapturer_SetNoiseReductionMode(OH_AudioCapturer* capturer, OH_AudioNoiseReductionMode noiseReductionMode)](#oh_audiocapturer_setnoisereductionmode) | - | 设置当前录音流的降噪模式。 |56| [OH_AudioStream_Result OH_AudioCapturer_SetNoiseReductionMode(OH_AudioCapturer* capturer, OH_AudioNoiseReductionMode noiseReductionMode)](#oh_audiocapturer_setnoisereductionmode) | - | 设置当前录音流的降噪模式。 |
57| [OH_AudioStream_Result OH_AudioCapturer_GetNoiseReductionMode(OH_AudioCapturer* capturer, OH_AudioNoiseReductionMode* noiseReductionMode)](#oh_audiocapturer_getnoisereductionmode) | - | 获取当前录音流的降噪模式。 |57| [OH_AudioStream_Result OH_AudioCapturer_GetNoiseReductionMode(OH_AudioCapturer* capturer, OH_AudioNoiseReductionMode* noiseReductionMode)](#oh_audiocapturer_getnoisereductionmode) | - | 获取当前录音流的降噪模式。 |
@@ -673,9 +673,9 @@ typedef void (*OH_AudioCapturer_OnPlaybackCaptureStartCallback)(OH_AudioCapturer
673 673 
674**描述**674**描述**
675 675 
676-音频录制过程中用于内录(录制的是设备内部应用的声音)启动结果的回调函数。该API暂不支持。676+音频录制过程中用于内录(录制的是设备内部应用的声音)启动结果的回调函数。该API最初仅特定系统应用可用,从API版本26.0.0开始,支持任意应用使用
677- 677+ 
678-**起始版本:** 23678+**起始版本:** 23
679 679 
680**参数:**680**参数:**
681 681 
@@ -693,9 +693,9 @@ OH_AudioStream_Result OH_AudioCapturer_RequestPlaybackCaptureStart(OH_AudioCaptu
693 693 
694**描述**694**描述**
695 695 
696-异步请求启动内录流。该函数是非阻塞的,意味着系统在接收到启动请求后,将继续处理用户授权和内录流的启动。<br> 最终结果将通过回调函数返回。该API暂不支持。696+异步请求启动内录流。该函数是非阻塞的,意味着系统在接收到启动请求后,将继续处理用户授权和内录流的启动。<br>最终结果将通过回调函数返回。该API最初仅特定系统应用可用,从API版本26.0.0开始,支持任意应用使用
697- 697+ 
698-**起始版本:** 23698+**起始版本:** 23
699 699 
700**参数:**700**参数:**
701 701 
@@ -57,8 +57,8 @@
57| [OH_AudioStream_PrivacyType](#oh_audiostream_privacytype) | OH_AudioStream_PrivacyType | 用于标识对应播放音频流是否支持被其他应用录制。 |57| [OH_AudioStream_PrivacyType](#oh_audiostream_privacytype) | OH_AudioStream_PrivacyType | 用于标识对应播放音频流是否支持被其他应用录制。 |
58| [OH_AudioData_Callback_Result](#oh_audiodata_callback_result) | OH_AudioData_Callback_Result | 定义音频数据回调结果。 |58| [OH_AudioData_Callback_Result](#oh_audiodata_callback_result) | OH_AudioData_Callback_Result | 定义音频数据回调结果。 |
59| [OH_AudioStream_LatencyType](#oh_audiostream_latencytype) | OH_AudioStream_LatencyType | 定义音频时延类型。 |59| [OH_AudioStream_LatencyType](#oh_audiostream_latencytype) | OH_AudioStream_LatencyType | 定义音频时延类型。 |
60-| [OH_AudioStream_PlaybackCaptureMode](#oh_audiostream_playbackcapturemode) | OH_AudioStream_PlaybackCaptureMode | 表示内录(录制设备内部应用的声音)的过滤类型,每种过滤类型可录制不同的播放流类型。该API暂不支持。 |60+| [OH_AudioStream_PlaybackCaptureMode](#oh_audiostream_playbackcapturemode) | OH_AudioStream_PlaybackCaptureMode | 表示内录(录制设备内部应用的声音)的过滤类型,每种过滤类型可录制不同的播放流类型。该API最初仅特定系统应用可用,从API版本26.0.0开始,支持任意应用使用。 |
61-| [OH_AudioStream_PlaybackCaptureStartState](#oh_audiostream_playbackcapturestartstate) | OH_AudioStream_PlaybackCaptureStartState | 定义内录的启动状态,该状态在调用[OH_AudioCapturer_RequestPlaybackCaptureStart](./capi-native-audiocapturer-h.md#oh_audiocapturer_requestplaybackcapturestart)函数后异步返回。该API暂不支持。 |61+| [OH_AudioStream_PlaybackCaptureStartState](#oh_audiostream_playbackcapturestartstate) | OH_AudioStream_PlaybackCaptureStartState | 定义内录的启动状态,该状态在调用[OH_AudioCapturer_RequestPlaybackCaptureStart](./capi-native-audiocapturer-h.md#oh_audiocapturer_requestplaybackcapturestart)函数后异步返回。该API最初仅特定系统应用可用,从API版本26.0.0开始,支持任意应用使用。 |
62 62 
63### 函数63### 函数
64 64 
@@ -469,15 +469,15 @@ enum OH_AudioStream_PlaybackCaptureMode
469 469 
470**描述**470**描述**
471 471 
472-表示内录(录制设备内部应用的声音)的过滤类型,每种过滤类型可录制不同的播放流类型。该API暂不支持。472+表示内录(录制设备内部应用的声音)的过滤类型,每种过滤类型可录制不同的播放流类型。该API最初仅特定系统应用可用,从API版本26.0.0开始,支持任意应用使用
473- 473+ 
474-**起始版本:** 23474+**起始版本:** 23
475- 475+ 
476-| 枚举项 | 描述 |476+| 枚举项 | 描述 |
477-| -- | -- |477+| -- | -- |
478-| AUDIOSTREAM_PLAYBACKCAPTURE_MODE_DEFAULT = 0x0 | 默认模式。录制大部分音频流,但不包括提示音流和隐私流。<br>**起始版本:** 23 |478+| AUDIOSTREAM_PLAYBACKCAPTURE_MODE_DEFAULT = 0x0 | 默认模式。录制大部分音频流,但不包括提示音流和隐私流。<br>**起始版本:** 23 |
479-| AUDIOSTREAM_PLAYBACKCAPTURE_MODE_MEDIA = 0x1 | 媒体模式。获取媒体、语音消息和未知流等。<br>**起始版本:** 23 |479+| AUDIOSTREAM_PLAYBACKCAPTURE_MODE_MEDIA = 0x1 | 媒体模式。获取媒体、语音消息和未知流等。<br>**起始版本:** 23 |
480-| AUDIOSTREAM_PLAYBACKCAPTURE_MODE_EXCLUDING_SELF = 0x8000 | 排除自身模式。获取除应用自身播放的音频以外的流。<br>**起始版本:** 23 |480+| AUDIOSTREAM_PLAYBACKCAPTURE_MODE_EXCLUDING_SELF = 0x8000 | 排除自身模式。获取除应用自身播放的音频以外的流。<br>**起始版本:** 23 |
481 481 
482### OH_AudioStream_PlaybackCaptureStartState482### OH_AudioStream_PlaybackCaptureStartState
483 483 
@@ -487,15 +487,15 @@ enum OH_AudioStream_PlaybackCaptureStartState
487 487 
488**描述**488**描述**
489 489 
490-定义内录的启动状态,该状态在调用[OH_AudioCapturer_RequestPlaybackCaptureStart](./capi-native-audiocapturer-h.md#oh_audiocapturer_requestplaybackcapturestart)函数后异步返回。该API暂不支持。490+定义内录的启动状态,该状态在调用[OH_AudioCapturer_RequestPlaybackCaptureStart](./capi-native-audiocapturer-h.md#oh_audiocapturer_requestplaybackcapturestart)函数后异步返回。该API最初仅特定系统应用可用,从API版本26.0.0开始,支持任意应用使用
491- 491+ 
492-**起始版本:** 23492+**起始版本:** 23
493- 493+ 
494-| 枚举项 | 描述 |494+| 枚举项 | 描述 |
495-| -- | -- |495+| -- | -- |
496-| AUDIOSTREAM_PLAYBACKCAPTURE_START_STATE_SUCCESS = 0 | 启动内录成功。<br>**起始版本:** 23 |496+| AUDIOSTREAM_PLAYBACKCAPTURE_START_STATE_SUCCESS = 0 | 启动内录成功。<br>**起始版本:** 23 |
497-| AUDIOSTREAM_PLAYBACKCAPTURE_START_STATE_FAILED = 1 | 启动内录失败。原因是请求焦点(根据流类型做优先级的选择)过程中被打断,或发生系统内部错误。<br>**起始版本:** 23 |497+| AUDIOSTREAM_PLAYBACKCAPTURE_START_STATE_FAILED = 1 | 启动内录失败。原因是请求焦点(根据流类型做优先级的选择)过程中被打断,或发生系统内部错误。<br>**起始版本:** 23 |
498-| AUDIOSTREAM_PLAYBACKCAPTURE_START_STATE_NOT_AUTHORIZED = 2 | 用户未授权,启动内录失败。<br>**起始版本:** 23 |498+| AUDIOSTREAM_PLAYBACKCAPTURE_START_STATE_NOT_AUTHORIZED = 2 | 用户未授权,启动内录失败。<br>**起始版本:** 23 |
499 499 
500 500 
501## 函数说明501## 函数说明
@@ -58,7 +58,7 @@
58| [OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererFastStatusChangeCallback(OH_AudioStreamBuilder* builder, OH_AudioRenderer_OnFastStatusChange callback, void* userData)](#oh_audiostreambuilder_setrendererfaststatuschangecallback) | 设置音频播放过程中低时延状态改变事件的回调函数。 |58| [OH_AudioStream_Result OH_AudioStreamBuilder_SetRendererFastStatusChangeCallback(OH_AudioStreamBuilder* builder, OH_AudioRenderer_OnFastStatusChange callback, void* userData)](#oh_audiostreambuilder_setrendererfaststatuschangecallback) | 设置音频播放过程中低时延状态改变事件的回调函数。 |
59| [OH_AudioStream_Result OH_AudioStreamBuilder_SetCapturerFastStatusChangeCallback(OH_AudioStreamBuilder* builder, OH_AudioCapturer_OnFastStatusChange callback, void* userData)](#oh_audiostreambuilder_setcapturerfaststatuschangecallback) | 设置音频录制过程中低时延状态改变事件的回调函数。 |59| [OH_AudioStream_Result OH_AudioStreamBuilder_SetCapturerFastStatusChangeCallback(OH_AudioStreamBuilder* builder, OH_AudioCapturer_OnFastStatusChange callback, void* userData)](#oh_audiostreambuilder_setcapturerfaststatuschangecallback) | 设置音频录制过程中低时延状态改变事件的回调函数。 |
60| [OH_AudioStream_Result OH_AudioStreamBuilder_SetCapturerLoopbackEffectEnabled(OH_AudioStreamBuilder* builder, bool enabled)](#oh_audiostreambuilder_setcapturerloopbackeffectenabled) | 设置音频录制流是否采集带音频混响效果的音频数据。当音频环回设置为硬件模式并启用混响效果时,低时延模式的采集器可以获取到具备混响效果的录音数据。 |60| [OH_AudioStream_Result OH_AudioStreamBuilder_SetCapturerLoopbackEffectEnabled(OH_AudioStreamBuilder* builder, bool enabled)](#oh_audiostreambuilder_setcapturerloopbackeffectenabled) | 设置音频录制流是否采集带音频混响效果的音频数据。当音频环回设置为硬件模式并启用混响效果时,低时延模式的采集器可以获取到具备混响效果的录音数据。 |
61-| [OH_AudioStream_Result OH_AudioStreamBuilder_SetPlaybackCaptureMode(OH_AudioStreamBuilder* builder, uint32_t mode)](#oh_audiostreambuilder_setplaybackcapturemode) | 在使用内录(录制设备内部应用的声音)时设置可以录制的音频模式,该模式将决定要录制的音频流类型。此功能仅适用于[AudioStream_Type_Capturer](./capi-native-audiostream-base-h.md#oh_audiostream_type)类型。该API暂不支持。 |61+| [OH_AudioStream_Result OH_AudioStreamBuilder_SetPlaybackCaptureMode(OH_AudioStreamBuilder* builder, uint32_t mode)](#oh_audiostreambuilder_setplaybackcapturemode) | 在使用内录(录制设备内部应用的声音)时设置可以录制的音频模式,该模式将决定要录制的音频流类型。此功能仅适用于[AudioStream_Type_Capturer](./capi-native-audiostream-base-h.md#oh_audiostream_type)类型。该API最初仅特定系统应用可用,从API版本26.0.0开始,支持任意应用使用。 |
62| [OH_AudioStream_Result OH_AudioStreamBuilder_SetSensitiveRecordPermitCallback(OH_AudioStreamBuilder* builder, OH_AudioCapturer_SensitiveRecordPermitCallback callback, void* userData)](#oh_audiostreambuilder_setsensitiverecordpermitcallback) | 设置蜂窝通话下行录音风险提示语播放结束的回调函数。仅在使用[OH_AudioStream_SourceType](capi-native-audiostream-base-h.md#oh_audiostream_sourcetype).AUDIOSTREAM_SOURCE_TYPE_VOICE_DOWNLINK录制时需要设置此函数。此回调必须成功设置,否则采集器无法创建。音频采集器创建后,风险提示语将自动添加到发送给通话对方的语音数据中。应用应等待回调结果后再启动采集器,否则[OH_AudioCapturer_Start](capi-native-audiocapturer-h.md#oh_audiocapturer_start)将返回错误。请确保音频采集器在蜂窝通话开始后创建,否则[OH_AudioStreamBuilder_GenerateCapturer](capi-native-audiostreambuilder-h.md#oh_audiostreambuilder_generatecapturer)将返回错误。 |62| [OH_AudioStream_Result OH_AudioStreamBuilder_SetSensitiveRecordPermitCallback(OH_AudioStreamBuilder* builder, OH_AudioCapturer_SensitiveRecordPermitCallback callback, void* userData)](#oh_audiostreambuilder_setsensitiverecordpermitcallback) | 设置蜂窝通话下行录音风险提示语播放结束的回调函数。仅在使用[OH_AudioStream_SourceType](capi-native-audiostream-base-h.md#oh_audiostream_sourcetype).AUDIOSTREAM_SOURCE_TYPE_VOICE_DOWNLINK录制时需要设置此函数。此回调必须成功设置,否则采集器无法创建。音频采集器创建后,风险提示语将自动添加到发送给通话对方的语音数据中。应用应等待回调结果后再启动采集器,否则[OH_AudioCapturer_Start](capi-native-audiocapturer-h.md#oh_audiocapturer_start)将返回错误。请确保音频采集器在蜂窝通话开始后创建,否则[OH_AudioStreamBuilder_GenerateCapturer](capi-native-audiostreambuilder-h.md#oh_audiostreambuilder_generatecapturer)将返回错误。 |
63| [OH_AudioStream_Result OH_AudioStreamBuilder_SetCellularRecordSecurityParams(OH_AudioStreamBuilder* builder, const char* cellularRecordPhoneNum, const char* cellularRecordToken)](#oh_audiostreambuilder_setcellularrecordsecurityparams) | 设置蜂窝通话下行录音的电话号码和安全令牌。仅在使用[OH_AudioStream_SourceType](capi-native-audiostream-base-h.md#oh_audiostream_sourcetype).AUDIOSTREAM_SOURCE_TYPE_VOICE_DOWNLINK录制时需要设置此函数。电话号码和安全令牌将用于校验蜂窝通话下行采集器是否匹配对应的蜂窝通话,必须成功设置,否则采集器无法创建。 |63| [OH_AudioStream_Result OH_AudioStreamBuilder_SetCellularRecordSecurityParams(OH_AudioStreamBuilder* builder, const char* cellularRecordPhoneNum, const char* cellularRecordToken)](#oh_audiostreambuilder_setcellularrecordsecurityparams) | 设置蜂窝通话下行录音的电话号码和安全令牌。仅在使用[OH_AudioStream_SourceType](capi-native-audiostream-base-h.md#oh_audiostream_sourcetype).AUDIOSTREAM_SOURCE_TYPE_VOICE_DOWNLINK录制时需要设置此函数。电话号码和安全令牌将用于校验蜂窝通话下行采集器是否匹配对应的蜂窝通话,必须成功设置,否则采集器无法创建。 |
64 64 
@@ -927,9 +927,9 @@ OH_AudioStream_Result OH_AudioStreamBuilder_SetPlaybackCaptureMode(OH_AudioStrea
927 927 
928**描述**928**描述**
929 929 
930-在使用内录(录制设备内部应用的声音)时设置可以录制的音频模式,该模式将决定要录制的音频流类型。此功能仅适用于[AudioStream_Type_Capturer](./capi-native-audiostream-base-h.md#oh_audiostream_type)类型。该API暂不支持。930+在使用内录(录制设备内部应用的声音)时设置可以录制的音频模式,该模式将决定要录制的音频流类型。此功能仅适用于[AudioStream_Type_Capturer](./capi-native-audiostream-base-h.md#oh_audiostream_type)类型。该API最初仅特定系统应用可用,从API版本26.0.0开始,支持任意应用使用
931- 931+ 
932-**起始版本:** 23932+**起始版本:** 23
933 933 
934**参数:**934**参数:**
935 935