连接'audio / x-wav'缓冲区并使用'Transfer-Encoding'服务:'chunked'

时间:2011-12-02 10:29:36

标签: node.js buffer wav audio-streaming chunked-encoding

此问题是previous question的后续问题,由于@thejh而得到了解决。

我正在尝试将文字转换为音频,并将数据提供给客户端,因为这些数据已被分组。数据。 到目前为止,我的标题看起来像这样:

res.writeHead(200, {
  'Content-Type': 'audio/wav',
   // I tried 'audio/x-wav' as well
  'Transfer-Encoding': 'chunked'
});

然后我将文本片段转换为队列中的音频(我将其作为base64编码数据返回),并按照这样的方式为其提供服务:

var src = Base64Audio.replace("data:audio/x-wav;base64,","");
var binAudio = new Buffer( src, 'base64');
res.write(binAudio);

所有信息都被传输并发送给客户端,但出于某种原因,浏览器(我在Firefox 7.0.1中测试它)正在播放它并在第一个块之后停止。这是result/demo showing the premature end of the audio,这是github上的the code being run

这是为什么?这是因为x-wav数据在头/元数据中有元数据,如End或指定长度?如果是这样,这个元数据是什么,是否有一些编辑方式,以便浏览器成功连接收到的块?

我知道标题'Content-Length': Buffer.length,但在这种情况下,我不知道整个视频流的持续时间。

任何人都可以提供建议。是否可以在发送缓冲区之前编辑缓冲区,以便浏览器正确连接它们?

2 个答案:

答案 0 :(得分:1)

我认为你最好的选择是让它像一个音频流,就像icecast / shoutcast一样。我不认为FireFox会默认处理它(旧版本没有),这就是为什么有这么多可爱的Flash插件来播放流。

您需要设置一些类似于流的标题:

HTTP/1.0 200 OK
Content-Type: audio/wav
Transfer-Encoding: chunked
icy-br: ##
ice-audio-info:bitrate=##;samplerate=#####
icy-description:Some Name
icy-genre:Alternative
icy-name:Name
icy-pub:0
icy-url:http://yoursite.com
Server:Whatever you want
Cache-Control: no-cache
Connection: Keep-Alive

答案 1 :(得分:0)

我不知道答案,但看看Shoutcast流是如何通过网络传播的。它们是一个无限长的mp3文件,如果你看看它是如何完成的,那么类似的概念应该适用。