2014-12-29 170 views
2

我通过websockets发送编码的现场音频流(mp3或ogg),我想用网络音频api播放它。 我阅读并尝试了几件事,但目前为止没有任何工作...使用网络音频播放编码的音频流Api

我一直试图用decodeAudioData方法来做到这一点。 但是这种方法不能处理连续的流。 所以我最后的办法是这样的:

ws.onmessage = function (evt) { 

     context.decodeAudioData(evt.data, function (decodedData) { 
      source = context.createBufferSource(); 
      source.buffer = decodedData; 
      source.start(startTime); 
      source.connect(context.destination); 

      startTime += decodedData.duration; 
     }, 
     function(e) { 
      var test = e; 
     } 
     ); 

    }; 

这个工程至少有MP3歌曲,但不是很好。在收到的块之间有一个非常小的休息。所以流没有流畅的播放。我不知道这是什么原因......也许decodeData.duration属性不够精确,或者在任何地方都有某种延迟。

无论如何,它与ogg文件完全不兼容。我可以听到第一个接收到的块,但其余的被忽略。也许这与丢失标题有关?

是否有任何其他方法在网络音频API播放编码的直播流然后decodeAudioData?我找不到任何东西...

感谢您的帮助!

回答

1

不要通过网络套接字来做到这一点,如果你可以帮助它。让浏览器完成工作并通过HTTP进行播放。否则,你必须重新创造一切。

如果硬要出于某种原因重塑一切,你必须:

  • 缓冲输入数据
  • 解码数据
  • 缓冲解码后的数据
  • 回放您的解码PCM缓冲器与脚本节点
  • 处理缓冲区欠载/超限(可能通过播放静音或丢弃PCM样本)的时间

你如何做这些项目取决于你的具体需求和实施,所以我会建议分裂的问题,如果你卡住任何。