Какие виды CMTime являются недействительными?
kCMTimeInvalid является недействительным CMTime, но на основании документа Apple, существует больше недействительных CMTime, что они? Что означает CMTime "неверный"? Это переполнение, непосвященное или что-то еще?
https://developer.apple.com/documentation/coremedia/kcmtimeinvalid
Все поля равны 0, поэтому вы можете вызывать или заполнять нулями, чтобы их было много. Не проверяйте это с помощью (time == kCMTimeInvalid), есть много других CMTimes, которые также недействительны. Вместо этого используйте CMTIME_IS_INVALID(время).
Я нашел несколько случаев, когда CMTime является недействительным:
Когда флаги (CMTimeFlags) kCMTimeFlags_Valid не установлены.
kCMTimeFlags_Valid Должен быть установлен, или CMTime считается недействительным.
Некоторые операции CMTimeAdd
+ бесконечность + + бесконечность == + бесконечность
-infinity + -infinity == -infinity + бесконечность + -infinity == неверно -infinity + + бесконечность == неверно
1 ответ
Есть пять возможных состояний:
- + Бесконечность: это похоже на Float.Infinity. Это допустимое значение, которое больше, чем любое конечное число. Как вы могли бы использовать это? Например, представьте API, который предоставляет вам информацию о временном диапазоне в видео, идентифицированном двумя CMTimes. Вы можете вызвать его с помощью (-Infinity, +Infinity), чтобы запросить информацию обо всем видео.
- -Infinity: это снова похоже на -Float.Infinity.
- Неопределенный: это похоже на Float.NaN, как я понимаю. Используйте это, когда вы не знаете, какое значение использовать, например, продолжительность живого потока, как предлагает Apple. Например, было бы неправильно использовать бесконечность, поскольку прямой эфир не вечен. Имеет конечную продолжительность; мы просто еще этого не знаем.
- Неверно: это структура CMTime, которая не подчиняется правилам CMTime. Я предполагаю, что это означает такие вещи, как нулевой или отрицательный знаменатель. Поскольку CMTime является структурой C, она не инкапсулирована, поэтому кто-то может создать ее с недопустимыми значениями, подобными этой. В структурах C не может быть инициализаторов, которые выдают исключение или возвращают ноль.
- Числовой: это нормальный случай конечного значения. Используйте CMTIME_IS_NUMERIC, чтобы проверить это. Он возвращает ложь для всех странных случаев выше.
Из документации, которую вы разместили, написано:
Вместо этого используйте CMTIME_IS_INVALID (время).
От CMTime.h
, это выглядит как CMTIME_IS_INVALID
определяется как:
#define CMTIME_IS_INVALID (время) (! CMTIME_IS_VALID(время))
А также CMTIME_IS_VALID
определяется как:
#define CMTIME_IS_VALID (time) ((Boolean) (((time).flags & kCMTimeFlags_Valid)! = 0))
Так что, похоже, единственное, что определяет, является ли CMTime
является действительным или нет, является ли kCMTimeFlags_Valid
флаг установлен.