我们可以在流式传输 m3u8 文件时手动 download/cache 传输流吗
Can we manually download/cache the transport stream while streaming m3u8 file
我正在尝试从 m3u8 文件播放传输流。我的要求是在将下载的数据提供给 AVPlayer 之前对其进行处理。为此,我使用代理服务器 [GCDWebserver] 来拦截所有请求。在代理服务器中,我将下载数据对其进行处理并将其反馈回来。
我能够下载媒体文件并尝试使用 GCDWebServerDataResponse(data: apiData, contentType: apiResponse.mimeType ?? "") 返回数据。但是播放器没有播放媒体内容。
我正在使用 GCDWebserver 作为我的代理服务器。
我创建了一个 AVPlayerItem 的实例,具有以下 url
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
它会在流式传输时下载片段,如果该片段在本地可用,它将改为使用该片段。
我正在尝试从 m3u8 文件播放传输流。我的要求是在将下载的数据提供给 AVPlayer 之前对其进行处理。为此,我使用代理服务器 [GCDWebserver] 来拦截所有请求。在代理服务器中,我将下载数据对其进行处理并将其反馈回来。
我能够下载媒体文件并尝试使用 GCDWebServerDataResponse(data: apiData, contentType: apiResponse.mimeType ?? "") 返回数据。但是播放器没有播放媒体内容。
我正在使用 GCDWebserver 作为我的代理服务器。
我创建了一个 AVPlayerItem 的实例,具有以下 url 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
它会在流式传输时下载片段,如果该片段在本地可用,它将改为使用该片段。