此问题是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中测试它)正在播放它并在第一个块之后停止。这是result/demo showing the premature end of the audio,这是github上的the code being run。
这是为什么?这是因为x-wav数据在头/元数据中有元数据,如End或指定长度?如果是这样,这个元数据是什么,是否有一些编辑方式,以便浏览器成功连接收到的块?
我知道标题'Content-Length': Buffer.length
,但在这种情况下,我不知道整个视频流的持续时间。
任何人都可以提供建议。是否可以在发送缓冲区之前编辑缓冲区,以便浏览器正确连接它们?
答案 0 :(得分: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
答案 1 :(得分:0)
我不知道答案,但看看Shoutcast流是如何通过网络传播的。它们是一个无限长的mp3文件,如果你看看它是如何完成的,那么类似的概念应该适用。