2011-12-02 21 views
2

此問題是previous question的後續處理,由於@thejh而解決。連接'音頻/ x-wav'緩衝區並使用'傳輸編碼':'chunked'

我試圖將文本轉換爲音頻並將數據作爲「分塊」數據提供給客戶端。 到目前爲止,我的頭看起來像這樣:

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

在演示點的音頻元素ec2-46-137-25-111.eu - 西1.compute.amazonaws .com似乎在倒臺。 – rcode

+0

@rcode演示/示例失敗應該再次啓動/聯機。 – Christopher

回答

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 
0

我不知道這個答案,但看看Shoutcast流如何通過電線。它們是一個無限長的mp3文件,如果你看看它是如何完成的,那麼類似的概念應該適用。