2014-06-22 25 views

回答

3

不是100%確定,因爲您沒有提供代碼或示例流來測試,但是您對HTTP範圍請求的處理已損壞。

在您的示例請求中,客戶端發送Range: bytes=0-,並且服務器與1MiB響應來響應:

  • Content-Length: 1048576(又名1 MIB)
  • Content-Range: 0-1048575/...

這是錯誤的,客戶沒有要求這個!它確實請求bytes=0-,這意味着從位置0到整個流結束的所有數據(見http 1.1 RFC),即響應等於1而沒有任何Range。 (IIRC,Firefox仍然會發送Range: bytes=0-來檢測服務器是否首先處理範圍)。

這與Content-Length相結合,導致客戶端(Firefox)認爲整個資源只有1MiB的大小,而不是真正的大小。我想你的測試流的前1個MiB會以1:06的音頻出現。

PS:Content-Duration標題(又名RFC 3803)是瀏覽器通常不會實現的,只是忽略。

+0

就是這樣。謝謝。 – skmasq

+0

只是一個想法。有沒有人嘗試過一些http 3xx頭文件?'retry-after:1'和'503 Service Temporarily Unavailable'頭文件。這超過了模擬最大執行時間。 –

+0

FWIW,IE + Edge和Chrome在服務器以低於請求的響應時都可以正常工作 - 它們只是發出另一個請求,以便在響應停止的地方繼續。這反過來又可以在像Rails這樣的框架中實現視頻流,而不需要長時間運行的連接來捆綁一個流程。如果流的源頭是一個文件,那麼在前面加入類似nginx的東西可以解決這個問題,但是如果它是動態創建的,它不能。 –

0

只是一個想法。您嘗試了一些HTTP 3xx標頭,如: '308恢復未完成'或'503服務暫時不可用'加'重試後:2'或'413請求實體太大'加'重試後:2'