我们可以在流式传输 m3u8 文件时手动下载/缓存传输流吗?



我正在尝试播放来自 m3u8 文件的传输流。我的要求是在将下载的数据交给AVPlayer之前对其进行处理。为此,我使用代理服务器[GCDWebserver]来拦截所有请求。在代理服务器中,我将下载数据处理并反馈。

我能够下载媒体文件,并尝试使用GCDWebServerDataResponse(data:apiData,contentType:apiResponse.mimeType ??"").但播放器未播放媒体内容。

  1. 我正在使用GCDWebserver作为我的代理服务器。

  2. 我已经创建了一个具有以下网址的AVPlayerItem实例 http://34.55.7.151:8080/这实际上是我的本地服务器IP和端口号。

    初始化 AVPlayer 项

    let url = URL(string: "http://10.155.177.151:8080/")!
    let playerItem = AVPlayerItem(url: url)
    player = AVPlayer(playerItem: playerItem)
    player.automaticallyWaitsToMinimizeStalling = false
    let playerViewController = AVPlayerViewController()
    playerViewController.player = player
    DispatchQueue.main.async {
    self.present(playerViewController, animated: true) {
    playerViewController.player!.play()
    }
    }
    

///Http 代理处理程序

webServer.addDefaultHandler(forMethod: "GET", request: GCDWebServerRequest.self) { (request, completion) in
let  mediaUrl = URL(string: "http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")!
if self.session == nil {
self.session = URLSession(configuration: URLSessionConfiguration.default)
}
let dataTask = self.session?.dataTask(with: mediaUrl, completionHandler: { (data, response, error) in
if let apiData = data, let apiResponse = response {
completion(GCDWebServerDataResponse(data: apiData, contentType: apiResponse.mimeType ?? ""))
} else {
completion(GCDWebServerDataResponse(text: "Error"))
}
})
dataTask!.resume()
}

这里也实现了类似的东西: https://github.com/StyleShare/HLSCachingReverseProxyServer

它会在流式传输时下载片段,如果该区段在本地可用,它将改用该区段。

相关内容

  • 没有找到相关文章

最新更新