Search code examples
swiftavplayeravaudioplayerseekseektotime

AVPlayer Seek not accurate even with toleranceBefore: kCMTimeZero


We have an app which plays a long mp3 file (1 hour long). We want to be able to play from set points within the file. But, when we do it, it is inaccurate by up to 10 seconds.

Here's the code:

  let trackStart = arrTracks![MediaPlayer.shared.currentSongNo].samples

  let frameRate : Int32 = (MediaPlayer.shared.player?.currentItem?.asset.duration.timescale)!

  MediaPlayer.shared.player?.seek(to: CMTimeMakeWithSeconds(Double(trackStart), frameRate), 
    toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)
  • We have to use AVPlayer because we need the better quality "spectral:" AVAudioTimePitchAlgorithm.
  • We didn't have the problem with AVAudioPlayer, but (AFAIK) we have to use AVPlayer because we need the better quality "spectral:" AVAudioTimePitchAlgorithm.

  • [Edit:] - The error is consistent - it always plays from the same (wrong) place for a given requested position. This is also true after restarting.

Any help very much appreciated! Thanks

[Edit:]

  • We have already tried preferredTimescale: playerTimescale
  • Also tried kCMTimeIndefinite instead of kCMTimeZero

Solution

  • This is what AVURLAsset’s AVURLAssetPreferPreciseDurationAndTimingKey is for.

    Apple's documentation.

    Beware that this should increase the loading time.