阅读(1576)
赞(11)
鸿蒙OS 音频采集开发指导
2020-09-17 09:22:50 更新
场景介绍
音频采集的主要工作是通过输入设备将声音采集并转码为音频数据,同时对采集任务进行管理。
接口说明
接口名 | 描述 |
---|---|
AudioCapturer(AudioCapturerInfo audioCapturerInfo) throws IllegalArgumentException | 构造函数,设置录音相关音频参数,使用默认录音设备。 |
AudioCapturer(AudioCapturerInfo audioCapturerInfo, AudioDeviceDescriptor devInfo) throws IllegalArgumentException | 构造函数,设置录音相关音频参数并指定录音设备。 |
static int getMinBufferSize(int sampleRate, int channelCount, int audioFormat) | 获取指定参数条件下所需的最小缓冲区大小。 |
boolean addSoundEffect(UUID type, String packageName) | 增加录音的音频音效。 |
boolean start() | 开始录音。 |
int read(byte[] data, int offset, int size) | 读取音频数据。 |
int read(byte[] data, int offset, int size, boolean isBlocking) | 读取音频数据并写入传入的 byte 数组中。 |
int read(float[] data, int offsetInFloats, int sizeInFloats) | 阻塞式读取音频数据并写入传入的 float 数组中。 |
int read(float[] data, int offsetInFloats, int sizeInFloats, boolean isBlocking) | 读取音频数据并写入传入的 float 数组中。 |
int read(short[] data, int offsetInShorts, int sizeInShorts) | 阻塞式读取音频数据并写入传入的 short 数组中。 |
int read(short[] data, int offsetInShorts, int sizeInShorts, boolean isBlocking) | 读取音频数据并写入传入的 short 数组中。 |
int read(java.nio.ByteBuffer buffer, int sizeInBytes) | 阻塞式读取音频数据并写入传入的 ByteBuffer 对象中。 |
int read(java.nio.ByteBuffer buffer, int sizeInBytes, boolean isBlocking) | 读取音频数据并写入传入的 ByteBuffer 对象中。 |
boolean stop() | 停止录音。 |
boolean release() | 释放录音资源。 |
AudioDeviceDescriptor getSelectedDevice() | 获取输入设备信息。 |
AudioDeviceDescriptor getCurrentDevice() | 获取当前正在录制音频的设备信息。 |
int getCapturerSessionId() | 获取录音的 session ID。 |
Set<SoundEffect> getSoundEffects() | 获取已经激活的音频音效列表。 |
AudioCapturer.State getState() | 获取音频采集状态。 |
int getSampleRate() | 获取采样率。 |
int getAudioInputSource() | 获取录音的输入设备信息。 |
int getBufferFrameCount() | 获取以帧为单位的缓冲区大小。 |
int getChannelCount() | 获取音频采集通道数。 |
AudioStreamInfo.EncodingFormat getEncodingFormat() | 获取音频采集的音频编码格式。 |
boolean getAudioTime(Timestamp timestamp, Timestamp.Timebase timebase) | 获取一个即时的捕获时间戳。 |
开发步骤
- 构造音频流参数的数据结构 AudioStreamInfo,推荐使用 AudioStreamInfo.Builder 类来构造,模板如下,模板中设置的均为 AudioStreamInfo.Builder 类的默认值,根据音频流的具体规格来设置具体参数。
AudioStreamInfo audioStreamInfo = new AudioStreamInfo.Builder().sampleRate(
AudioStreamInfo.SAMPLE_RATE_UNSPECIFIED)
.audioStreamFlag(AudioStreamInfo.AudioStreamFlag.AUDIO_STREAM_FLAG_NONE)
.encodingFormat(AudioStreamInfo.EncodingFormat.ENCODING_INVALID)
.channelMask(AudioStreamInfo.ChannelMask.CHANNEL_INVALID)
.streamUsage(AudioStreamInfo.StreamUsage.STREAM_USAGE_UNKNOWN)
.build();
- (可选)通过采集的采样率、声道数和数据格式,调用 getMinBufferSize 方法获取采集任务所需的最小 buffer,参照该 buffer 值设置步骤3中 AudioCapturerInfo的bufferSizeInBytes。
- 使用步骤 1 创建的音频流构建音频播放的参数结构 AudioCapturerInfo,推荐使用 AudioCapturerInfo.Builder类来构造,根据音频采集的具体规格来设置具体参数。以真实的录制 pcm 流为例:
AudioStreamInfo audioStreamInfo = new AudioStreamInfo.Builder().encodingFormat(
AudioStreamInfo.EncodingFormat.ENCODING_PCM_16BIT) // 16-bit PCM
.channelMask(AudioStreamInfo.ChannelMask.CHANNEL_IN_STEREO) // 双声道
.sampleRate(44100) // 44.1kHz
.build();
AudioCapturerInfo audioCapturerInfo = new AudioCapturerInfo.Builder().audioStreamInfo(audioStreamInfo)
.build();
- (可选)设置采集设备,如麦克风、耳机等。通过 AudioManager.getDevices(AudioDeviceDescriptor.DeviceFlag.INPUT_DEVICES_FLAG) 获取到设备支持的输入设备,然后依照 AudioDeviceDescriptor.DeviceType 选择要选用的输入设备类型。
- 通过构造方法获取 AudioCapturer 类的实例化对象,其中步骤 3 的参数为必选参数,通过步骤 4 获取的指定录音设备为可选参数。
- (可选)设置采集音效,如降噪、回声消除等。使用 addSoundEffect(UUID type, String packageName)进行音效设置,其中 UUID 参考类 SoundEffect 中提供的静态变量。
- (可选)构造音频采集回调,首先继承抽象类 AudioCapturerCallback,并实现抽象方法 onCapturerConfigChanged(List<AudioCapturerConfig> configs),然后调用 AudioManager 类的 registerAudioCapturerCallback(AudioCapturerCallback cb )方法进行音频采集回调注册。代码示例如下:
private AudioManager audioManager = new AudioManager();
public void main() {
AudioCapturerCallback cb = new AudioCapturerCallback() {
@Override
public void onCapturerConfigChanged(List<AudioCapturerConfig> configs) {
configs.forEach(config -> doSomething(config));
}
};
audioManager.registerAudioCapturerCallback(cb);
}
private void doSomething(AudioCapturerConfig config) {
...
}
- 调用 AudioCapturer 实例化对象的 start() 方法启动采集任务。
- 采集的音频数据读取为 byte 流,循环调用 read 方法进行数据读取。
- 调用 AudioCapturer 实例化对象的 stop() 方法停止采集。
- 播放任务结束后,调用 AudioCapturer 实例化对象的release() 释放资源。