2011-12-02 19 views
2

此问题是previous question的后续处理,由于@thejh而解决。连接'音频/ x-wav'缓冲区并使用'传输编码':'chunked'

我试图将文本转换为音频并将数据作为“分块”数据提供给客户端。 到目前为止,我的头看起来像这样:

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,但在这种情况下,我不知道整个流将会持续多久。

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

+0

在演示点的音频元素ec2-46-137-25-111.eu - 西1.compute.amazonaws .com似乎在倒台。 – rcode

+0

@rcode演示/示例失败应该再次启动/联机。 – Christopher

回答

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 
0

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