Я использую приведенный ниже код для зацикливания одного 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
также исправлена, поэтому любой, кто встречает «утечки кадров», о которых упоминали некоторые люди, может быть должен еще раз где-нибудь просмотреть код. Это вышло бы из-за некоторых мелких ошибок.