Пытаюсь понять 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)
означает значение/масштаб всего за одну секунду