I get an error in the application
" Assertion failure in -[AVPlayerPeriodicCaller initWithPlayer:interval:queue:block:], /SourceCache/EmbeddedAVFoundation/EmbeddedAVFoundation-461.12/Fig/AVPlayer.m:3993 Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: CMTIME_COMPARE_INLINE(interval, >, kCMTimeZero)'
Any ideas why this could be happening?
I limited myself to using AvPlayer just because I need to transfer a large .AVaudioplayer file - this is not an option. Therefore, I also introduced a scrubber slider. My implementation of AVplayer is as follows:
-(void)playAudioForFile:(NSString *)fileName{ [self.suraPlayer removeTimeObserver:playbackObserver]; [self.suraPlayer removeTimeObserver:mTimeObserver]; self.suraPlayer = nil; NSURL* url = [self getURLStringForFileName:fileName]; AVPlayer *player = [[AVPlayer alloc]initWithURL:url]; self.suraPlayer = player; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemDidReachEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:[suraPlayer currentItem]]; [self.suraPlayer play]; [self.suraPlayer addObserver:self forKeyPath:@"status" options:0 context:nil]; [self initScrubberTimer]; [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateProgress) userInfo:nil repeats:YES];
}
-(void)updateProgress { // NSLog(@"self.mScrubber.value %f", self.mScrubber.value);
// THIS IS A LINE WHERE THE MALFUNCTION IS SOME STUMS
float duration = CMTimeGetSeconds(self.suraPlayer.currentItem.duration); if (self.suraPlayer.currentItem.status==AVPlayerStatusReadyToPlay ) [self.mScrubber setMaximumValue:duration]; self.mScrubber.value = CMTimeGetSeconds(self.suraPlayer.currentTime); int seconds = self.mScrubber.value, minutes = seconds/60,hours = minutes/60; int secondsRemain = self.mScrubber.maximumValue - seconds,minutesRemain = secondsRemain/60,hoursRemain = minutesRemain/60; seconds = seconds-minutes*60; minutes = minutes-hours*60; secondsRemain = secondsRemain - minutesRemain*60; minutesRemain = minutesRemain - hoursRemain*60; NSString *hourStr,*minuteStr,*secondStr,*hourStrRemain,*minuteStrRemain,*secondStrRemain; hourStr = hours > 9 ? [NSString stringWithFormat:@"%d",hours] : [NSString stringWithFormat:@"0%d",hours]; minuteStr = minutes > 9 ? [NSString stringWithFormat:@"%d",minutes] : [NSString stringWithFormat:@"0%d",minutes]; secondStr = seconds > 9 ? [NSString stringWithFormat:@"%d",seconds] : [NSString stringWithFormat:@"0%d",seconds]; hourStrRemain = hoursRemain > 9 ? [NSString stringWithFormat:@"%d",hoursRemain] : [NSString stringWithFormat:@"0%d",hoursRemain]; minuteStrRemain = minutesRemain > 9 ? [NSString stringWithFormat:@"%d",minutesRemain] : [NSString stringWithFormat:@"0%d",minutesRemain]; secondStrRemain = secondsRemain > 9 ? [NSString stringWithFormat:@"%d",secondsRemain] : [NSString stringWithFormat:@"0%d",secondsRemain]; self.timePlayerLabel.text = [NSString stringWithFormat:@"%@:%@:%@",hourStr,minuteStr,secondStr]; self.timeRemainingLabel.text = [NSString stringWithFormat:@"-%@:%@:%@",hourStrRemain,minuteStrRemain,secondStrRemain]; } -(void)initScrubberTimer { double interval = .1f; CMTime playerDuration = self.suraPlayer.currentItem.duration; if (CMTIME_IS_INVALID(playerDuration)) { return; } double duration = CMTimeGetSeconds(playerDuration); if (isfinite(duration)) { CGFloat width = CGRectGetWidth([self.mScrubber bounds]); interval = 0.5f * duration / width; } mTimeObserver = [self.suraPlayer addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(interval, NSEC_PER_SEC) queue:NULL usingBlock:^(CMTime time) { }]; [self syncScrubber]; } - (void)syncScrubber { CMTime playerDuration = self.suraPlayer.currentItem.duration; if (CMTIME_IS_INVALID(playerDuration)) { self.mScrubber.minimumValue = 0.0; return; } double duration = CMTimeGetSeconds(playerDuration); if (isfinite(duration)) { float minValue = [self.mScrubber minimumValue]; float maxValue = [self.mScrubber maximumValue]; double time = CMTimeGetSeconds([self.suraPlayer currentTime]); [self.mScrubber setValue:(maxValue - minValue) * time / duration + minValue]; } } - (IBAction)scrub:(id)sender { if ([sender isKindOfClass:[UISlider class]]) { UISlider* slider = sender; CMTime playerDuration = self.suraPlayer.currentItem.duration; if (CMTIME_IS_INVALID(playerDuration)) { return; } double duration = CMTimeGetSeconds(playerDuration); if (isfinite(duration)) { float minValue = [slider minimumValue]; float maxValue = [slider maximumValue]; float value = [slider value]; double time = duration * (value - minValue) / (maxValue - minValue); [self.suraPlayer seekToTime:CMTimeMakeWithSeconds(time, NSEC_PER_SEC)]; } } } - (IBAction)beginScrubbing:(id)sender { mRestoreAfterScrubbingRate = [self.suraPlayer rate]; [self.suraPlayer setRate:0.f]; [self removePlayerTimeObserver]; } - (IBAction)endScrubbing:(id)sender { __weak typeof(self) weakSelf = self; if (!mTimeObserver) { CMTime playerDuration = self.suraPlayer.currentItem.duration; if (CMTIME_IS_INVALID(playerDuration)) { return; } double duration = CMTimeGetSeconds(playerDuration); if (isfinite(duration)) { CGFloat width = CGRectGetWidth([self.mScrubber bounds]); double tolerance = 0.5f * duration / width; mTimeObserver = [self.suraPlayer addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(tolerance, NSEC_PER_SEC) queue:NULL usingBlock: ^(CMTime time) { [weakSelf syncScrubber]; }]; } } if (mRestoreAfterScrubbingRate) { [self.suraPlayer setRate:mRestoreAfterScrubbingRate]; mRestoreAfterScrubbingRate = 0.f; } } - (BOOL)isScrubbing { return mRestoreAfterScrubbingRate != 0.f; } -(void)enableScrubber { self.mScrubber.enabled = YES; } -(void)disableScrubber { self.mScrubber.enabled = NO; } -(void)removePlayerTimeObserver { if (mTimeObserver) { [self.suraPlayer removeTimeObserver:mTimeObserver]; mTimeObserver = nil; } } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (object == suraPlayer && [keyPath isEqualToString:@"status"]) { if (suraPlayer.status == AVPlayerStatusFailed) { NSLog(@"AVPlayer Failed"); } else if (suraPlayer.status == AVPlayerStatusReadyToPlay) { NSLog(@"AVPlayerStatusReadyToPlay");