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实现。

回到顶部