【问题标题】:Initializing an AVPlayerItem with automaticallyLoadedAssetKeys and "duration"使用 automaticLoadedAssetKeys 和“duration”初始化 AVPlayerItem
【发布时间】:2018-02-24 14:32:02
【问题描述】:

我正在初始化一个AVPlayerItem,它需要一个参数automaticallyLoadedAssetKeys,它指示需要加载哪些AVAsset 键才能将其标记为“准备播放”。

我见过有人将 duration 属性作为这些键之一传递的示例。

但是在AVPlayerItem 的文档中,它谈到了duration 属性,以及如何确保它有效。

在加载基础资产的持续时间之前,此属性的值将报告为 kCMTimeIndefinite。有两种方法可以确保持续时间的值只有在它可用后才被访问:

等到玩家物品的status变成readyToPlay

另外一种方式是注册一个KVO,也可以。但是这第一条评论向我表明,我不需要要求 duration 自动加载,因为它应该已经加载了。(?)

如果这是真的,我不明白为什么有人会传入duration 作为自动加载的标志,因为看起来就是这样。我在这里遗漏了什么吗?

【问题讨论】:

    标签: ios avasset avplayeritem


    【解决方案1】:

    有些人这样做是因为存在 iOS 错误(包括在 iOS 12.1.4 中),即使状态为 readyToPlay,有时也会导致 AVPlayerItem.duration 为 nan。示例herehere

    但是,我的经验是在 automaticLoadedAssetKeys 中指定“持续时间”并不能解决问题 - 尽管 Apple 的文档为 AVPlayerItem

    automaticLoadedAssetKeys中每个key的值会在播放器item达到状态AVPlayerItem.Status.readyToPlay之前被底层AVAsset自动加载;即当项目准备好播放时,调用资产属性的 statusOfValue(forKey:error:) 方法返回的值将是终端状态值之一

    我可以获得 AVPlayerItem.Status.readyToPlay,statusOfValue(forKey: "duration") 返回 .loaded,持续时间为 nan。

    我发现每次都有效的唯一解决方案是对 AVPlayerItem.status(用于 .readyToPlay)和 AVPlayerItem.duration(用于有效数字)进行 KVO,当任一触发器触发时,同时检查两者:

        if item.status != AVPlayerItem.Status.readyToPlay || !item.duration.isUsableNumber() {
            return // not ready yet (for addBoundaryTimeObserver, seek to end, etc.)
        }
    

    isUsableNunber() 在哪里:

     func isUsableNumber() -> Bool {
        return isValid && isNumeric && !isIndefinite && !isNegativeInfinity && !isPositiveInfinity
    }
    

    【讨论】:

      【解决方案2】:

      抱歉,我知道这有点陈旧。但我最近找到了我的问题的答案。

      所以,我意识到我把文档弄糊涂了,而且它可能一直都在文档中,如果我仔细看的话,我会注意到的。

      AVPlayerItem(asset: asset) 默认加载duration 属性。就像打电话给AVPlayerItem(asset: asset, automaticallyLoadedAssetKeys: ["duration"])

      它实际上是在文档中说的,但我完全错过了它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多