此问题是 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 中测试它)正在播放它并在第一个 block 之后停止。这是result/demo showing the premature end of the audio ,这是 the code being run在 github 上。
这是为什么呢?这是因为 x-wav 数据具有像 End 这样的元数据或 header/meta-data 中指定的长度吗?如果是的话,这个元数据是什么?是否有某种方法可以对其进行编辑,以便浏览器成功连接接收到的 block ?
我知道 header 'Content-Length': Buffer.length
,但在本例中我不知道整个流的长度。
任何人都可以提供建议吗?是否可以在发送缓冲区之前对其进行编辑,以便浏览器正确连接它们?
最佳答案
我认为你最好的选择是使其类似于音频流,就像由icecast/shoutcast 发送的那样。我不认为 FireFox 默认会处理这个问题(旧版本不会),这就是为什么有这么多可爱的 flash 插件可以播放流。
您需要设置更多 header 以类似于流:
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
关于node.js - 连接 'audio/x-wav' 缓冲区并与 'Transfer-Encoding' : 'chunked' 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8354936/