本地服务器 (iOS) 上的特定视频 运行 滞后
Lags on specific video running on local server (iOS)
基于example project from google build simple player app for play video on device. Added GCDWebServer
lib for local streaming. All works fine, except 1 video。它有点滞后。此视频在 AppStore 的其他播放器上播放完美。
在此处编写我如何设置 GCKCastContext
并开始在 Chromecast 上播放的代码:
static func setup() {
let options = GCKCastOptions(discoveryCriteria: GCKDiscoveryCriteria(applicationID: kReceiverAppID))
options.physicalVolumeButtonsWillControlDeviceVolume = true
GCKCastContext.setSharedInstanceWith(options)
let logFilter = GCKLoggerFilter()
logFilter.minimumLevel = .error
GCKLogger.sharedInstance().filter = logFilter
GCKLogger.sharedInstance().delegate = shared
shared.sessionManager.add(shared)
}
func generateMediaInfo(url: URL) -> GCKMediaInformation {
let builder = GCKMediaInformationBuilder(contentURL: url)
builder.streamType = .live
if url.isFileURL, let mimeType = mimeTypes[url.pathExtension] {
builder.contentType = mimeType
}
builder.metadata = GCKMediaMetadata(metadataType: .movie)
builder.mediaTracks = nil
builder.textTrackStyle = buildTextStyle()
let mediaInfo = builder.build()
return mediaInfo
}
func buildTextStyle() -> GCKMediaTextTrackStyle {
let style = GCKMediaTextTrackStyle.createDefault()
style.windowType = .roundedCorners
style.windowColor = GCKColor(red: 0, green: 0, blue: 0, alpha: 0.7)
return style
}
func playURL(_ url: URL, position: Double = 0) {
let options = GCKMediaLoadOptions()
options.playPosition = position
let url = ChromecastServer.startServer(url.path) // builded with GCDWebServer, returns local server url
let mediaInfo = generateMediaInfo(url: url!)
if let client = sessionManager.currentCastSession?.remoteMediaClient {
performAsyncIn(.main) {
client.loadMedia(mediaInfo, with: options)
}
}
}
这是因为我没有正确响应 Content-Range
请求。固定版本:
server = GCDWebServer()
server?.addHandler(forMethod: "GET", path: "/chromecast_video", request: GCDWebServerRequest.self, processBlock: { (req) -> GCDWebServerResponse? in
var resp: GCDWebServerFileResponse? = GCDWebServerFileResponse()
if (req.hasByteRange()) {
return GCDWebServerFileResponse(file: filePath, byteRange: req.byteRange)
} else {
return GCDWebServerFileResponse(file: filePath)
}
})
基于example project from google build simple player app for play video on device. Added GCDWebServer
lib for local streaming. All works fine, except 1 video。它有点滞后。此视频在 AppStore 的其他播放器上播放完美。
在此处编写我如何设置 GCKCastContext
并开始在 Chromecast 上播放的代码:
static func setup() {
let options = GCKCastOptions(discoveryCriteria: GCKDiscoveryCriteria(applicationID: kReceiverAppID))
options.physicalVolumeButtonsWillControlDeviceVolume = true
GCKCastContext.setSharedInstanceWith(options)
let logFilter = GCKLoggerFilter()
logFilter.minimumLevel = .error
GCKLogger.sharedInstance().filter = logFilter
GCKLogger.sharedInstance().delegate = shared
shared.sessionManager.add(shared)
}
func generateMediaInfo(url: URL) -> GCKMediaInformation {
let builder = GCKMediaInformationBuilder(contentURL: url)
builder.streamType = .live
if url.isFileURL, let mimeType = mimeTypes[url.pathExtension] {
builder.contentType = mimeType
}
builder.metadata = GCKMediaMetadata(metadataType: .movie)
builder.mediaTracks = nil
builder.textTrackStyle = buildTextStyle()
let mediaInfo = builder.build()
return mediaInfo
}
func buildTextStyle() -> GCKMediaTextTrackStyle {
let style = GCKMediaTextTrackStyle.createDefault()
style.windowType = .roundedCorners
style.windowColor = GCKColor(red: 0, green: 0, blue: 0, alpha: 0.7)
return style
}
func playURL(_ url: URL, position: Double = 0) {
let options = GCKMediaLoadOptions()
options.playPosition = position
let url = ChromecastServer.startServer(url.path) // builded with GCDWebServer, returns local server url
let mediaInfo = generateMediaInfo(url: url!)
if let client = sessionManager.currentCastSession?.remoteMediaClient {
performAsyncIn(.main) {
client.loadMedia(mediaInfo, with: options)
}
}
}
这是因为我没有正确响应 Content-Range
请求。固定版本:
server = GCDWebServer()
server?.addHandler(forMethod: "GET", path: "/chromecast_video", request: GCDWebServerRequest.self, processBlock: { (req) -> GCDWebServerResponse? in
var resp: GCDWebServerFileResponse? = GCDWebServerFileResponse()
if (req.hasByteRange()) {
return GCDWebServerFileResponse(file: filePath, byteRange: req.byteRange)
} else {
return GCDWebServerFileResponse(file: filePath)
}
})