• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 音频组件<a name="ZH-CN_TOPIC_0000001146901937"></a>
2
3-   [简介](#section119mcpsimp)
4    -   [基本概念](#section122mcpsimp)
5
6-   [目录](#section179mcpsimp)
7-   [使用说明](#section112738505318)
8    -   [音频播放](#section1147510562812)
9    -   [音频录制](#section295162052813)
10    -   [音频管理](#section645572311287)
11        -   [音量控制](#section645572311287_001)
12        -   [设备控制](#section645572311287_002)
13        -   [音频场景](#section645572311287_003)
14        -   [音频流管理](#section645572311287_004)
15        -   [JavaScript 用法](#section645572311287_005)
16    -   [铃声管理](#section645572311287_006)
17    -   [蓝牙SCO呼叫](#section645572311287_007)
18-   [支持设备](#section645572311287_008)
19-   [相关仓](#section340mcpsimp)
20
21## 简介<a name="section119mcpsimp"></a>
22
23音频组件用于实现音频相关的功能,包括音频播放,录制,音量管理和设备管理。
24
25**图 1**  音频组件架构图<a name="fig483116248288"></a>
26
27
28![](figures/zh-cn_image_0000001152315135.png)
29
30### 基本概念<a name="section122mcpsimp"></a>
31
32-   **采样**
33
34采样是指将连续时域上的模拟信号按照一定的时间间隔采样,获取到离散时域上离散信号的过程。
35
36-   **采样率**
37
38采样率为每秒从连续信号中提取并组成离散信号的采样次数,单位用赫兹(Hz)来表示。通常人耳能听到频率范围大约在20Hz~20kHz之间的声音。常用的音频采样频率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。
39
40-   **声道**
41
42声道是指声音在录制或播放时在不同空间位置采集或回放的相互独立的音频信号,所以声道数也就是声音录制时的音源数量或回放时相应的扬声器数量。
43
44-   **音频帧**
45
46音频数据是流式的,本身没有明确的一帧帧的概念,在实际的应用中,为了音频算法处理/传输的方便,一般约定俗成取2.5ms\~60ms为单位的数据量为一帧音频。这个时间被称之为“采样时间”,其长度没有特别的标准,它是根据编解码器和具体应用的需求来决定的。
47
48-   **PCM**
49
50PCM(Pulse Code Modulation),即脉冲编码调制,是一种将模拟信号数字化的方法,是将时间连续、取值连续的模拟信号转换成时间离散、抽样值离散的数字信号的过程。
51
52## 目录<a name="section179mcpsimp"></a>
53
54仓目录结构如下:
55
56```
57/foundation/multimedia/audio_standard  # 音频组件业务代码
58├── frameworks                         # 框架代码
59│   ├── native                         # 内部接口实现
60│   └── js                             # 外部接口实现
61│       └── napi                       # napi 外部接口实现
62├── interfaces                         # 接口代码
63│   ├── inner_api                      # 内部接口
64│   └── kits                           # 外部接口
65├── sa_profile                         # 服务配置文件
66├── services                           # 服务代码
67├── LICENSE                            # 证书文件
68└── ohos.build                         # 编译文件
69```
70
71## 使用说明<a name="section112738505318"></a>
72
73### 音频播放<a name="section1147510562812"></a>
74
75可以使用此仓库内提供的接口将音频数据转换为音频模拟信号,使用输出设备播放音频信号,以及管理音频播放任务。以下步骤描述了如何使用 **AudioRenderer** 开发音频播放功能:
76
771.  使用 **Create** 接口和所需流类型来获取 **AudioRenderer** 实例。
78
79    ```
80    AudioStreamType streamType = STREAM_MUSIC; // 流类型示例
81    std::unique_ptr<AudioRenderer> audioRenderer = AudioRenderer::Create(streamType);
82    ```
83
842.  (可选)静态接口 **GetSupportedFormats**(), **GetSupportedChannels**(), **GetSupportedEncodingTypes**(), **GetSupportedSamplingRates**() 可用于获取支持的参数。
853.  准备设备,调用实例的 **SetParams** 。
86
87    ```
88    AudioRendererParams rendererParams;
89    rendererParams.sampleFormat = SAMPLE_S16LE;
90    rendererParams.sampleRate = SAMPLE_RATE_44100;
91    rendererParams.channelCount = STEREO;
92    rendererParams.encodingType = ENCODING_PCM;
93
94    audioRenderer->SetParams(rendererParams);
95    ```
96
974.  (可选)使用 audioRenderer->**GetParams**(rendererParams) 来验证 SetParams。
985.  AudioRenderer 实例调用 audioRenderer->**Start**() 函数来启动播放任务。
996.  使用 **GetBufferSize** 接口获取要写入的缓冲区长度。
100
101    ```
102    audioRenderer->GetBufferSize(bufferLen);
103    ```
104
1057.  从源(例如音频文件)读取要播放的音频数据并将其传输到字节流中。重复调用Write函数写入渲染数据。
106
107    ```
108    bytesToWrite = fread(buffer, 1, bufferLen, wavFile);
109    while ((bytesWritten < bytesToWrite) && ((bytesToWrite - bytesWritten) > minBytes)) {
110        bytesWritten += audioRenderer->Write(buffer + bytesWritten, bytesToWrite - bytesWritten);
111        if (bytesWritten < 0)
112            break;
113    }
114    ```
115
1168.  调用audioRenderer->**Drain**()来清空播放流。
1179.  调用audioRenderer->**Stop**()来停止输出。
11810. 播放任务完成后,调用AudioRenderer实例的audioRenderer->**Release**()函数来释放资源。
119
120以上提供了基本音频播放使用场景。
121
122
12311. 使用 audioRenderer->**SetVolume(float)** 和 audioRenderer->**GetVolume()** 来设置和获取当前音频流音量, 可选范围为 0.0 到 1.0。
124
125提供上述基本音频播放使用范例。更多接口说明请参考[**audio_renderer.h**](https://gitee.com/openharmony/multimedia_audio_standard/blob/master/interfaces/inner_api/native/audiorenderer/include/audio_renderer.h) 和 [**audio_info.h**](https://gitee.com/openharmony/multimedia_audio_standard/blob/master/interfaces/inner_api/native/audiocommon/include/audio_info.h)126
127### 音频录制<a name="section295162052813"></a>
128
129可以使用此仓库内提供的接口,让应用程序可以完成使用输入设备进行声音录制,将语音转换为音频数据,并管理录制的任务。以下步骤描述了如何使用 **AudioCapturer** 开发音频录制功能:
130
1311.  使用Create接口和所需流类型来获取 **AudioCapturer** 实例。
132
133    ```
134    AudioStreamType streamType = STREAM_MUSIC;
135    std::unique_ptr<AudioCapturer> audioCapturer = AudioCapturer::Create(streamType);
136    ```
137
1382.  (可选)静态接口 **GetSupportedFormats**(), **GetSupportedChannels**(), **GetSupportedEncodingTypes**(), **GetSupportedSamplingRates**() 可用于获取支持的参数。
1393.  准备设备,调用实例的 **SetParams** 。
140
141    ```
142    AudioCapturerParams capturerParams;
143    capturerParams.sampleFormat = SAMPLE_S16LE;
144    capturerParams.sampleRate = SAMPLE_RATE_44100;
145    capturerParams.channelCount = STEREO;
146    capturerParams.encodingType = ENCODING_PCM;
147
148    audioCapturer->SetParams(capturerParams);
149    ```
150
1514.  (可选)使用 audioCapturer->**GetParams**(capturerParams) 来验证 SetParams()。
1525.  AudioCapturer 实例调用 AudioCapturer->**Start**() 函数来启动录音任务。
1536.  使用 **GetBufferSize** 接口获取要写入的缓冲区长度。
154
155    ```
156    audioCapturer->GetBufferSize(bufferLen);
157    ```
158
1597.  读取录制的音频数据并将其转换为字节流。重复调用read函数读取数据直到主动停止。
160
161    ```
162    // set isBlocking = true/false for blocking/non-blocking read
163    bytesRead = audioCapturer->Read(*buffer, bufferLen, isBlocking);
164    while (numBuffersToCapture) {
165        bytesRead = audioCapturer->Read(*buffer, bufferLen, isBlockingRead);
166            if (bytesRead < 0) {
167                break;
168            } else if (bytesRead > 0) {
169            fwrite(buffer, size, bytesRead, recFile); // example shows writes the recorded data into a file
170            numBuffersToCapture--;
171        }
172    }
173    ```
174
1758.  (可选)audioCapturer->**Flush**() 来清空录音流缓冲区。
1769.  AudioCapturer 实例调用 audioCapturer->**Stop**() 函数停止录音。
17710. 录音任务完成后,调用 AudioCapturer 实例的 audioCapturer->**Release**() 函数释放资源。
178
179提供上述基本音频录制使用范例。更多API请参考[**audio_capturer.h**](https://gitee.com/openharmony/multimedia_audio_standard/blob/master/interfaces/inner_api/native/audiocapturer/include/audio_capturer.h)和[**audio_info.h**](https://gitee.com/openharmony/multimedia_audio_standard/blob/master/interfaces/inner_api/native/audiocommon/include/audio_info.h)180
181### 音频管理<a name="section645572311287"></a>
182可以使用 [**audio_system_manager.h**](https://gitee.com/openharmony/multimedia_audio_standard/blob/master/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h) 内的接口来控制音量和设备。
1831. 使用 **GetInstance** 接口获取 **AudioSystemManager** 实例.
184    ```
185    AudioSystemManager *audioSystemMgr = AudioSystemManager::GetInstance();
186    ```
187#### 音量控制<a name="section645572311287_001"></a>
1882. 使用 **GetMaxVolume** 和  **GetMinVolume** 接口去查询音频流支持的最大和最小音量等级,在此范围内设置音量。
189    ```
190    AudioVolumeType streamType = AudioVolumeType::STREAM_MUSIC;
191    int32_t maxVol = audioSystemMgr->GetMaxVolume(streamType);
192    int32_t minVol = audioSystemMgr->GetMinVolume(streamType);
193    ```
1943. 使用 **SetVolume** 和 **GetVolume** 接口来设置和获取指定音频流的音量等级。
195    ```
196    int32_t result = audioSystemMgr->SetVolume(streamType, 10);
197    int32_t vol = audioSystemMgr->GetVolume(streamType);
198    ```
1994. 使用 **SetMute** 和 **IsStreamMute** 接口来设置和获取指定音频流的静音状态。
200    ```
201    int32_t result = audioSystemMgr->SetMute(streamType, true);
202    bool isMute = audioSystemMgr->IsStreamMute(streamType);
2035. 使用 **SetRingerMode** 和 **GetRingerMode** 接口来设置和获取铃声模式。参考在 [**audio_info.h**](https://gitee.com/openharmony/multimedia_audio_standard/blob/master/interfaces/inner_api/native/audiocommon/include/audio_info.h)  定义的 **AudioRingerMode** 枚举来获取支持的铃声模式。
204    ```
205    int32_t result = audioSystemMgr->SetRingerMode(RINGER_MODE_SILENT);
206    AudioRingerMode ringMode = audioSystemMgr->GetRingerMode();
207    ```
2086. 使用 **SetMicrophoneMute** 和 **IsMicrophoneMute** 接口来设置和获取麦克风的静音状态。
209    ```
210    int32_t result = audioSystemMgr->SetMicrophoneMute(true);
211    bool isMicMute = audioSystemMgr->IsMicrophoneMute();
212    ```
213#### 设备控制<a name="section645572311287_002"></a>
2147. 使用 **GetDevices**, **deviceType_** 和 **deviceRole_** 接口来获取音频输入输出设备信息。 参考 [**audio_info.h**](https://gitee.com/openharmony/multimedia_audio_standard/blob/master/interfaces/inner_api/native/audiocommon/include/audio_info.h) 内定义的DeviceFlag, DeviceType 和 DeviceRole 枚举。
215    ```
216    DeviceFlag deviceFlag = OUTPUT_DEVICES_FLAG;
217    vector<sptr<AudioDeviceDescriptor>> audioDeviceDescriptors
218        = audioSystemMgr->GetDevices(deviceFlag);
219    sptr<AudioDeviceDescriptor> audioDeviceDescriptor = audioDeviceDescriptors[0];
220    cout << audioDeviceDescriptor->deviceType_;
221    cout << audioDeviceDescriptor->deviceRole_;
222    ```
2238. 使用 **SetDeviceActive** 和 **IsDeviceActive** 接口去激活/去激活音频设备和获取音频设备激活状态。
224     ```
225    ActiveDeviceType deviceType = SPEAKER;
226    int32_t result = audioSystemMgr->SetDeviceActive(deviceType, true);
227    bool isDevActive = audioSystemMgr->IsDeviceActive(deviceType);
228    ```
2299. 提供其他用途的接口如 **IsStreamActive**, **SetAudioParameter** and **GetAudioParameter**, 详细请参考 [**audio_system_manager.h**](https://gitee.com/openharmony/multimedia_audio_standard/blob/master/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h)
23010. 应用程序可以使用 **AudioManagerNapi::On**注册系统音量的更改。 在此,如果应用程序监听到系统音量更改的事件,就会用以下参数通知应用程序:
231volumeType : 更改的系统音量的类型
232volume : 当前的音量等级
233updateUi : 是否需要显示变化详细信息。(如果音量被增大/减小,将updateUi标志设置为true,在其他情况下,updateUi设置为false)。
234    ```
235    const audioManager = audio.getAudioManager();
236
237    export default {
238      onCreate() {
239        audioManager.on('volumeChange', (volumeChange) ==> {
240          console.info('volumeType = '+volumeChange.volumeType);
241          console.info('volume = '+volumeChange.volume);
242          console.info('updateUi = '+volumeChange.updateUi);
243        }
244      }
245    }
246    ```
247
248#### 音频场景<a name="section645572311287_003"></a>
24911. 使用 **SetAudioScene** 和 **getAudioScene** 接口去更改和检查音频策略。
250    ```
251    int32_t result = audioSystemMgr->SetAudioScene(AUDIO_SCENE_PHONE_CALL);
252    AudioScene audioScene = audioSystemMgr->GetAudioScene();
253    ```
254有关支持的音频场景,请参阅 **AudioScene** 中的枚举[**audio_info.h**](https://gitee.com/openharmony/multimedia_audio_framework/blob/master/interfaces/inner_api/native/audiocommon/include/audio_info.h)255#### 音频流管理<a name="section645572311287_004"></a>
256可以使用[**audio_stream_manager.h**](https://gitee.com/openharmony/multimedia_audio_standard/blob/master/interfaces/inner_api/native/audiomanager/include/audio_stream_manager.h)提供的接口用于流管理功能。
2571. 使用 **GetInstance** 接口获得 **AudioSystemManager** 实例。
258    ```
259    AudioStreamManager *audioStreamMgr = AudioStreamManager::GetInstance();
260    ```
261
2622. 使用 **RegisterAudioRendererEventListener** 为渲染器状态更改注册侦听器。渲染器状态更改回调,该回调将在渲染器流状态更改时调用, 通过重写 **AudioRendererStateChangeCallback** 类中的函数 **OnRendererStateChange** 。
263    ```
264    const int32_t clientUID;
265
266    class RendererStateChangeCallback : public AudioRendererStateChangeCallback {
267    public:
268        RendererStateChangeCallback = default;
269        ~RendererStateChangeCallback = default;
270    void OnRendererStateChange(
271        const std::vector<std::unique_ptr<AudioRendererChangeInfo>> &audioRendererChangeInfos) override
272    {
273        cout<<"OnRendererStateChange entered"<<endl;
274    }
275    };
276
277    std::shared_ptr<AudioRendererStateChangeCallback> callback = std::make_shared<RendererStateChangeCallback>();
278    int32_t state = audioStreamMgr->RegisterAudioRendererEventListener(clientUID, callback);
279    int32_t result = audioStreamMgr->UnregisterAudioRendererEventListener(clientUID);
280    ```
281
2823. 使用 **RegisterAudioCapturerEventListener** 为捕获器状态更改注册侦听器。 捕获器状态更改回调,该回调将在捕获器流状态更改时调用, 通过重写 **AudioCapturerStateChangeCallback** 类中的函数 **OnCapturerStateChange** 。
283    ```
284    const int32_t clientUID;
285
286    class CapturerStateChangeCallback : public AudioCapturerStateChangeCallback {
287    public:
288        CapturerStateChangeCallback = default;
289        ~CapturerStateChangeCallback = default;
290    void OnCapturerStateChange(
291        const std::vector<std::unique_ptr<AudioCapturerChangeInfo>> &audioCapturerChangeInfos) override
292    {
293        cout<<"OnCapturerStateChange entered"<<endl;
294    }
295    };
296
297    std::shared_ptr<AudioCapturerStateChangeCallback> callback = std::make_shared<CapturerStateChangeCallback>();
298    int32_t state = audioStreamMgr->RegisterAudioCapturerEventListener(clientUID, callback);
299    int32_t result = audioStreamMgr->UnregisterAudioCapturerEventListener(clientUID);
300    ```
3014. 使用 **GetCurrentRendererChangeInfos** 获取所有当前正在运行的流渲染器信息,包括clientuid、sessionid、renderinfo、renderstate和输出设备详细信息。
302    ```
303    std::vector<std::unique_ptr<AudioRendererChangeInfo>> audioRendererChangeInfos;
304    int32_t currentRendererChangeInfo = audioStreamMgr->GetCurrentRendererChangeInfos(audioRendererChangeInfos);
305    ```
306
3075. 使用 **GetCurrentCapturerChangeInfos** 获取所有当前正在运行的流捕获器信息,包括clientuid、sessionid、capturerInfo、capturerState和输入设备详细信息。
308    ```
309    std::vector<std::unique_ptr<AudioCapturerChangeInfo>> audioCapturerChangeInfos;
310    int32_t currentCapturerChangeInfo = audioStreamMgr->GetCurrentCapturerChangeInfos(audioCapturerChangeInfos);
311    ```
312    有关结构,请参阅[**audio_info.h**](https://gitee.com/openharmony/multimedia_audio_standard/blob/master/interfaces/inner_api/native/audiocommon/include/audio_info.h) **audioRendererChangeInfos** 和 **audioCapturerChangeInfos**.
313
3146. 使用 **IsAudioRendererLowLatencySupported** 检查低延迟功能是否支持。
315    ```
316    const AudioStreamInfo &audioStreamInfo;
317    bool isLatencySupport = audioStreamMgr->IsAudioRendererLowLatencySupported(audioStreamInfo);
318    ```
319#### JavaScript 用法:<a name="section645572311287_005"></a>
320JavaScript应用可以使用系统提供的音频管理接口,来控制音量和设备。\
321请参考 [**js-apis-audio.md**](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-audio.md#audiomanager) 来获取音量和设备管理相关JavaScript接口的用法。
322
323### 铃声管理<a name="section645572311287_006"></a>
324可以使用提供的接口[**iringtone_sound_manager.h**](https://gitee.com/openharmony/multimedia_audio_framework/blob/master/interfaces/inner_api/native/audioringtone/include/iringtone_sound_manager.h) 和 [**iringtone_player.h**](https://gitee.com/openharmony/multimedia_audio_framework/blob/master/interfaces/inner_api/native/audioringtone/include/iringtone_player.h)实现铃声播放功能。
3251. 使用 **CreateRingtoneManager** 接口创建 **IRingtoneSoundManager** 实例。
326    ```
327    std::shared_ptr<IRingtoneSoundManager> ringtoneManagerClient = RingtoneFactory::CreateRingtoneManager();
328    ```
3292. 使用 **SetSystemRingtoneUri** 接口设置系统铃声Uri
330    ```
331    std::string uri = "/data/media/test.wav";
332    RingtoneType ringtoneType = RINGTONE_TYPE_DEFAULT;
333    ringtoneManagerClient->SetSystemRingtoneUri(context, uri, ringtoneType);
334    ```
3353. 使用 **GetRingtonePlayer** 接口获取 **IRingtonePlayer** 实例。
336    ```
337    std::unique_ptr<IRingtonePlayer> ringtonePlayer = ringtoneManagerClient->GetRingtonePlayer(context, ringtoneType);
338    ```
3394. 使用 **Configure** 接口配置铃声播放器。
340    ```
341    float volume = 1;
342    bool loop = true;
343    ringtonePlayer.Configure(volume, loop);
344    ```
3455. 使用 **Start**, **Stop**, 和 **Release** 接口在铃声播放器实例上控制播放状态。
346    ```
347    ringtonePlayer.Start();
348    ringtonePlayer.Stop();
349    ringtonePlayer.Release();
350    ```
3516. 使用 **GetTitle** 接口获取当前系统铃声的标题。
3527. 使用 **GetRingtoneState** 接口获取铃声播放状态 - **RingtoneState**
3538. 使用 **GetAudioRendererInfo** 获取 **AudioRendererInfo** 检查内容类型和流使用情况。
354### 蓝牙SCO呼叫<a name="section645572311287_007"></a>
355可以使用提供的接口 [**audio_bluetooth_manager.h**](https://gitee.com/openharmony/multimedia_audio_standard/blob/master/services/include/audio_bluetooth/client/audio_bluetooth_manager.h) 实现同步连接导向链路(SCO)的蓝牙呼叫。
356
3571. 为监听SCO状态更改,您可以使用 **OnScoStateChanged**.
358```
359const BluetoothRemoteDevice &device;
360int state;
361void OnScoStateChanged(const BluetoothRemoteDevice &device, int state);
362```
363
3642. (可选) 静态接口 **RegisterBluetoothScoAgListener**(), **UnregisterBluetoothScoAgListener**(), 可用于注册蓝牙SCO的侦听器。
365## 支持设备<a name="section645572311287_008"></a>
366以下是音频子系统支持的设备类型列表。
367
3681. **USB Type-C Headset**\
369    数字耳机,包括自己的DAC(数模转换器)和作为耳机一部分的放大器。
3702. **WIRED Headset**\
371    模拟耳机内部不包含任何DAC。它可以有3.5mm插孔或不带DAC的C型插孔。
3723. **Bluetooth Headset**\
373    蓝牙A2DP(高级音频分配模式)耳机,用于无线传输音频。
3744. **Internal Speaker and MIC**\
375    支持内置扬声器和麦克风,并将分别用作播放和录制的默认设备。
376
377## 相关仓<a name="section340mcpsimp"></a>
378
379[multimedia\_audio\_framework](https://gitee.com/openharmony/multimedia_audio_framework)
380