Trying to understand CMTime
Asked Answered
B

3

76

I have seen some examples of CMTime (Three separate links), but I still don't get it. I'm using an AVCaptureSession with AVCaptureVideoDataOutput and I want to set the max and min frame rate of the the output. My problem is I just don't understand the CMTime struct.

Apparently CMTimeMake(value, timeScale) should give me value frames every 1/timeScale seconds for a total of value/timeScale seconds, or am I getting that wrong?

Why isn't this documented anywhere in order to explain what this does?

If it does truly work like that, how would I get it to have an indefinite number of frames?

If its really simple, I'm sorry, but nothing has clicked just yet.

Besprinkle answered 15/10, 2012 at 19:11 Comment(2)
possible duplicate of Trying to understand CMTime and CMTimeMakeBesprinkle
warrenmoore.net/understanding-cmtimeTerranceterrane
X
188

A CMTime struct represents a length of time that is stored as rational number (see CMTime Reference). CMTime has a value and a timescale field, and represents the time value/timescale seconds .

CMTimeMake is a function that returns a CMTime structure, for example:

CMTime t1 = CMTimeMake(1, 10); // 1/10 second = 0.1 second
CMTime t2 = CMTimeMake(2, 1);  // 2 seconds
CMTime t3 = CMTimeMake(3, 4);  // 3/4 second = 0.75 second
CMTime t4 = CMTimeMake(6, 8);  // 6/8 second = 0.75 second

The last two time values t3 and t4 represent the same time value, therefore

CMTimeCompare(t3, t4) == 0

If you set the videoMinFrameDuration of a AVCaptureSession is does not make a difference if you set

connection.videoMinFrameDuration = CMTimeMake(1, 20); // or
connection.videoMinFrameDuration = CMTimeMake(2, 40);

In both cases the minimum time interval between frames is set to 1/20 = 0.05 seconds.

Xuanxunit answered 21/10, 2012 at 20:32 Comment(8)
How to convert 3 seconds to CMTime?Barbusse
@PradeepReddyKypa: CMTimeMake(3, 1)Xuanxunit
Well explained... :-)Erminia
Please help me with that: I have the current time of video when playing, and how to get the number of frame in that time?Logorrhea
@MartinR Is it possible achieve the desired result using addPeriodicTimeObserver ? many thanks stackoverflow.com/questions/53704885Furor
@MartinR Why not just a fixed decimal number? Thanks a lot.Demarcation
@Ricardo: What exactly do you suggest?Xuanxunit
@MartinR It is just a question. What is the reason of using CMTime? Perhaps using a number with a lot of decimals? Would be possible to use NSDecimalNumber?Demarcation
B
5

My experience differs.

For let testTime = CMTime(seconds: 3.83, preferredTimescale: 100)

If you set a breakpoint and look in the debugger side window it says:

"383 100ths of a second"

Testing by seeking to a fixed offset in a video in AVPlayer has confirmed this.

So put the actual number of seconds in the seconds field, and the precision in the preferredTimescale field. So 100 means precision of hundredths of a second.

Doing let testTime = CMTime(seconds: 3.83, preferredTimescale: 100)

Still seeks to the same place in the video, but it displays in the debugger side window as "3833 1000ths of a second"

Doing let testTime = CMTime(seconds: 3.83, preferredTimescale: 1)

Does not seek to the same place in the video, because it's been truncated, and it displays in the debugger side window as "3 seconds". Notice that the .833 part has been lost due to the preferredTimescale.

Basketry answered 7/4, 2020 at 21:36 Comment(0)
E
0
CMTime(seconds: value, timescale: scale)

means value/scale in a just one second

Emblematize answered 14/3, 2022 at 11:56 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.