这个问题是一个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);所有的信息都被传输并发送到客户端,但由于某种原因,浏览器(我在Firefox7.0.1中测试它)正在播放它,并在第一个块之后停止。这是result/demo showing the premature end of the audio,这是github上的the code being run。
为什么会这样呢?这是因为x-wav数据在报头/元数据中有像End或指定长度的元数据吗?如果是这样的话,这些元数据是什么?有没有什么方法可以编辑它,以便浏览器成功地连接收到的块?
我知道头'Content-Length': Buffer.length,但在这种情况下,我不知道整个流有多长。
有没有人能提点建议。有没有可能在发送缓冲区之前编辑它们,以便浏览器正确地连接它们?
发布于 2011-12-13 07:17:32
我认为你最好的办法是让它看起来像一个音频流,就像通过icecast/shoutcast发送的那样。我认为FireFox在默认情况下不会处理这个问题(老版本不会),这就是为什么有这么多可爱的flash插件来播放流。
您需要设置更多的headers以使其类似于流:
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发布于 2011-12-02 22:24:27
我不知道这个问题的答案,但看看Shoutcast流是如何传来的。它们是一个无限长的mp3文件,如果您看一看它是如何完成的,应该可以应用类似的概念。
https://stackoverflow.com/questions/8354936
复制相似问题