如何在iOS上使用embedded式HTTP服务器实现Video Seek支持?

我有一个客户端iOS应用程序,它使用GCDWebServer来提供存储在我的设备上的应用程序的NSSearchPathDirectory.DocumentDirectory文件夹中的图像和video。

在应用程序启动时,我启动了一个GCDWebServer实例并为我的请求添加一个文件响应处理程序:

 self.addDefaultHandlerForMethod("GET", requestClass: GCDWebServerFileRequest.self) { request in return GCDWebServerFileResponse(file: self.filePathForResponse(request.URL)) } 

我可以validation,当应用程序正在运行,我可以成功地从我的设备下载文件:

 curl -O http://192.168.0.15:8080/files/IMG_1213-1280x720.MOV 

我的应用通过向媒体渠道发送类似上述内容的url与Chromecast设备通话,Chromecast接收器应用会通过指定的url加载和播放video – 目前为止都很好。

我的问题是我想实现对当前正在播放的video的寻求支持,只要我向媒体频道发送一个search请求,就会从GCDWebServer收到一个“Broken pipe”错误,并且video播放被中断。 从服务器login如下:

 .... [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 ,但追求相当于跳转到文件的不同部分和我不确定读取这样的文件是否适用于我的configuration。

  • 有没有一种方法可以configurationGCDWebServer使其工作? 我知道这个问题可以解决,因为有几个这样做的现场应用程序。
  • 我是否需要使用支持其他协议(如HLS或RTSP)的服务器?
  • 我是否需要以特定方式编码我的video文件?

作为参考,我也尝试了另一个名为Swifter的 HTTP服务器,但我遇到了同样的问题。

iOS的AVPlayer首先请求文件大小,然后向服务器请求一大块数据,包括请求中所需的范围。 在这个答案中 ,显示了AVPlayer的networking活动,响应状态码是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或网页浏览器播放video,并清理/寻找完美的时间。