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

时间:2016-04-15 15:40:42

标签: ios webserver video-streaming gcdwebserver

我有一个客户端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配置才能使这项工作成功?我知道问题可以解决,因为有几个实时应用程序可以解决这个问题。
  • 我是否需要使用支持其他协议的服务器,例如HLS或RTSP?
  • 我是否需要以特定方式对视频文件进行编码?

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

1 个答案:

答案 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或网络浏览器播放视频并擦洗/寻找完美的时间。