loadValuesAsynchronouslyForKeys и загрузка нескольких значений - PullRequest
6 голосов
/ 21 июня 2011

Я хотел бы асинхронно загрузить продолжительность, время (временная метка видео было создано) и локаль актива.

Весь пример кода, показанного Apple для использования 'loadValuesAsynchronouslyForKeys:keys', всегда отображается только с одним ключом. то есть:

NSURL *url = aUrl; 
AVAsset asset = [[AVURLAsset alloc] initWithURL:url options:nil];

NSArray *keys = [NSArray arrayWithObject:@"duration"];
[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^() {

NSError *error = nil;
AVKeyValueStatus durationStatus = [asset statusOfValueForKey:@"duration" error:&error];

switch (durationSatus) {
    case AVKeyValueStatusLoaded:
            // Read duration from asset
            CMTime assetDurationInCMTime = [asset duration];            
        break;

        case AVKeyValueStatusFailed:
            // Report error
        break; 

        case AVKeyValueStatusCancelled:
        // Do whatever is appropriate for cancelation   
    }
}];

Могу ли я предположить, что если статус одного элемента 'AVKeyValueStatusLoaded', другие значения могут одновременно считываться в блоке завершения? то есть:

[asset tracks]
[asset commonMetadata];
[asset duration]

Ответы [ 3 ]

6 голосов
/ 17 марта 2012

Нет, вы не можете этого допустить.Один из моих методов рассматривает две клавиши: играбельность и длительность, и я обнаружил, что играбельность часто доступна, а длительность - еще нет.Я для этого переместил loadValuesAsynchronouslyForKeys: code в отдельный метод shouldSave :.Метод shouldSave:, который я вызываю из таймера в методе с именем saveWithDuration :.Как только saveWithDuration: получает ненулевую длительность, он идет вперед и сохраняет вещи.Чтобы не ждать слишком долго, я пока использую счетчик попыток - в будущем я уточню это (вы заметите, что экземпляр ошибки на самом деле не используется в данный момент)*}

2 голосов
/ 21 июня 2011

Технически, вы не можете. документы для loadValuesAsynchronouslyForKeys: завершениеHandler: говорит, что

Состояния завершения ключей, которые вы указывать в ключах не обязательно то же самое - некоторые могут быть загружены, и другие, возможно, потерпели неудачу. Вы должны проверить статус каждого ключа в отдельности.

На практике я думаю, что это часто безопасное предположение - как вы заметили, пример проекта Apple StitchedStreamPlayer просто смотрит на состояние первого ключа.

0 голосов
/ 08 августа 2018

Нет, вы не можете так предполагать.Я обычно полагаюсь на клавишу @"duration", чтобы создать AVPlayerItem и начать воспроизведение, так как загрузка @"playable", как правило, еще не гарантирует, что ресурс готов.Затем я порождаю таймер, чтобы периодически проверять, загружены ли другие ключи, такие как @"tracks", или не похожи на те, что упоминала Элиз ван Лоидж.

Кроме того, примечание - не забывайте, что completionHandler in loadValuesAsynchronouslyForKeys вызывается в произвольном фоновом потоке.Вам придется отправить его в основной поток, если вы имеете дело с пользовательским интерфейсом или AVPlayerLayer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...