Dragon龍龖龘 2023-08-16 16:36 采纳率: 0%
浏览 148
已结题

在js中如何实现音频的流式播放?

在js中如何实现音频的流式播放,即边接收语音数据边播放,减少延时?

img


目前已成功调用了阿里云的语音合成接口,并将返回的每一包语音流通过socket传到js中,最后如何在js中实现流式播放,即边接收语音数据边播放,减少延时。可能受限于我的技术水平,试过网上的各种方法效果都不理想,还请各位帮忙解决,谢谢~

  • 写回答

13条回答 默认 最新

  • 日霄科技 2023-08-16 17:23
    关注
    获得0.45元问题酬金
    
    // 创建AudioContext对象
    const audioContext = new (window.AudioContext || window.webkitAudioContext)();
    
    // 创建GainNode对象来控制音量
    const gainNode = audioContext.createGain();
    gainNode.connect(audioContext.destination);
    
    // 创建一个用于存储音频数据的数组
    let audioData = [];
    
    // 创建WebSocket连接
    const socket = new WebSocket('wss://你的服务器地址');
    
    // 监听WebSocket消息
    socket.addEventListener('message', (event) => {
      // 接收音频数据
      const audioChunk = event.data;
    
      // 将音频数据存储到数组中
      audioData.push(audioChunk);
    
      // 如果数组中的数据足够多,就开始播放
      if (audioData.length > 5) {
        playAudio();
      }
    });
    
    function playAudio() {
      // 创建一个可变长度的数组缓冲区
      const audioBuffer = audioContext.createBuffer(1, audioData.length, audioContext.sampleRate);
      const channelData = audioBuffer.getChannelData(0);
    
      // 将接收到的音频数据拷贝到数组缓冲区中
      for (let i = 0; i < audioData.length; i++) {
        channelData[i] = audioData[i];
      }
    
      // 创建一个音频源节点
      const source = audioContext.createBufferSource();
      source.buffer = audioBuffer;
      source.connect(gainNode);
    
      // 播放音频
      source.start();
    
      // 清空音频数据数组
      audioData = [];
    }
    
    评论

报告相同问题?

问题事件

  • 系统已结题 8月24日
  • 创建了问题 8月16日