Функции-обработчики носителей временного кода
QuickTime включает поддержку дорожек временного кода. Дорожки временного кода позволяют Вам хранить внешнюю информацию временного кода, такую как временные коды SMPTE, в Ваших фильмах в формате QuickTime. QuickTime обеспечивает обработчик носителей временного кода, интерпретирующий данные в этих дорожках. В этой главе рассматриваются функции и структуры, позволяющие Вам использовать обработчик носителей временного кода.
О временных кодах
Обработчик носителей временного кода позволяет фильмам в формате QuickTime хранить информацию синхронизации, полученную из материала первоисточника фильма. Каждый фильм в формате QuickTime содержит специфичную для QuickTime информацию синхронизации, такую как продолжительность кадра. Это информационное влияние, как QuickTime интерпретирует и проигрывает фильм.
Обработчик носителей временного кода позволяет фильмам в формате QuickTime хранить дополнительную информацию синхронизации, не создающуюся или для QuickTime. Эта дополнительная информация синхронизации обычно получалась бы из материала первоисточника; например, как временной код SMPTE. В сущности можно думать об обработчике носителей временного кода как об обеспечении ссылки между цифровой специфичной для QuickTime информацией синхронизации и исходной аналоговой информацией синхронизации от исходного материала.
Временной код фильма сохранен в дорожке временного кода. Дорожки временного кода содержат
исходная идентификационная информация (это идентифицирует источник; например, данная видеозапись)
данные о формате временного кода (это указывает характеристики временного кода и как интерпретировать информацию о временном коде),
числа кадра (они позволяют QuickTime отображаться с данного времени фильма, с точки зрения временных стоимостей QuickTime, к его соответствующему значению временного кода),
Apple Computer определила информацию, хранящуюся в дорожке способом, который независим от любого определенного стандарта временного кода. Формат этой информации достаточно гибок для размещения всех известных стандартов временного кода, включая SMPTE timecoding. Данные о формате временного кода обеспечивают QuickTime параметры для понимания временного кода и преобразования временных стоимостей QuickTime во временные стоимости временного кода (и наоборот).
Один ключевой атрибут временного кода касается метода, используемого для синхронизации значений временного кода с видеокадрами. Большая часть материала источника видеосигнала зарегистрирована в частотах кадров целого числа. Например, и PAL и видео SECAM содержат точно 25 кадров в секунду. Однако некоторый материал источника видеосигнала не зарегистрирован в частотах кадров целого числа. В частности NTSC окрашивает, видео содержит 29,97 кадров в секунду (хотя оно обычно упоминается как 30 видео кадров в секунду). Однако значения временного кода NTSC соответствуют полным 30 уровням кадров в секунду; это - пережиток от NTSC черно-белое видео. Для таких источников видеосигнала Вам нужен механизм, исправляющий ошибку, которая будет разрабатывать в течение долгого времени между значениями временного кода и фактическими видеокадрами.
Общий метод для поддержания синхронизации между значениями временного кода и видеоданными вызывают dropframe. Вопреки его имени dropframe метод фактически пропускает значения временного кода на предопределенном уровне для хранения временного кода, и видеоданные синхронизировались. Это фактически не отбрасывает видеокадры. В видео цвета NTSC, использующем dropframe метод, значения временного кода пропускают два значения кадра каждую минуту, за исключением мелких значений, которые являются равномерно делимыми десять. Так значения временного кода NTSC, выраженные как HH:MM:SS:FF (часы, минуты, секунды, кадры) пропуск от 00:00:59:29 до 00:01:00:02 (пропускающий 00:01:00:00 и 00:01:00:01). Существует флаг в структуре определения временного кода, указывающей, использует ли временной код dropframe метод.
Когда фильм проигрывается, можно заставить панель инструментов вывести на экран временной код. Используйте TCSetTimeCodeFlags функция для включения и выключения дисплея временного кода. Обратите внимание на то, что дорожка временного кода должна быть позволена для этого дисплея работать.
Вы храните исходную идентификационную информацию временного кода в пользовательском элементе данных. Создайте пользовательский элемент данных со значением типа TCSourceRefNameType. Храните исходную информацию как текстовую строку. Эта информация могла бы содержать имя видеозаписи, из которой фильм создавался, например.
Обработчик носителей временного кода обеспечивает функции, позволяющие Вам управлять исходной идентификационной информацией. Следующий пример кода демонстрирует один способ определить исходное имя ленты в демонстрационном описании носителей временного кода.
void setTimeCodeSourceName (Media timeCodeMedia, |
TimeCodeDescriptionHandle tcdH, |
Str255 tapeName, ScriptCode tapeNameScript) |
{ |
UserData srcRef; |
if (NewUserData(&srcRef) == noErr) { |
Handle nameHandle; |
if (PtrToHand(&tapeName[1], &nameHandle, tapeName[0]) == noErr) { |
if (AddUserDataText (srcRef, nameHandle,'name', 1, |
tapeNameScript) == noErr) { |
TCSetSourceRef (GetMediaHandler (timeCodeMedia), |
tcdH, |
srcRef); |
} |
DisposeHandle(nameHandle); |
} |
DisposeUserData(srcRef); |
} |
} |
Создание дорожки временного кода
Можно создать дорожку временного кода и носители таким же образом, что Вы создаете любую другую дорожку. Вызовите NewMovieTrack функция, чтобы создать дорожку временного кода и использовать NewTrackMedia функция для создания носителей дорожки. Обязательно укажите значение типа среды TimeCodeMediaType когда Вы вызываете NewTrackMedia функция.
Можно определить отношение между дорожкой временного кода и одной или более дорожками фильма с помощью новых ссылочных функций дорожки панели инструментов. Вы тогда продолжаете для добавления выборок к дорожке, как надлежащих.
Каждая выборка в дорожке временного кода предоставляет информацию временного кода для промежутка времени фильма. Выборка включает информацию о продолжительности. В результате Вы обычно добавляете каждую выборку временного кода после создания соответствия, довольного дорожка или дорожки.
Демонстрационное описание носителей временного кода содержит управляющую информацию, позволяющую QuickTime интерпретировать выборки. Это включает данные о формате временного кода. Фактические демонстрационные данные содержат число кадра, идентифицирующее один или несколько кадров содержания, использующих этот временной код. Сохраненный как a long, это значение идентифицирует первый кадр в группе кадров, использующих этот временной код. В случае фильма, сделанного из исходного материала, не содержащего редактирований, Вам только была бы нужна одна выборка. Когда исходный материал содержит редактирования, Вам обычно нужна одна выборка для каждого редактирования, так, чтобы QuickTime мог ресинхронизировать информацию о временном коде с фильмом. Те выборки содержат числа кадра кадров, начинающих каждую новую группу кадров.
Структура описания временного кода определяет формат и содержание демонстрационного описания носителей временного кода, следующим образом:
typedef struct TimeCodeDescription { |
long descSize; /* size of the structure */ |
long dataFormat; /* sample type */ |
long resvd1; /* reserved; set to 0 */ |
short resvd2; /* reserved; set to 0 */ |
short dataRefIndex; /* data reference index */ |
long flags; /* reserved; set to 0 */ |
TimeCodeDef timeCodeDef; /* timecode format information */ |
long srcRef[1]; /* source information */ |
} TimeCodeDescription, *TimeCodeDescriptionPtr, **TimeCodeDescriptionHandle; |
Срок |
Определение |
|---|---|
|
Указывает размер демонстрационного описания, в байтах. |
|
Указывает демонстрационный тип описания ( |
|
Зарезервированный для использования Apple. Установите это поле в 0. |
|
Зарезервированный для использования Apple. Установите это поле в 0. |
|
Содержит индексное значение, указывающее, какая из ссылок на данные носителей содержит демонстрационные данные для этого демонстрационного описания. |
|
Зарезервированный для использования Apple. Установите это поле в 0. |
|
Содержит структуру определения временного кода, определяющую данные о формате временного кода. |
|
Содержит информацию об источнике временного кода. Это отформатировано как пользовательский элемент данных, который сохранен в демонстрационном описании. Обработчик носителей обеспечивает функции, позволяющие Вам получать и устанавливать эти данные. |
Структура определения временного кода содержит данные о формате временного кода. Эта структура определяется следующим образом:
typedef struct TimeCodeDef { |
long flags; /* timecode control flags */ |
TimeScale fTimeScale; /* timecode's time scale */ |
TimeValue frameDuration; /* how long each frame lasts */ |
unsigned char numFrames; /* number of frames per second */ |
} TimeCodeDef; |
Параметр |
Определение |
|---|---|
|
Содержит флаги, обеспечивающие некоторые данные о формате временного кода. Следующие флаги определяются: |
Флаг |
Определение |
|---|---|
|
Указывает, что временной код иногда отбрасывает кадры для пребывания в синхронизации. Некоторые временные коды, выполненные в кроме целого числа кадров в секунду. Например, видео NTSC достигает 29,97 кадров в секунду. Для ресинхронизации между уровнем временного кода и 30 скоростями воспроизведения кадров в секунду, временной код отбрасывает кадр в предсказуемое время (почти таким же способом, которым високосные годы сохраняют календарь синхронизируемым). Установите этот флаг в 1, если временной код использует dropframe метод. |
|
Указывает, что временной код оценивает обертку в 24 часа. Установите этот флаг в 1, если значение часа временного кода переносится (т.е. возвращается к 0) в 24 часа. |
|
Указывает, что временной код поддерживает отрицательные временные стоимости. Установите этот флаг в 1, если временной код позволяет отрицательные величины. |
|
Указывает, что временной код должен быть интерпретирован как простой счетчик, а не как временная стоимость. Это позволяет временному коду содержать или информацию времени или счетчик (такой как счетчик ленты) информация. Установите этот флаг в 1, если временной код содержит встречную информацию. |
|
Содержит масштаб времени для интерпретации |
|
Указывает, сколько времени каждый кадр длится в модулях, определенных |
|
Указывает число кадров, сохраненных в секунду. В случае временных кодов, интерпретирующихся как счетчики, это поле указывает число кадров, сохраненных на галочку таймера. |
Лучший способ понять, как отформатировать и интерпретировать структуру определения временного кода, состоит в том, чтобы рассмотреть пример. При создании фильма из источника видеосигнала NTSC, зарегистрированного в 29,97 кадрах в секунду, с помощью временных кодов SMPTE, Вы отформатировали бы структуру определения временного кода следующим образом:
TimeCodeDef.flags = tcDropFrame | tc24HourMax; |
TimeCodeDef.fTimeScale = 2997; /* units */ |
TimeCodeDef.frameDuration = 100; /* relates units to frames */ |
TimeCodeDef.numFrames = 30; /* whole frames per second */ |
Естественная частота кадров фильма 29,97 кадров в секунду получена путем деления fTimeScale значение frameDuration (2997 / 100). Обратите внимание на то, что flags поле указывает, что временной код использует dropframe метод, чтобы повторно синхронизировать естественную частоту кадров фильма 29,97 кадров в секунду с ее скоростью воспроизведения 30 кадров в секунду.
Учитывая определение временного кода, можно свободно преобразовать от чисел кадра до временных стоимостей и от временных стоимостей для структурирования чисел. Какое-то время значение 00:00:12:15 (HH:MM:SS:FF), Вы получили бы число кадра 375 ((12*30) + 15). Обработчик носителей временного кода обеспечивает много функций, позволяющих Вам выполнять эти преобразования.
При использовании обработчика носителей временного кода для работы с временными стоимостями, обработчик носителей использует записи временного кода для хранения временных стоимостей. Запись временного кода позволяет Вам интерпретировать информацию времени или как временную стоимость (HH:MM:SS:FF) или как встречное значение. Запись временного кода определяется следующим образом:
typedef union TimeCodeRecord { |
TimeCodeTime t; /* value interpreted as time */ |
TimeCodeCounter c; /* value interpreted as counter */ |
} TimeCodeRecord; |
typedef struct TimeCodeTime { |
unsigned char hours; /* time: hours */ |
unsigned char minutes; /* time: minutes */ |
unsigned char seconds; /* time: seconds */ |
unsigned char frames; /* time: frames */ |
} TimeCodeTime; |
typedef struct TimeCodeCounter { |
long counter; /* counter value */ |
} TimeCodeCounter; |
Когда Вы работаете с временными кодами, позволяющими отрицательные временные стоимости, minutes поле TimeCodeTime структура (TimeCodeRecord.t.minutesMovie Типы данных), указывает, положительна ли временная стоимость или отрицательна. Если tctNegFlag бит minutes поле установлено в 1, временная стоимость отрицательна.