Инициализация AVPlayerItem с автоматически загруженными ключами AssetKeys и длительностью

Я инициализирую AVPlayerItem, и он принимает параметр automaticallyLoadedAssetKeys, который указывает, какие AVAsset клавиши необходимо загрузить, прежде чем он будет помечен как «готовый к игре».

Я видел примеры людей, передавших свойство duration в качестве одного из этих ключей.

Но затем в документации для AVPlayerItem говорится о свойстве duration и о том, как убедиться, что оно допустимо.

Значение этого свойства будет сообщаться как kCMTimeIndefinite до тех пор, пока не будет загружена продолжительность базового актива. Есть два способа обеспечить доступ к значению продолжительности только после того, как оно станет доступным:

Подождите, пока status элемента игрока не станет readyToPlay

Другой способ — зарегистрировать KVO, и это нормально. Но этот первый комментарий указывает мне, что мне не нужно просить, чтобы duration загружался автоматически, потому что это уже должно быть. (?)

Если это правда, то я не могу понять, зачем кому-то передавать duration в качестве флага для автоматической загрузки, потому что похоже, что это так. Я что-то упустил здесь?


person Dan Morrow    schedule 24.02.2018    source источник


Ответы (2)


Некоторые люди делают это из-за ошибок iOS (в том числе в iOS 12.1.4), которые иногда приводят к тому, что AVPlayerItem.duration имеет значение nan, даже когда статус готов к игре. Примеры здесь и здесь.

Однако мой опыт показывает, что указание «длительности» в AutomaticLoadedAssetKeys не решает проблему, несмотря на документы Apple для AVPlayerItem:

Значение каждого ключа в AutomaticLoadedAssetKeys будет автоматически загружено базовым AVAsset до того, как элемент проигрывателя достигнет статуса AVPlayerItem.Status.readyToPlay; т. е. когда элемент готов к воспроизведению, значение, возвращаемое вызовом метода statusOfValue(forKey:error:) свойства актива, будет одним из значений состояния терминала.

Я могу получить AVPlayerItem.Status.readyToPlay со статусомOfValue(forKey: "duration"), возвращающим .loaded, и продолжительностью nan.

Единственное решение, которое я нашел, которое работает каждый раз, - это KVO как AVPlayerItem.status (для .readyToPlay), так и AVPlayerItem.duration (для действительного числа), и когда любой из них срабатывает, проверьте оба:

    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
}
person ozool    schedule 01.03.2019

Извините, я знаю, что это немного устарело. Но недавно я нашел ответ на свою проблему.

Итак, я понял, что путаю документацию, и, вероятно, она все время была прямо в документах, если бы я посмотрел повнимательнее, я бы заметил.

AVPlayerItem(asset: asset) загружает свойство duration по умолчанию. Это все равно, что позвонить AVPlayerItem(asset: asset, automaticallyLoadedAssetKeys: ["duration"])

На самом деле это написано в документах, но я полностью пропустил это.

person Dan Morrow    schedule 08.04.2019