接口说明
接口名 |
描述 |
---|---|
AudioCapturer(AudioCapturerInfo audioCapturerInfo) throws IllegalArgumentException |
构造函数,设置录音相关音频参数,使用默认录音设备。 |
AudioCapturer(AudioCapturerInfo audioCapturerInfo, AudioDeviceDescriptor devInfo) throws IllegalArgumentException |
构造函数,设置录音相关音频参数并指定录音设备。 |
getMinBufferSize(int sampleRate, int channelCount, int audioFormat) |
获取指定参数条件下所需的最小缓冲区大小。 |
addSoundEffect(UUID type, String packageName) |
增加录音的音频音效。 |
start() |
开始录音。 |
read(byte[] data, int offset, int size) |
读取音频数据。 |
read(byte[] data, int offset, int size, boolean isBlocking) |
读取音频数据并写入传入的byte数组中。 |
read(float[] data, int offsetInFloats, int sizeInFloats) |
阻塞式读取音频数据并写入传入的float数组中。 |
read(float[] data, int offsetInFloats, int sizeInFloats, boolean isBlocking) |
读取音频数据并写入传入的float数组中。 |
read(short[] data, int offsetInShorts, int sizeInShorts) |
阻塞式读取音频数据并写入传入的short数组中。 |
read(short[] data, int offsetInShorts, int sizeInShorts, boolean isBlocking) |
读取音频数据并写入传入的short数组中。 |
read(java.nio.ByteBuffer buffer, int sizeInBytes) |
阻塞式读取音频数据并写入传入的ByteBuffer对象中。 |
read(java.nio.ByteBuffer buffer, int sizeInBytes, boolean isBlocking) |
读取音频数据并写入传入的ByteBuffer对象中。 |
stop() |
停止录音。 |
release() |
释放录音资源。 |
getSelectedDevice() |
获取输入设备信息。 |
getCurrentDevice() |
获取当前正在录制音频的设备信息。 |
getCapturerSessionId() |
获取录音的session ID。 |
getSoundEffects() |
获取已经激活的音频音效列表。 |
getState() |
获取音频采集状态。 |
getSampleRate() |
获取采样率。 |
getAudioInputSource() |
获取录音的输入设备信息。 |
getBufferFrameCount() |
获取以帧为单位的缓冲区大小。 |
getChannelCount() |
获取音频采集通道数。 |
getEncodingFormat() |
获取音频采集的音频编码格式。 |
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类的实例化对象(构造AudioCapturer类的实例化对象前需先去配置录音权限–ohos.permission.MICROPHONE),其中步骤3的参数为必选参数,通过步骤4获取的指定录音设备为可选参数。
录音权限的申请,需要开发者在config.json文件中的“reqPermissions”字段中声明所需要的权限。
“module”: {
“reqPermissions”: [
{
“name”: “ohos.permission.MICROPHONE”
},
{
…
}
]
}
增加Ability接口的访问权限控制:
public class MainAbility extends Ability {
@Override
public void onStart(Intent intent) {
…
requestPermissions(); //在onStart方法中调用申请的权限
}
private void requestPermissions() {
String[] permissions = {
SystemPermission.ohos.permission.MICROPHONE, …,…
};
requestPermissionsFromUser(Arrays.stream(permissions)
.filter(permission -> verifySelfPermission(permission) != IBundleManager.PERMISSION_GRANTED).toArray(String[]::new), 0);
}
}
-
实例化AudioCapturer对象:
- AudioCapturer audioCapturer = new AudioCapturer(audioCapturerInfo);
- (可选)设置采集音效,如降噪、回声消除等。使用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流,循环调用AudioCapturer的read方法进行数据读取。
- 调用AudioCapturer实例化对象的stop()方法停止采集。
- 采集任务结束后,调用AudioCapturer实例化对象的release()释放资源。