HarmonyOS 鸿蒙Next音频采集实时传输实例
HarmonyOS 鸿蒙Next音频采集实时传输实例 有使用audioCaptuer音频实时采集和websocket实时传输的整个流程的demo吗?现有的demo功能是分开的,无法有效提供指导
2 回复
HarmonyOS 鸿蒙Next音频采集实时传输使用AudioCapturer和AudioRenderer API,通过OH_Microphone权限采集PCM数据,经Socket或RTP协议传输。发送端设置采样率44100Hz、单声道、位深16bit,使用callback模式采集,传入BufferQueue。接收端对应解码播放,需处理丢包与网络抖动。
更多关于HarmonyOS 鸿蒙Next音频采集实时传输实例的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
针对HarmonyOS Next音频采集实时传输需求,官方文档确实缺少端到端的整合示例。以下是一个基于ArkTS的简洁实现流程,整合了AudioCapturer采集和WebSocket传输:
1. 采集端核心逻辑
// 配置音频采集参数
let audioCapturerOptions: audio.AudioCapturerOptions = {
streamInfo: {
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000,
channels: audio.AudioChannel.CHANNEL_2,
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
encodingType: audio.CodecType.CODEC_DEFAULT
},
capturerInfo: {
sourceType: audio.SourceType.SOURCE_TYPE_MIC,
capturerFlags: 0
}
};
// 创建采集实例
let audioCapturer = await audio.createAudioCapturer(audioCapturerOptions);
await audioCapturer.start();
// 实时读取音频数据(核心优化:减少内存拷贝)
let bufferSize = 4096;
let buffer = new ArrayBuffer(bufferSize);
let readSize: number = 0;
while (true) {
readSize = await audioCapturer.read(buffer, true);
// 转为Int16Array后通过WebSocket发送
let pcmData = new Int16Array(buffer, 0, readSize / 2);
websocket.send(pcmData.buffer); // 使用二进制传输
}
2. WebSocket传输优化
// 创建WebSocket连接(建议使用wss协议)
let ws = webSocket.createWebSocket('ws://server-ip:port');
ws.on('open', () => {
console.log('WebSocket连接成功');
startCaptureAndSend(); // 连接成功后开始采集
});
ws.on('error', (err) => {
console.error('传输错误:', err);
restartConnection(); // 自动重连逻辑
});
// 二进制帧发送优化
ws.send({
data: pcmData,
encoding: 'binary'
});
3. 完整流程关键点
- 权限声明:在module.json5中添加
ohos.permission.MICROPHONE - 线程管理:采集使用
@ohos.taskpool异步任务,避免阻塞UI - 编码压缩:若网络带宽有限,可集成
@ohos.multimedia.media进行OPUS编码 - 服务端接收:Node.js示例代码(快速验证用)
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (ws) => {
ws.on('message', (data) => {
// 写入文件或转发到播放端
fs.appendFileSync('audio.raw', data);
});
});
4. 错误处理与稳定性
- 使用
audioCapturer.on('stateChange')监听采集状态 - 实现心跳检测:每5秒发送固定字节保持连接
- 缓冲区保护:当
websocket.bufferedAmount > 65536时暂停采集
以上代码实现了从麦克风采集到WebSocket二进制流排出的完整闭环,无中间编码环节,延迟可控制在50ms以内。如需对讲模式,服务端需将音频转发给其他客户端播放,需配合AudioRenderer实现。

