电子说
音频组件用于实现音频相关的功能,包括音频播放,录制,音量管理和设备管理。
图 1 音频组件架构图
采样是指将连续时域上的模拟信号按照一定的时间间隔采样,获取到离散时域上离散信号的过程。
采样率为每秒从连续信号中提取并组成离散信号的采样次数,单位用赫兹(Hz)来表示。通常人耳能听到频率范围大约在20Hz~20kHz之间的声音。常用的音频采样频率有:8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz、96kHz、192kHz等。
声道是指声音在录制或播放时在不同空间位置采集或回放的相互独立的音频信号,所以声道数也就是声音录制时的音源数量或回放时相应的扬声器数量。
音频数据是流式的,本身没有明确的一帧帧的概念,在实际的应用中,为了音频算法处理/传输的方便,一般约定俗成取2.5ms~60ms为单位的数据量为一帧音频。这个时间被称之为“采样时间”,其长度没有特别的标准,它是根据编解码器和具体应用的需求来决定的。
PCM(Pulse Code Modulation),即脉冲编码调制,是一种将模拟信号数字化的方法,是将时间连续、取值连续的模拟信号转换成时间离散、抽样值离散的数字信号的过程。
仓目录结构如下:
/foundation/multimedia/audio_standard # 音频组件业务代码
├── frameworks # 框架代码
│ ├── native # 内部接口实现
│ └── js # 外部接口实现
│ └── napi # napi 外部接口实现
├── interfaces # 接口代码
│ ├── inner_api # 内部接口
│ └── kits # 外部接口
├── sa_profile # 服务配置文件
├── services # 服务代码
├── LICENSE # 证书文件
└── bundle.json # 编译文件
可以使用此仓库内提供的接口将音频数据转换为音频模拟信号,使用输出设备播放音频信号,以及管理音频播放任务。以下步骤描述了如何使用 AudioRenderer 开发音频播放功能:
AudioStreamType streamType = STREAM_MUSIC; // 流类型示例
std::unique_ptr< AudioRenderer > audioRenderer = AudioRenderer::Create(streamType);
AudioRendererParams rendererParams;
rendererParams.sampleFormat = SAMPLE_S16LE;
rendererParams.sampleRate = SAMPLE_RATE_44100;
rendererParams.channelCount = STEREO;
rendererParams.encodingType = ENCODING_PCM;
audioRenderer- >SetParams(rendererParams);
AudioEffectMode effectMode = EFFECT_DEFAULT;
int32_t result = audioRenderer- >SetAudioEffectMode(effectMode);
AudioEffectMode mode = audioRenderer- >GetAudioEffectMode();
audioRenderer- >GetBufferSize(bufferLen);
bytesToWrite = fread(buffer, 1, bufferLen, wavFile);
while ((bytesWritten < bytesToWrite) && ((bytesToWrite - bytesWritten) > minBytes)) {
bytesWritten += audioRenderer- >Write(buffer + bytesWritten, bytesToWrite - bytesWritten);
if (bytesWritten < 0)
break;
}
以上提供了基本音频播放使用场景。
可以使用此仓库内提供的接口,让应用程序可以完成使用输入设备进行声音录制,将语音转换为音频数据,并管理录制的任务。以下步骤描述了如何使用 AudioCapturer 开发音频录制功能:
AudioStreamType streamType = STREAM_MUSIC;
std::unique_ptr< AudioCapturer > audioCapturer = AudioCapturer::Create(streamType);
AudioCapturerParams capturerParams;
capturerParams.sampleFormat = SAMPLE_S16LE;
capturerParams.sampleRate = SAMPLE_RATE_44100;
capturerParams.channelCount = STEREO;
capturerParams.encodingType = ENCODING_PCM;
audioCapturer- >SetParams(capturerParams);
audioCapturer- >GetBufferSize(bufferLen);
// set isBlocking = true/false for blocking/non-blocking read
bytesRead = audioCapturer- >Read(*buffer, bufferLen, isBlocking);
while (numBuffersToCapture) {
bytesRead = audioCapturer- >Read(*buffer, bufferLen, isBlockingRead);
if (bytesRead <= 0) {
break;
} else if (bytesRead > 0) {
fwrite(buffer, size, bytesRead, recFile); // example shows writes the recorded data into a file
numBuffersToCapture--;
}
}
可以使用 [ audio_system_manager.h ]内的接口来控制音量和设备。
AudioSystemManager *audioSystemMgr = AudioSystemManager::GetInstance();
AudioVolumeType streamType = AudioVolumeType::STREAM_MUSIC;
int32_t maxVol = audioSystemMgr- >GetMaxVolume(streamType);
int32_t minVol = audioSystemMgr- >GetMinVolume(streamType);
int32_t result = audioSystemMgr- >SetVolume(streamType, 10);
int32_t vol = audioSystemMgr- >GetVolume(streamType);
int32_t result = audioSystemMgr- >SetMute(streamType, true);
bool isMute = audioSystemMgr- >IsStreamMute(streamType);
int32_t result = audioSystemMgr- >SetRingerMode(RINGER_MODE_SILENT);
AudioRingerMode ringMode = audioSystemMgr- >GetRingerMode();
int32_t result = audioSystemMgr- >SetMicrophoneMute(true);
bool isMicMute = audioSystemMgr- >IsMicrophoneMute();
DeviceFlag deviceFlag = OUTPUT_DEVICES_FLAG;
vector< sptr< AudioDeviceDescriptor > > audioDeviceDescriptors
= audioSystemMgr- >GetDevices(deviceFlag);
sptr< AudioDeviceDescriptor > audioDeviceDescriptor = audioDeviceDescriptors[0];
cout < < audioDeviceDescriptor- >deviceType_;
cout < < audioDeviceDescriptor- >deviceRole_;
ActiveDeviceType deviceType = SPEAKER;
int32_t result = audioSystemMgr- >SetDeviceActive(deviceType, true);
bool isDevActive = audioSystemMgr- >IsDeviceActive(deviceType);
const audioManager = audio.getAudioManager();
export default {
onCreate() {
audioManager.on('volumeChange', (volumeChange) == > {
console.info('volumeType = '+volumeChange.volumeType);
console.info('volume = '+volumeChange.volume);
console.info('updateUi = '+volumeChange.updateUi);
}
}
}
int32_t result = audioSystemMgr- >SetAudioScene(AUDIO_SCENE_PHONE_CALL);
AudioScene audioScene = audioSystemMgr- >GetAudioScene();
有关支持的音频场景,请参阅 AudioScene 中的枚举[ audio_info.h ]
可以使用[ audio_stream_manager.h ]提供的接口用于流管理功能。
AudioStreamManager *audioStreamMgr = AudioStreamManager::GetInstance();
const int32_t clientPid;
class RendererStateChangeCallback : public AudioRendererStateChangeCallback {
public:
RendererStateChangeCallback = default;
~RendererStateChangeCallback = default;
void OnRendererStateChange(
const std::vector< std::unique_ptr< AudioRendererChangeInfo > > &audioRendererChangeInfos) override
{
cout< < "OnRendererStateChange entered"<
const int32_t clientPid;
class CapturerStateChangeCallback : public AudioCapturerStateChangeCallback {
public:
CapturerStateChangeCallback = default;
~CapturerStateChangeCallback = default;
void OnCapturerStateChange(
const std::vector< std::unique_ptr< AudioCapturerChangeInfo > > &audioCapturerChangeInfos) override
{
cout< < "OnCapturerStateChange entered"<
std::vector< std::unique_ptr< AudioRendererChangeInfo > > audioRendererChangeInfos;
int32_t currentRendererChangeInfo = audioStreamMgr- >GetCurrentRendererChangeInfos(audioRendererChangeInfos);
std::vector< std::unique_ptr< AudioCapturerChangeInfo > > audioCapturerChangeInfos;
int32_t currentCapturerChangeInfo = audioStreamMgr- >GetCurrentCapturerChangeInfos(audioCapturerChangeInfos);
const AudioStreamInfo &audioStreamInfo;
bool isLatencySupport = audioStreamMgr- >IsAudioRendererLowLatencySupported(audioStreamInfo);
AudioSceneEffectInfo audioSceneEffectInfo;
int32_t status = audioStreamMgr- >GetEffectInfoArray(audioSceneEffectInfo,streamUsage);
JavaScript应用可以使用系统提供的音频管理接口,来控制音量和设备。
请参考 [ js-apis-audio.md ]来获取音量和设备管理相关JavaScript接口的用法。
可以使用提供的接口 [ audio_bluetooth_manager.h ] 实现同步连接导向链路(SCO)的蓝牙呼叫。
const BluetoothRemoteDevice &device;
int state;
void OnScoStateChanged(const BluetoothRemoteDevice &device, int state);
以下是音频子系统支持的设备类型列表。
USB Type-C Headset
数字耳机,包括自己的DAC(数模转换器)和作为耳机一部分的放大器。
WIRED Headset
模拟耳机内部不包含任何DAC。它可以有3.5mm插孔或不带DAC的C型插孔。
Bluetooth Headset
蓝牙A2DP(高级音频分配模式)耳机,用于无线传输音频。
Internal Speaker and MIC
支持内置扬声器和麦克风,并将分别用作播放和录制的默认设备。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !