Какие виды 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 ответ

    Есть пять возможных состояний:

    1. + Бесконечность: это похоже на Float.Infinity. Это допустимое значение, которое больше, чем любое конечное число. Как вы могли бы использовать это? Например, представьте API, который предоставляет вам информацию о временном диапазоне в видео, идентифицированном двумя CMTimes. Вы можете вызвать его с помощью (-Infinity, +Infinity), чтобы запросить информацию обо всем видео.
    2. -Infinity: это снова похоже на -Float.Infinity.
    3. Неопределенный: это похоже на Float.NaN, как я понимаю. Используйте это, когда вы не знаете, какое значение использовать, например, продолжительность живого потока, как предлагает Apple. Например, было бы неправильно использовать бесконечность, поскольку прямой эфир не вечен. Имеет конечную продолжительность; мы просто еще этого не знаем.
    4. Неверно: это структура CMTime, которая не подчиняется правилам CMTime. Я предполагаю, что это означает такие вещи, как нулевой или отрицательный знаменатель. Поскольку CMTime является структурой C, она не инкапсулирована, поэтому кто-то может создать ее с недопустимыми значениями, подобными этой. В структурах C не может быть инициализаторов, которые выдают исключение или возвращают ноль.
    5. Числовой: это нормальный случай конечного значения. Используйте 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 флаг установлен.

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