Пытаюсь понять CMTime

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

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

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

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

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

3 ответа

Решение

CMTime Структура представляет промежуток времени, который сохраняется как рациональное число (см. Ссылку CMTime). CMTime имеет value и 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 секунды.

Мой опыт отличается.

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

Если вы установите точку останова и посмотрите в боковое окно отладчика, там будет написано:

"383 сотых секунды"

Тестирование с поиском фиксированного смещения в видео в AVPlayer подтвердило это.

Поэтому введите фактическое количество секунд в поле секунд и точность в поле предпочтительного времени. Таким образом, 100 означает точность до сотых долей секунды.

Делатьlet testTime = CMTime(seconds: 3.83, preferredTimescale: 100)

По-прежнему ищет то же место на видео, но отображается в боковом окне отладчика как "3833 1000-ых секунды"

Делатьlet testTime = CMTime(seconds: 3.83, preferredTimescale: 1)

Не ищет то же место в видео, потому что оно было усечено, и отображается в боковом окне отладчика как "3 секунды". Обратите внимание, что часть.833 была потеряна из-за предпочтительной шкалы времени.

      CMTime(seconds: value, timescale: scale)

означает значение/масштаб всего за одну секунду

Другие вопросы по тегам