diff --git a/README_zh.md b/README_zh.md index fc96149c9504407b78789ba1d0a1150e2036117a..23dc40a7e655af4c3ddcdc525ee2f8e482702292 100755 --- a/README_zh.md +++ b/README_zh.md @@ -5,11 +5,15 @@ - [目录](#section179mcpsimp) - [使用说明](#section112738505318) + - [音频播放](#section1147510562812) + - [音频录制](#section295162052813) + - [音频管理](#section645572311287) + - [相关仓](#section340mcpsimp) ## 简介 -音频组件支持音频业务的开发,提供音量管理。 +音频组件用于实现音频相关的功能,包括音频播放,录制,音量管理和设备管理。 **图 1** 音频组件架构图 @@ -58,38 +62,112 @@ PCM(Pulse Code Modulation),即脉冲编码调制,是一种将模拟信 ## 使用说明 -1. 获取音频控制器。 +### 音频播放 + +可以使用此仓库内提供的接口将音频数据转换为音频模拟信号,使用输出设备播放音频信号,以及管理音频播放任务。以下步骤描述了如何使用AudioRenderer开发音频播放功能: + +1. 使用Create接口和所需流类型来获取AudioRenderer实例。 + + ``` + AudioStreamType streamType = STREAM_MUSIC; // 流类型示例 + std::unique_ptr audioRenderer = AudioRenderer::Create(streamType); + ``` + +2. (可选)静态API GetSupportedFormats\(\), GetSupportedChannels\(\), GetSupportedEncodingTypes\(\), GetSupportedSamplingRates\(\) 可用于获取支持的参数。 +3. 准备设备,调用实例的SetParams。 + + ``` + AudioRendererParams rendererParams; + rendererParams.sampleFormat = SAMPLE_S16LE; + rendererParams.sampleRate = SAMPLE_RATE_44100; rendererParams.channelCount = STEREO; + rendererParams.encodingType = ENCODING_PCM; + + audioRenderer->SetParams(rendererParams); + ``` + +4. (可选)使用audioRenderer-\>GetParams(rendererParams)来验证SetParams。 +5. AudioRenderer 实例调用audioRenderer-\>Start\(\) 函数来启动播放任务。 +6. 使用GetBufferSize接口获取要写入的缓冲区长度。 + + ``` + audioRenderer->GetBufferSize(bufferLen); + ``` + +7. 从源(例如音频文件)读取要播放的音频数据并将其传输到字节流中。重复调用Write函数写入渲染数据。 ``` - const audioManager = audio.getAudioManager(); + bytesToWrite = fread(buffer, 1, bufferLen, wavFile); + while ((bytesWritten < bytesToWrite) && ((bytesToWrite - bytesWritten) > minBytes)) { + bytesWritten += audioRenderer->Write(buffer + bytesWritten, bytesToWrite - bytesWritten); + if (bytesWritten < 0) + break; + } ``` -2. 获取媒体流的音量。 +8. 调用audioRenderer-\>Drain\(\)来清空播放流。 +9. 调用audioRenderer-\>Stop\(\)来停止输出。 +10. 播放任务完成后,调用AudioRenderer实例的audioRenderer-\>Release\(\)函数来释放资源。 + +提供上述基本音频播放使用范例。更多接口说明请参考audio\_renderer.h 和audio\_info.h。 + +### 音频录制 + +可以使用此仓库内提供的接口,让应用程序可以完成使用输入设备进行声音录制,将语音转换为音频数据,并管理录制的任务。以下步骤描述了如何使用AudioReorder开发音频录制功能: + +1. 使用Create接口和所需流类型来获取AudioRecorder实例。 + + ``` + AudioStreamType streamType = STREAM_MUSIC; + std::unique_ptr audioRecorder = AudioRecorder::Create(streamType); + ``` + +2. (可选)静态API GetSupportedFormats\(\), GetSupportedChannels\(\), GetSupportedEncodingTypes\(\), GetSupportedSamplingRates\(\) 可用于获取支持的参数。 +3. 准备设备,调用实例的SetParams。 ``` - audioManager.getVolume(audio.AudioVolumeType.MEDIA, (err, value) => { - if (err) { - console.error(`failed to get volume ${err.message}`); - return; - } - console.log(`Media getVolume successful callback`); - }); + AudioRecorderParams recorderParams; + recorderParams.sampleFormat = SAMPLE_S16LE; + recorderParams.sampleRate = SAMPLE_RATE_44100; recorderParams.channelCount = STEREO; + recorderParams.encodingType = ENCODING_PCM; + + audioRecorder->SetParams(recorderParams); ``` -3. 改变媒体流的音量。 +4. (可选)使用 audioRecorder-\>GetParams\(recorderParams\) 来验证 SetParams\(\)。 +5. AudioRecorder 实例调用 audioRenderer-\>Start\(\) 函数来启动录音任务。 +6. 使用GetBufferSize接口获取要写入的缓冲区长度。 ``` - audioManager.setVolume(audio.AudioVolumeType.MEDIA, 30, (err)=>{ - if (err) { - console.error(`failed to set volume ${err.message}`); - return; - } - console.log(`Media setVolume successful callback`); - }) + audioRecorder->GetBufferSize(bufferLen); ``` +7. 读取录制的音频数据并将其转换为字节流。重复调用read函数读取数据直到主动停止。 + + ``` + // set isBlocking = true/false for blocking/non-blocking read + bytesRead = audioRecorder->Read(*buffer, bufferLen, isBlocking); + while (numBuffersToRecord) { + bytesRead = audioRecorder->Read(*buffer, bufferLen, isBlockingRead); + if (bytesRead < 0) { + break; + } else if (bytesRead > 0) { + fwrite(buffer, size, bytesRead, recFile); // example shows writes the recored data into a file + numBuffersToRecord--; + } + } + ``` + +8. (可选)调用audioRecorder-\>Flush\(\) 来清空录音流缓冲区。 +9. AudioRecorder 实例调用 audioRecorder-\>Stop\(\) 函数停止录音。 +10. 录音任务完成后,调用AudioRecorder 实例的audioRecorder-\>Release\(\) 函数释放资源。 + +提供上述基本音频录制使用范例。更多API请参考audio\_recorder.h和audio\_info.h。 + +### 音频管理 + +JS应用可以使用音频管理器提供的API来控制音量和设备。有关音频音量和设备管理的JS用法,请参考音频管理JS接口说明。 ## 相关仓 -媒体子系统仓:multimedia\_audio\_standard +[multimedia\_audio\_standard](https://gitee.com/openharmony/multimedia_audio_standard)