音频格式转换

上一篇文章说了如何electron获取音频流,那么音频格式如何转换呢?

 async handleAudioProcess(event) {
      let that = this;
      if (!this.recording) {
        return; // 如果录制已停止,则不处理音频数据
      }
      const inputBuffer = event.inputBuffer;
      const channelData = inputBuffer.getChannelData(0);
      // let max = Math.max.apply(Math, channelData);
      // let maxVal = Math.round(max * 100);
      let data16k;
      let bufferPCM;
      let dataPCM;
      data16k = trans48to16(channelData);
      // 创建data16k.length * 2个字节的缓存区
      bufferPCM = new ArrayBuffer(data16k.length * 2);
      // 返回值:它返回一个新的DataView对象,它将代表指定的数据缓冲区。
      dataPCM = new DataView(bufferPCM);
      floatTo16BitPCM(dataPCM, 0, data16k);
      // 将 PCM 数据发送给后端 WebSocket
      if (this.socket && this.socket.readyState === WebSocket.OPEN) {
        this.socket.send(dataPCM); // 发送二进制数据
      }
    },
//floatTo16BitPCM(dataPCM, 0, data16k);
export function floatTo16BitPCM(output, offset, input) {
    for (let i = 0; i < input.length; i++, offset += 2) {
        let s = Math.max(-1, Math.min(1, input[i]));
        output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7fff, true);
    }
}
//48k to 16k
//oriData  第一个通道32位浮点型数组  pcm数据
// 采样率转换
// 采样率就是1秒中采集了多少个采样点,48000hz采样转16000hz的话就是正好三分之一的采样点,所以我们可以每3个采样点取一个
export function trans48to16(oriData) {
    var tarData = [];
    for (let i = 0; i < oriData.length / 3; i += 1) {
        let dataEle;
        if (i * 3 + 2 >= oriData.length - 1) {
            dataEle = oriData[i * 3];
        } else {
            dataEle =
                (oriData[i * 3] + oriData[i * 3 + 1] + oriData[i * 3 + 2]) / 3;
        }
        tarData.push(dataEle);
    }
    return tarData;
}

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值