我有一個客戶端iOS應用程序,它使用GCDWebServer來爲存儲在我的設備上應用程序的NSSearchPathDirectory.DocumentDirectory
文件夾中的圖像和視頻提供服務。如何在iOS上使用嵌入式HTTP服務器實現Video Seek支持?
在應用程序啓動時,我開始的GCDWebServer
一個實例,並添加一個文件響應處理我的請求:
self.addDefaultHandlerForMethod("GET", requestClass: GCDWebServerFileRequest.self) { request in
return GCDWebServerFileResponse(file: self.filePathForResponse(request.URL))
}
我可以確認的是,雖然應用程序正在運行,我可以成功地從我的設備上下載文件:
curl -O http://192.168.0.15:8080/files/IMG_1213-1280x720.MOV
我的應用通過向媒體渠道發送類似上述網址的Chromecast設備進行通話,Chromecast接收器應用會在指定的網址加載和播放視頻 - 目前爲止都很好。
我的問題是,我想實現尋求支持當前正在播放的視頻,並且一旦我向媒體頻道發送搜索請求,我會從GCDWebServer
中收到一條「Broken pipe」錯誤,並且視頻播放被中斷。從服務器日誌如下:
....
[DEBUG] Connection sent 32768 bytes on socket 24
[DEBUG] Connection sent 32768 bytes on socket 24
[ERROR] Error while writing to socket 24: Broken pipe (32)
[DEBUG] Did close connection on socket 24
我最好這個問題的理解是正常播放的作品,因爲它是一樣的下載從開始一個文件到另一端,這可以用一個普通GCDWebServerFileResponse
送達,但尋求相當於跳到文件的不同部分,我不確定讀取這樣的文件是否適用於我的配置。
- 有沒有辦法讓我可以配置
GCDWebServer
來完成這項工作?我知道這個問題可以解決,因爲有幾個這樣做的現場應用程序。 - 我是否需要使用支持其他協議(如HLS或RTSP)的服務器?
- 我是否需要以特定方式編碼我的視頻文件?
僅供參考我也嘗試了另一個名爲Swifter的HTTP服務器,但我遇到了同樣的問題。
我修改了我的代碼,使用'byteRange'建議,但在我的情況下,消費者不是AVPlayer,而是Chromecast發送視頻數據的請求。它看起來像byteRange.length == -1,contentType = nil和contentLength = -1。即使在'hasByteRange()'中使用此視頻,視頻非常不穩定,我得到了很多:[錯誤]寫入套接字18時出錯:斷開的管道(32) – bizz84
我觀察到客戶端(AVPlayer或Chrome)內容:在獲得視頻大小的初始請求後,他們從頭開始請求整個視頻。客戶端緩衝了足夠的數據後,它會停止接收,從而關閉連接,從而導致管道故障錯誤。 當客戶端需要更多數據(即播放器幾乎播放了所有緩存的視頻或用戶開始清理到不同的位置)時,客戶端啓動新的請求,字節範圍不是從零開始,而是在文件結尾處結束。 –
例如,如果文件大小爲500,並且有兩個請求: 1. 0-499 - 播放器具有足夠的數據緩衝後,它關閉連接(實際上它只接收100個字節) 2. 101-499 - 當緩衝區變得幾乎爲空,播放器再次開始預加載,但不請求已經緩存的數據。 這解釋了破損管道錯誤 –