16

this should be a simple one. I have an AVPlayer playing a video file and I want to be able to jump to a specific time but I'm having some trouble understanding how CMTime works.

I need to specify the time in seconds. For example: if I wanted to jump to second 10.8 I'd like to do something like this:

[self.avPlayer.currentItem seekToTime:CMTimeMakeWithSeconds(10.8, 1];

But I'm not getting the result I want.

guardabrazo
  • 1,219
  • 1
  • 13
  • 26

4 Answers4

25

http://warrenmoore.net/understanding-cmtime

Might give you a clearer idea of CMTime.

If you changed your line to read...

[self.avPlayer.currentItem seekToTime:CMTimeMakeWithSeconds(10.8, 60000)];

You might get better results. The 60000 is how many items make up a single second. If you use 1 for this value then you can only jump to a single place per second - by putting 60000 you are giving yourself 60000 places between second 10 and second 11.

saturngod
  • 24,649
  • 17
  • 62
  • 87
amergin
  • 3,106
  • 32
  • 44
13

In case you need to seek to a very specific time I would recommend using this method with tolerance:

let myTime = CMTime(seconds: 10.8, preferredTimescale: 60000)    
player.seek(to: myTime, toleranceBefore: .zero, toleranceAfter: .zero)

Documentation: link. Apple suggests using it for high accuracy.

Tung Fam
  • 7,899
  • 4
  • 56
  • 63
3

Swift version

avPlayer.seek(to:CMTimeMakeWithSeconds(10.8,1000))
Brian Sachetta
  • 3,319
  • 2
  • 34
  • 45
Radu Diță
  • 13,476
  • 2
  • 30
  • 34
1

Swift 5.1 version

player?.seek(to: CMTime(value: CMTimeValue(10.8), timescale: 1000))
Asad Jamil
  • 198
  • 9