我有一个客户端iOS应用程序,它使用GCDWebServer来提供存储在我设备上应用的NSSearchPathDirectory.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
我的应用通过将以上网址发送到媒体频道与Chromecast设备进行对话,Chromecast接收器应用加载并播放指定网址的视频 - 到目前为止一切顺利。
我的问题是我想实现寻求对当前正在播放的视频的支持,并且一旦我向媒体频道发送搜索请求,我就会从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
配置才能使这项工作成功?我知道问题可以解决,因为有几个实时应用程序可以解决这个问题。作为参考,我还尝试了另一个名为Swifter的HTTP服务器,但我遇到了同样的问题。
答案 0 :(得分:3)
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
或网络浏览器播放视频并擦洗/寻找完美的时间。