HarmonyOS鸿蒙Next中音频的录制和播放。求!
HarmonyOS鸿蒙Next中音频的录制和播放。求! 在AudioCapture和AudioRender两大文档中,只是提供相关功能。并不提供如何使用这两个功能实现音频的录制和播放。我该如何在应用中实现这两个功能?再者,录制是不是要有且只要申请MICROPHONE权限?如果是的话该如何申请?
5 回复
建议多看官方文档的例子,例子写的挺好的,需要多看 才能熟练运用
更多关于HarmonyOS鸿蒙Next中音频的录制和播放。求!的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
第一步,初始化
//1录音 设置录音相关的参数
let audioCapturerOptions: audio.AudioCapturerOptions = {
streamInfo: {
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_16000, // 采样率
channels: audio.AudioChannel.CHANNEL_1, // 通道
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式
},
//录制设备的信息
capturerInfo: {
//麦克风
source: audio.SourceType.SOURCE_TYPE_MIC,
capturerFlags: 0
}
};
//将录音参数传进去后创建出录音对象
this.audioCapturer = await audio.createAudioCapturer(audioCapturerOptions)
//音频输入时,音频流 写入到 缓存中的指定文件下
this.audioCapturer.on('readData', (buffer: ArrayBuffer) => { //buffer缓冲区二进制的数据.也是音频流文件
let uint8Array: Uint8Array = new Uint8Array(buffer); //将二进制的音频流文件转化格式
// 可以通过如下方式获取音频流:1、通过录音获取音频流;2、从音频文件中读取音频流
// 2、从音频文件中读取音频流:demo参考
});
第二步,开始录音
```javascript
await this.audioCapturer.start();
this.voiceState = VoiceState.VOICING //自己创建一个voiceState变量,更新状态。录音中
第三步,结束录音
```javascript
async closeRecord() {
//3录音,停止录制
await this.audioCapturer?.stop();
this.voiceState = VoiceState.VOICEOVER
}
第四步,获取麦克风权限
```javascript
// 校验权限
permissionPlugin.requestPermissions(['ohos.permission.MICROPHONE'])
.then(() => {
window.getLastWindow(getContext())
.then(win => {
win.getUIContext()
.setKeyboardAvoidMode(KeyboardAvoidMode.RESIZE)
})
})
如果期间有其他业务需要或调用时机需要自行判断
HarmonyOS Next中音频录制使用AudioCapturer API,支持PCM格式采集。播放使用AudioPlayer API,支持多种音频格式。通过AudioManager管理音频流和焦点。录制参数可设置采样率、声道数、位宽等属性。播放支持本地文件或网络流媒体,提供音量调节、进度控制等功能。音频数据可通过回调或轮询方式获取。系统提供低延迟音频处理能力。
在HarmonyOS Next中实现音频录制和播放,可以通过以下方式:
- 音频录制实现:
- 首先在config.json中声明麦克风权限:
"reqPermissions": [
{
"name": "ohos.permission.MICROPHONE",
"reason": "用于音频录制"
}
]
- 代码实现示例:
import audio from '@ohos.multimedia.audio';
// 1. 创建音频录制实例
let audioCapturer = await audio.createAudioCapturer();
// 2. 配置参数
let capturerConfig = {
audioSampleRate: audio.AudioSampleRate.SAMPLE_RATE_44100,
audioChannels: audio.AudioChannel.CHANNEL_1,
audioSampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
audioEncodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
};
// 3. 初始化配置
await audioCapturer.init(capturerConfig);
// 4. 开始录制
await audioCapturer.start();
// 5. 读取音频数据
let buffer = await audioCapturer.read(bufferSize, isBlocking);
// 6. 停止录制
await audioCapturer.stop();
- 音频播放实现:
import audio from '@ohos.multimedia.audio';
// 1. 创建音频播放实例
let audioRenderer = await audio.createAudioRenderer();
// 2. 配置参数
let rendererConfig = {
audioSampleRate: audio.AudioSampleRate.SAMPLE_RATE_44100,
audioChannels: audio.AudioChannel.CHANNEL_2,
audioSampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
audioEncodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
};
// 3. 初始化配置
await audioRenderer.init(rendererConfig);
// 4. 开始播放
await audioRenderer.start();
// 5. 写入音频数据
await audioRenderer.write(buffer);
// 6. 停止播放
await audioRenderer.stop();
注意:录制确实只需要申请MICROPHONE权限,运行时还需要动态申请权限:
import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
let atManager = abilityAccessCtrl.createAtManager();
try {
await atManager.requestPermissionsFromUser(this.context, ['ohos.permission.MICROPHONE']);
} catch (err) {
console.error('权限申请失败');
}