2016-04-15 88 views
3

我有一個客戶端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服務器,但我遇到了同樣的問題。

回答

2

iOS'AVPlayer首先請求文件大小,然後向服務器請求數據塊,包括請求中的所需範圍。在此answer中,示出了AVPlayer的網絡活動,並且響應狀態碼是206,即Partial Content

所以,我們只需要使用數據的所需塊迴應:

webServer?.addDefaultHandlerForMethod("GET", requestClass: GCDWebServerRequest.self, asyncProcessBlock: { (request, completionBlock) in 
    let response = GCDWebServerFileResponse(file: path, byteRange: request.byteRange) 
    completionBlock(response) 
}) 

請,通知,這是重要的檢查,是否request.byteRange通過調用request.hasByteRange()定義。

使用我提供的代碼,我可以使用AVPlayer或網絡瀏覽器播放視頻,並使用清理/尋找時間完美工作。

+0

我修改了我的代碼,使用'byteRange'建議,但在我的情況下,消費者不是AVPlayer,而是Chromecast發送視頻數據的請求。它看起來像byteRange.length == -1,contentType = nil和contentLength = -1。即使在'hasByteRange()'中使用此視頻,視頻非常不穩定,我得到了很多:[錯誤]寫入套接字18時出錯:斷開的管道(32) – bizz84

+0

我觀察到客戶端(AVPlayer或Chrome)內容:在獲得視頻大小的初始請求後,他們從頭開始請求整個視頻。客戶端緩衝了足夠的數據後,它會停止接收,從而關閉連接,從而導致管道故障錯誤。 當客戶端需要更多數據(即播放器幾乎播放了所有緩存的視頻或用戶開始清理到不同的位置)時,客戶端啓動新的請求,字節範圍不是從零開始,而是在文件結尾處結束。 –

+0

例如,如果文件大小爲500,並且有兩個請求: 1. 0-499 - 播放器具有足夠的數據緩衝後,它關閉連接(實際上它只接收100個字節) 2. 101-499 - 當緩衝區變得幾乎爲空,播放器再次開始預加載,但不請求已經緩存的數據。 這解釋了破損管道錯誤 –