我有這個視圖稱爲虛擬,我想從我的服務器流mp3,我想流到<audio src="/stream">
標記,以便客戶端可以立即開始播放文件,而無需等待整個文件。標題在金字塔發送chunked二進制
def dummy(request):
headers = {
'Content-Transfer-Encoding': 'binary',
'Content-Type': 'audio/mpeg',
'Transfer-Encoding': 'chunked',
'Connection': 'keep-alive',
'Cache-Control': 'no-cache'
}
with open('songer.mp3') as handle:
while True:
bytes = handle.read(CHUNK)
if not bytes:
break
return Response(bytes, headers=headers)
但我發現了由鉻ERR_INVALID_CHUNKED_ENCODING
,也是我不知道如果我返回響應會工作,因爲那豈不是結束反應一旦進入到返回的方式嗎?
如果上面的代碼自動處理字節流,然後這就是我要找的。我會玩它,謝謝 – Marconi 2012-08-01 23:34:25
謝爾蓋:謝謝你的作品,但我面臨另一個問題。如果整個mp3已經被讀取並保存在一個變量中,那麼我該如何創建迭代器並將字節拆分成塊並使用yiel返回? – Marconi 2012-08-02 06:59:39
是的,這將工作。或者使用StringIO將變量轉換爲類文件對象並將其分配給Response.body_file。雖然我不確定上述方法與僅將您的變量分配給Request.body相比有什麼不同。我的意思是,在服務器上沒有什麼特別的事情要讓客戶端在播放/顯示一小部分文件時立即播放/顯示文件 - 這就是WWW從一開始就工作的原因。您只需避免在提供服務前將整個大文件讀入內存,這就是body_file和app_iter的用途。 – Sergey 2012-08-02 10:26:28