2

这个问题是前一个问题的后续问题,感谢@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 中对其进行测试)正在播放它并在第一个块之后停止。这是显示音频过早结束的结果/演示,这是在 github上运行的代码。

为什么是这样?这是因为 x-wav 数据具有像 End 这样的元数据或在标头/元数据中指定长度吗?如果是这样,这个元数据是什么,是否有某种方法可以编辑它以便浏览器成功连接接收到的块?

我知道标头'Content-Length': Buffer.length,但在这种情况下,我不知道整个流将持续多长时间。

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

4

2 回答 2

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
于 2011-12-12T23:17:32.330 回答
0

我不知道这个问题的答案,但看看 Shoutcast 流是如何通过网络传输的。它们是一个无限长的 mp3 文件,如果您看看它是如何完成的,应该可以应用类似的概念。

于 2011-12-02T14:24:27.050 回答