Попытка понять CMTime

Я видел несколько примеров CMTime (Три отдельных ссылки), но я до сих пор не понимаю. Я использую AVCaptureSession с AVCaptureVideoDataOutput, и я хочу установить максимальную и минимальную частоту кадров на выходе. Моя проблема в том, что я просто не понимаю структуру CMTime.

По-видимому, CMTimeMake (value, timeScale) должен давать мне кадры значений каждые 1/timeScale секунд для общей суммы значений /timeScale секунд, или я получаю это неправильно?

Почему это не документировано нигде, чтобы объяснить, что это делает?

Если это действительно так, как бы я получил его, чтобы иметь неопределенное количество кадров?

Если это действительно просто, извините, но пока ничего не щелкнуло.

Ответ 1

A CMTime struct представляет собой период времени, который хранится как рациональное число (см. Справка CMTime). CMTime имеет поле value и a timescale и представляет время value/timescale seconds.

CMTimeMake - это функция, которая возвращает структуру CMTime, например:

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

Последние два значения времени t3 и t4 представляют одно и то же значение времени, поэтому

CMTimeCompare(t3, t4) == 0

Если вы установите videoMinFrameDuration для AVCaptureSession, это не имеет значения, если вы установили

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

В обоих случаях минимальный интервал между кадрами устанавливается в 1/20 = 0,05 секунды.