node.js - 连接 'audio/x-wav' 缓冲区并与 'Transfer-Encoding' : 'chunked' 一起使用

标签 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 中测试它)正在播放它并在第一个 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/

相关文章:

c# - 如何将数据从一个 UnmanagedMemoryStream 复制到另一个

Python - 对winsound使用多个标志?

node.js - Gulp/Node - SASS 编译错误

node.js - AWS Cognito Node.JS 用户身份验证返回未知问题

node.js - 克尼克斯 :Error Pool2 - Error: Error allocating resources: connect ECONNREFUSED

c - 刷新输入缓冲区 C

python - 使用 python io 从缓冲流组成行读取器

java - 在没有临时文件的情况下将音频流转换为Java中的WAV字节数组

java - 如何在 Java 中使用 .aiff 文件?

angularjs - 如何使用nginx来提高nodejs的性能