HarmonyOS-鸿蒙app开发 —基于java音频采集开发指导

HarmonyOS-鸿蒙app开发 —基于java音频采集开发指导

场景介绍

音频采集的主要工作是通过输入设备将声音采集并转码为音频数据,同时对采集任务进行管理。

接口说明

表1 音频采集类AudioCapturer的主要接口

接口名

描述

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)

获取一个即时的捕获时间戳。

开发步骤

  1. 构造音频流参数的数据结构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();

  1. (可选)通过采集的采样率、声道数和数据格式,调用getMinBufferSize方法获取采集任务所需的最小buffer,参照该buffer值设置步骤3中AudioCapturerInfo的bufferSizeInBytes。
  2. 使用步骤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();

  1. (可选)设置采集设备,如麦克风、耳机等。通过AudioManager.getDevices(AudioDeviceDescriptor.DeviceFlag.INPUT_DEVICES_FLAG)获取到设备支持的输入设备,然后依照AudioDeviceDescriptor.DeviceType选择要选用的输入设备类型。
  2. 通过构造方法获取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);
}
}

  1. 实例化AudioCapturer对象:

    1. AudioCapturer audioCapturer = new AudioCapturer(audioCapturerInfo);
  2. (可选)设置采集音效,如降噪、回声消除等。使用addSoundEffect(UUID type, String packageName)进行音效设置,其中UUID参考类SoundEffect中提供的静态变量。
  3. (可选)构造音频采集回调,首先继承抽象类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) {

}

  1. 调用 AudioCapturer实例化对象的start()方法启动采集任务。
  2. 采集的音频数据读取为byte流,循环调用AudioCapturer的read方法进行数据读取。
  3. 调用AudioCapturer实例化对象的stop()方法停止采集。
  4. 采集任务结束后,调用AudioCapturer实例化对象的release()释放资源。
🚀 如未找到文章请搜索栏搜素 | Ctrl+D收藏本站 | 联系邮箱:15810050733@qq.com