来自WebSocket的WebAudio AAC流媒体播放

来自WebSocket的WebAudio AAC流媒体播放,websocket,web-audio-api,Websocket,Web Audio Api,我需要播放来自WebSocket的aac(adts)流媒体,我搜索了互联网,发现aac.js可以做到,但听起来好像延迟了2~5秒 我发现有些人用网络音频来做这件事。我尝试使用以下代码,但解码器在某些数据包后返回错误(不总是,但重复错误): 我的javascript示例: var context = new AudioContext(); var nextStartTime = 0; var audioWs = new WebSocket("ws://" + hostip + ":

我需要播放来自WebSocket的aac(adts)流媒体,我搜索了互联网,发现aac.js可以做到,但听起来好像延迟了2~5秒

我发现有些人用网络音频来做这件事。我尝试使用以下代码,但解码器在某些数据包后返回错误(不总是,但重复错误):

我的javascript示例:

  var context  = new AudioContext();
  var nextStartTime = 0;

  var audioWs = new WebSocket("ws://" + hostip + ":8084");
  audioWs.binaryType = 'arraybuffer';

  audioWs.onopen = function(evt) {
      console.log("onOpen");
      bexit = 0;
  };

  audioWs.onclose = function(evt) {
      console.log("close");
  };

  audioWs.onmessage = function(evt) {
      var blob = evt.data;
      if ( blob.slice == undefined) {
          console.log("undefined message");
          return;
      }
      decodeAudio(blob);
  };

  audioWs.onerror = function(evt) {
      console.log("error");
  };

  var decodeAudio = function(blob) {
      context.decodeAudioData(
          blob,
          function(buffer) {
              if (!buffer) {
                  console.log('error decoding file data: ' + url);
                  return;
              }
              console.log("playback buffer");
              playBuffer(buffer);
          },
          function(error) {
              console.error("decodeAudioData error", error);
          });
  };

  var playBuffer = function(buffer) {
      var source = context.createBufferSource();
      source.buffer = buffer;
      if(nextStartTime == 0){
          nextStartTime = context.currentTime + buffer.duration/2;
      }
      source.connect(context.destination);
      source.start(nextStartTime);
      nextStartTime += buffer.duration;
  };
我不确定这是否是由于从websocket接收到的数据输入太快导致的,然后导致解码器错误!我该怎么修


或者,使用WebAudio API执行此任务可能不是一个好方法?

WebAudio的
decodeAudioData
无法解码部分Blob。一般来说,它需要整个文件,因为在许多编码格式中,所需的信息(采样率、频道、采样大小等)仅在开始时提供。

尝试使用媒体源扩展进行流式播放。
  var context  = new AudioContext();
  var nextStartTime = 0;

  var audioWs = new WebSocket("ws://" + hostip + ":8084");
  audioWs.binaryType = 'arraybuffer';

  audioWs.onopen = function(evt) {
      console.log("onOpen");
      bexit = 0;
  };

  audioWs.onclose = function(evt) {
      console.log("close");
  };

  audioWs.onmessage = function(evt) {
      var blob = evt.data;
      if ( blob.slice == undefined) {
          console.log("undefined message");
          return;
      }
      decodeAudio(blob);
  };

  audioWs.onerror = function(evt) {
      console.log("error");
  };

  var decodeAudio = function(blob) {
      context.decodeAudioData(
          blob,
          function(buffer) {
              if (!buffer) {
                  console.log('error decoding file data: ' + url);
                  return;
              }
              console.log("playback buffer");
              playBuffer(buffer);
          },
          function(error) {
              console.error("decodeAudioData error", error);
          });
  };

  var playBuffer = function(buffer) {
      var source = context.createBufferSource();
      source.buffer = buffer;
      if(nextStartTime == 0){
          nextStartTime = context.currentTime + buffer.duration/2;
      }
      source.connect(context.destination);
      source.start(nextStartTime);
      nextStartTime += buffer.duration;
  };