Используйте AVQueuePlayer для зацикливания одного playerItem - PullRequest
2 голосов
/ 08 мая 2011

Я использую приведенный ниже код для зацикливания одного playerItem с AVQueuePlayer:

-(void) init {
    _soundPlayer = [ [ AVQueuePlayer alloc ] init ];
    [ _soundPlayer addObserver: self forKeyPath: @"status" options: NSKeyValueObservingOptionNew context: NULL ];
    [ [ NSNotificationCenter defaultCenter ] addObserver: self selector: @selector ( playerItemDidReachEnd: ) name: AVPlayerItemDidPlayToEndTimeNotification object: nil ];
    [ [ NSNotificationCenter defaultCenter ] postNotificationName: AVPlayerItemDidPlayToEndTimeNotification object: nil ];
}

- ( void ) observeValueForKeyPath: ( NSString * ) keyPath ofObject: ( AVPlayer * ) object change: ( NSDictionary * ) change context: ( void * ) context {
if ( _soundPlayer.status == AVPlayerStatusReadyToPlay )
    [ _soundPlayer play ];
}

- ( void ) playerItemDidReachEnd: ( NSNotification * ) notification {
    AVPlayerItem *playerItem = [ [ AVPlayerItem alloc ] initWithURL: [ NSURL fileURLWithPath: _playerItemFilePath ] ];
    [ _soundPlayer insertItem: playerItem afterItem: nil ];
    [ playerItem release ];
}

Он отлично работает на симуляторе, даже если на инструментах указано, что утечка что-то вроде AudioToolbox SimAggregateDevice::SimAggregateDevice(__CFString const*, __CFString const*, long&), люди говорили, что это просто "утечка кадров", на устройстве все будет в порядке, но когда я запускаю его на устройстве Нет утечек из инструментов, но вместо этого происходит сбой ... Что-то я пропустил? Спасибо, если кто-нибудь может помочь мне в этом.

Иногда playerItem может быть потоковым файлом онлайн, поэтому вместо него нельзя использовать AVAudioPlayer.


Наконец-то я обнаружил, что это из-за _playerItemFilePath. Он больше не существует, необходимо сохранить возврат NSString методом NSBundle's pathForResource. Но мне все еще интересно, почему его можно запустить на симуляторе. В конце концов, утечка около audioToolbox также исправлена, поэтому любой, кто встречает «утечки кадров», о которых упоминали некоторые люди, может быть должен еще раз где-нибудь просмотреть код. Это вышло бы из-за некоторых мелких ошибок.

...