AVURLAsset loadValuesАсинхронно никогда не выходит из строя

Я читаю и пробую пример кода Apple о загрузке видеоресурсов.

Но я заметил, что функция loadValuesAsynchronously на AVURLAsset никогда не выходит из строя, даже если я включаю режим полета на устройстве или отключаю Wi-Fi на своем Mac. Кто-нибудь знает, в какой ситуации loadValuesAsynchronously не сможет загрузить ключи?

Это относительный пример кода:

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)
    }
}

person Yuchen    schedule 14.09.2017    source источник


Ответы (1)


Наконец-то понял это, чтобы ответить на мой собственный вопрос: я использовал видео HLS, а URL-адрес имеет формат https://www.foo.com/master.m3u8. loadValuesAsynchronously не будет выполнять никаких сетевых операций, чтобы определить, содержит ли URL действительные файлы HLS. Вот почему «играбельный» ключ всегда действителен:

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

Однако, если я также добавлю некоторую информацию о воспроизведении, такую ​​​​как «длительность» и «дорожки», тогда произойдет сбой, если нет сетевого подключения, потому что тогда ему нужно будет фактически загрузить информацию. Подробнее см. в этом ответе: https://stackoverflow.com/a/31418812/1035008

person Yuchen    schedule 15.09.2017