gpt4 book ai didi

ios - AVURLAsset loadValuesAsynchronously 从不失败

转载 作者:可可西里 更新时间:2023-11-01 05:42:56 26 4
gpt4 key购买 nike

我正在阅读和尝试 Apple 关于加载视频 Assets 的示例代码。

但我注意到 AVURLAsset 上的 loadValuesAsynchronously 函数永远不会失败,即使我在设备上打开飞行模式或在我的 mac 上关闭 wifi。任何人都知道在什么情况下 loadValuesAsynchronously 将无法加载 key ?

这是相对的sample code :

asset.loadValuesAsynchronously(forKeys: PlayerViewController.assetKeysRequiredToPlay) {

/*
The asset invokes its completion handler on an arbitrary queue.
To avoid multiple threads using our internal state at the same time
we'll elect to use the main thread at all times, let's dispatch
our handler to the main queue.
*/
DispatchQueue.main.async() {
/*
This method is called when the `AVAsset` for our URL has
completed the loading of the values of the specified array
of keys.
*/

/*
Test whether the values of each of the keys we need have been
successfully loaded.
*/
for key in PlayerViewController.assetKeysRequiredToPlay {
var error: NSError?

if asset.statusOfValue(forKey: key, error: &error) == .failed {
let stringFormat = NSLocalizedString("error.asset_%@_key_%@_failed.description", comment: "Can't use this AVAsset because one of it's keys failed to load")

let message = String.localizedStringWithFormat(stringFormat, title, key)

self.handleError(with: message, error: error)

return
}
}

// We can't play this asset.
if !asset.isPlayable || asset.hasProtectedContent {
let stringFormat = NSLocalizedString("error.asset_%@_not_playable.description", comment: "Can't use this AVAsset because it isn't playable or has protected content")

let message = String.localizedStringWithFormat(stringFormat, title)

self.handleError(with: message)

return
}

/*
We can play this asset. Create a new AVPlayerItem and make it
our player's current item.
*/
self.loadedAssets[title] = asset

let name = (thumbnailResourceName as NSString).deletingPathExtension
let type = (thumbnailResourceName as NSString).pathExtension
let path = Bundle.main.path(forResource: name, ofType: type)!

let thumbnail = UIImage(contentsOfFile: path)!

self.assetTitlesAndThumbnails[asset.url] = (title, thumbnail)
}
}

最佳答案

终于想通了,回答我自己的问题:我一直在使用 HLS 视频,URL 的格式为 https://www.foo.com/master.m3u8 loadValuesAsynchronously 不会执行任何网络操作来确定 URL 是否包含有效的 HLS 文件。这就是“可播放”键始终有效的原因:

static let assetKeysRequiredToPlay = [
"playable",
"hasProtectedContent"
]

但是,如果我还添加了一些播放信息,例如“duration”和“tracks”,那么如果没有任何网络连接,它将失败,因为它需要实际加载信息。更多细节引用这个答案:https://stackoverflow.com/a/31418812/1035008

关于ios - AVURLAsset loadValuesAsynchronously 从不失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46229228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com