6

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

在应用程序启动时,我启动一个实例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

我的应用程序通过将上述 URL 发送到媒体频道来与 Chromecast 设备通信,Chromecast 接收器应用程序在指定的 URL 加载和播放视频 - 到目前为止一切都很好。

我的问题是我想实现对当前播放视频的搜索支持,一旦我向媒体频道发送搜索请求,我就会收到“Broken pipe”错误,GCDWebServer视频播放被中断。来自服务器的日志如下:

....
[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 服务器,但我遇到了同样的问题。

4

1 回答 1

4

iOS'AVPlayer首先请求文件大小,然后向服务器请求数据块,包括请求中所需的范围。在这个答案中,显示了 的网络活动,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网络浏览器播放视频,并且可以完美地擦洗/寻找时间。

于 2016-06-14T02:24:22.817 回答