前端如何播放二进制音频数据

音频数据

播放数据

javascript 复制代码
const tryListen = async (row) => {
    awakenPlay(row.sid).then((res) => {   // 请求接口,拿到二进制音频数据
      const binaryData = atob(res.data);
      // 将二进制数据转换为 Uint8Array
      const byteArray = new Uint8Array(binaryData.length);
      for (let i = 0; i < binaryData.length; i++) {
        byteArray[i] = binaryData.charCodeAt(i);
      }
      const offset = 42; // 跳过可能的头部数据(假设前 42 字节是 WAV 头部),否则播放开始处有杂音
      // 将 Uint8Array 转换为 Int16Array
      const pcmData = new Int16Array(byteArray.buffer, offset);
      // 创建 AudioContext
      const audioContext = new window.AudioContext();
      // 创建 AudioBuffer
      const audioBuffer = audioContext.createBuffer(1, pcmData.length, 16000); // 单声道,16000 Hz
      const channelData = audioBuffer.getChannelData(0);
      // 将 PCM 数据归一化到 [-1, 1] 范围
      for (let i = 0; i < pcmData.length; i++) {
        channelData[i] = pcmData[i] / 32768.0;
      }

      // 播放音频
      const source = audioContext.createBufferSource();
      source.buffer = audioBuffer;
      source.connect(audioContext.destination);
      source.start();
    });
  };
相关推荐
三七吃山漆6 小时前
攻防世界——wife_wife
前端·javascript·web安全·网络安全·ctf
用户47949283569156 小时前
面试官问"try-catch影响性能吗",我用数据打脸
前端·javascript·面试
GISer_Jing6 小时前
前端营销技术实战:数据+AI实战指南
前端·javascript·人工智能
嘉琪0017 小时前
Vue3+JS 高级前端面试题
开发语言·前端·javascript
vipbic8 小时前
用 Turborepo 打造 Strapi 插件开发的极速全栈体验
前端·javascript
天涯学馆8 小时前
为什么 JavaScript 可以单线程却能处理异步?
前端·javascript
Android系统攻城狮8 小时前
Android16音频之获取音频时间戳AudioTrack.getTimestamp:用法实例(一百三十九)
音视频·android16·音频进阶
asdfg12589639 小时前
JS中的闭包应用
开发语言·前端·javascript
kirk_wang9 小时前
Flutter 导航锁踩坑实录:从断言失败到类型转换异常
前端·javascript·flutter
梦里不知身是客119 小时前
spark中如何调节Executor的堆外内存
大数据·javascript·spark