Mojave/macOS 10.14.0: [Длительность AVPlayerItem] всегда неопределенна

Я пытаюсь прочитать продолжительность локально сохраненного аудиофайла, используя следующий код:

#import <Foundation/Foundation.h>
#import <CoreMedia/CoreMedia.h>
#import <AVFoundation/AVFoundation.h>

AVPlayer *player = [AVPlayer playerWithURL: urlForLocalAudioFile];
// busy wait - I know, not elegant, please ignore
int timeout = 0;
while (([player status] == AVPlayerStatusUnknown
        || [[player currentItem] status] == AVPlayerItemStatusUnknown)
        && timeout < 100) {
    [NSThread sleepForTimeInterval: 0.1];
    timeout++;
}
// make sure we have the right status
if ([[player currentItem] status] == AVPlayerItemStatusReadyToPlay) {
    CMTime cmTime = [[player currentItem] duration];
    if (CMTIME_IS_INDEFINITE(cmTime)) {
        NSLog(@"Duration is kCMTimeIndefinite");
    } else {
        NSLog(@"Time: %d", CMTimeGetSeconds(cmTime));
    }
} else {
    NSLog(@"Item not ready to play");
}

Код не выполняется в основном потоке AppKit и раньше работал в macOS 10.13.x и более ранних версиях. Теперь с 10.14.0 он всегда сообщает "Duration is kCMTimeIndefinite". Даже после того, как я начал воспроизводить файл.

Может кто-нибудь пожалуйста:

  1. подтвердить/отклонить это ошибка в macOS 10.14.0
  2. предложить обходной путь

Спасибо.


person Hendrik    schedule 05.10.2018    source источник
comment
Я сталкиваюсь с аналогичной проблемой на iOS — продолжительность редко становится доступной после того, как элемент становится readyToPlay (даже при использовании AVPlayerItem(asset: asset, automaticallyLoadedAssetKeys: "duration"). Получали ли вы какие-либо отзывы о вашем радаре?   -  person hybridcattt    schedule 29.10.2018
comment
Мне сказали установить AVURLAssetPreferPreciseDurationAndTimingKey на YES при открытии актива.   -  person Hendrik    schedule 30.10.2018
comment
Также подал радар: openradar.me/45672773. Мои файлы удалены и очень длинные, поэтому AVURLAssetPreferPreciseDurationAndTimingKey может снизить производительность. На данный момент сделано временное решение, чтобы дождаться уведомления о длительности KVO.   -  person hybridcattt    schedule 30.10.2018


Ответы (1)


Это ошибка?

да. См. rdar://45039043.

Обходной путь

Использовать

CMTime cmTime = [[[player currentItem] asset] duration];

вместо

CMTime cmTime = [[player currentItem] duration];
person Hendrik    schedule 05.10.2018