Определение местоположения дорожек, сохранение фильмов и изменение свойств фильма
Панель инструментов Фильма обеспечивает ряд функций, помогающих Вашему приложению определить местоположение дорожек фильма и структур носителей. В этой главе описываются эти функции и как использовать их. Кроме того, глава обсуждает функции, которые можно использовать, чтобы сохранить фильмы, получить и восстановить состояние редактирования фильма и изменить свойства фильма. Более поздний раздел главы обсуждает поддержку прогрессивных загрузок.
Панель инструментов Фильма идентифицирует дорожки фильма двумя способами. Во-первых, каждая дорожка в фильме имеет значение уникального идентификатора. Это Значение идентификатора уникально в течение жизни фильма, даже после того, как это было сохранено. Т.е. никакие две дорожки фильма никогда не имеют тот же ID, и никакое Значение идентификатора никогда не снова используется. Во-вторых, текущие дорожки фильма могут быть идентифицированы их индексным значением. Индексные значения всегда колеблются от 1 до числа дорожек в фильме. Индексы дорожки обеспечивают удобный способ получить доступ к каждой дорожке фильма.
Существует несколько функций, позволяющих Вам находить дорожки фильма. Можно использовать GetMovieTrackCount функция для определения числа дорожек в фильме. Используйте GetMovieTrack функция для получения идентификатора дорожки для определенной дорожки, учитывая ее ID. GetMovieIndTrack функция позволяет Вам получить идентификатор дорожки учитывая его индекс дорожки.
Можно получить Значение идентификатора дорожки, данное его идентификатор дорожки путем вызова GetTrackID функция.
Можно определить фильм, содержащий дорожку путем вызова GetTrackMovie функция.
GetTrackMedia функция позволяет Вам найти носители дорожки. С другой стороны можно найти дорожку, использующую носители путем вызова GetMediaTrack функция.
Сохранение фильмов
Панель инструментов Фильма обеспечивает ряд высокоуровневых функций для хранения фильмов в файлах. Эти файлы имеют тип файла 'MooV' и тип ресурса 'moov'. Ваше приложение может получить доступ к существующим фильмам с любым NewMovieFromFile функционируйте или NewMovieFromDataFork функция. Как только Вы загрузили фильм, Ваше приложение использует функции, описанные в этом разделе для сохранения любых изменений, которые Вы внесли в фильм.
Можно использовать AddMovieResource функция для добавления нового ресурса фильма к файлу ролика. Ваше приложение может использовать эту функцию для сохранения фильма, что это создало использование функций. Можно использовать UpdateMovieResource функционируйте для замены существующего ресурса фильма в файле ролика. Можно удалить ресурс фильма путем вызова RemoveMovieResource функция.
Ресурсы фильма, которые Ваше приложение создает с AddMovieResource и UpdateMovieResource функции могут содержать ссылки на данные фильма. Эти ссылки идентифицируют данные, составляющие фильм. Однако данные фильма могут храниться за пределами файла ролика. Если Вы хотите создать файл ролика, содержащий все его данные фильма, используйте FlattenMovie или FlattenMovieData функция. Эти функции могут также использоваться, чтобы хранить данные фильма в ветви данных файла ролика или чередовать данные носителей для оптимизации производительности.
PutMovieIntoHandle функционируйте помещает фильм в формате QuickTime в дескриптор. Можно тогда преобразовать фильм в специализированные форматы данных.
HasMovieChanged и ClearMovieChanged функции позволяют Ваше рвение с измененным флагом фильма, сохраняющимся Панелью инструментов Фильма. Можно использовать этот флаг, чтобы определить, был ли изменен фильм.
Фильм изменился, флаг указывает, изменили ли Вы фильм. Такие действия как редактирование фильма, добавление выборок к носители или изменение ссылки на данные заставляют флаг указывать, что изменился фильм. Существует несколько операций, которые изменил фильм, флаг не отражается, включая изменение объема, уровня или настроек времени для фильма. Когда фильм проигрывается, эти настройки часто изменяются. Ваше приложение должно контролировать эти настройки само.
Панель инструментов Фильма также предоставляет функции для того, чтобы сохранить и получить фильмы, которые сохранены в ветви данных файла. Эти функции обеспечивают устойчивое разрешение ссылки на данные и улучшают низкую производительность памяти. NewMovieFromDataFork функция позволяет Вам получить фильм, который сохранен где угодно в ветви данных файла. Можно использовать PutMovieIntoDataFork функционируйте для хранения версии атома указанного фильма в ветви данных файла.
Функции обратного вызова основы времени
Если Ваше приложение использует основы времени QuickTime, оно может определить функции обратного вызова, связанные с определенной основой времени. Ваше приложение может тогда использовать эти функции обратного вызова для выполнения действий, инициированных временными событиями, такими как определенное достигаемое время или указанный достигнутый уровень. Функции основы времени Панели инструментов Фильма взаимодействуют с компонентами часов для планирования вызова этих функций обратного вызова; компоненты часов ответственны за вызов функции обратного вызова в ее запланированное время. Ваше приложение может использовать функции, описанные в этом разделе, чтобы установить Вашу собственную функцию обратного вызова и запланировать события обратного вызова.
Можно определить три типа событий обратного вызова. Эти типы отличает природа временного события, инициировавшего Панель инструментов Фильма для вызывания функции. Три типа
события, инициированные в требуемое время
события, инициированные, когда уровень достигает указанного значения
события, инициированные, когда временная стоимость времени базируют изменения суммой, отличающейся со времени уровень основы
Вы указываете тип события обратного вызова при определении события обратного вызова, с помощью NewCallBack функция.
Вы указываете, может ли Ваше событие иметь место во время прерывания при определении события обратного вызова, с помощью NewCallBack функция. Ваша функция вызвана ближе к инициирующему событию во время прерывания, но это подвергается всем ограничениям функций обработки прерываний (например, Ваша функция обратного вызова не может заставить память быть перемещенной). Если Ваша функция не вызвана во время прерывания, Вы свободны от этих ограничений; однако, Ваша функция может быть вызвана позже, потому что вызов задерживается для предотвращения времени прерывания.
NewCallBack функция выделяет память для поддержки события обратного вызова. Когда Вы сделаны с событием обратного вызова, Вы избавляетесь от него путем вызова DisposeCallBack функция.
Вы планируете событие обратного вызова путем вызова CallMeWhen функция. Вызвать CancelCallBack функционируйте, чтобы не запланировать событие обратного вызова.
Можно получить основу времени события обратного вызова путем вызова GetCallBackTimeBase функция. Можно получить тип события обратного вызова путем вызова GetCallBackType функция.
Создание и избавление от основ времени
В этом разделе рассматриваются функции Панели инструментов Фильма, которые Ваше приложение может использовать, чтобы создать и избавиться от основ времени.
NewTimeBase функция позволяет Вам заложить новую основу времени. Можно использовать DisposeTimeBase функция для избавления от времени базируется, как только Вы закончены с нею.
Основы времени полагаются или на компонент часов или на другую основу времени для их источника времени. Можно использовать SetTimeBaseMasterTimeBase функционируйте, чтобы заставить одну основу времени основываться на другой основе времени. GetTimeBaseMasterTimeBase позволяет Вам определять основную основу времени данной основы времени.
Можно присвоить компонент часов основе времени; те часы тогда действуют как основной тактовый генератор для основы времени. Можно использовать SetTimeBaseMasterClock функция для присвоения компонента часов основе времени. GetTimeBaseMasterClock функция позволяет Вам определить компонент часов, присваивающийся основе времени. Можно изменить смещение между основой времени и ее источником времени путем вызова SetTimeBaseZero функция.
Можно установить источник времени фильма путем вызова SetMovieMasterTimeBase и SetMovieMasterClock функции.
Работа со временем фильма
Каждый фильм в формате QuickTime имеет свою собственную основу времени. Основа времени фильма позволяет все дорожки, составляющие фильм, который будет синхронизироваться, когда проигрывается фильм. Панель инструментов Фильма обеспечивает много функций, позволяющих Вашему приложению определять и устанавливать параметры времени фильма. В этом разделе рассматриваются те функции. Более поздние разделы в этой главе обсуждают функции Панели инструментов Фильма, позволяющие Вам работать с параметрами времени структур носителей и дорожек.
Можно использовать GetMovieTimeBase функция для получения времени базируется для фильма.
Можно работать с текущим временем фильма путем вызова GetMovieTime, SetMovieTime, и SetMovieTimeValue функции.
Можно работать с масштабом времени фильма путем вызова GetMovieTimeScale и SetMovieTimeScale функции.
Панель инструментов Фильма может вычислить общую продолжительность фильма. Можно использовать GetMovieDuration функция для получения продолжительности фильма.
Ваше приложение может вызвать GetMovieRate и SetMovieRate работать со скоростью воспроизведения фильма.
Работа с пользовательскими данными фильма
Каждый фильм, дорожка и носители могут содержать пользовательский список данных, который Ваше приложение может использовать всегда, Вы хотите. Пользовательский список данных содержит все пользовательские данные для фильма, дорожки или носителей. Каждый пользовательский список данных может содержать один или несколько пользовательских элементов данных.
Все пользовательские элементы данных QuickTime совместно используют несколько атрибутов. Во-первых, каждый пользовательский элемент данных переносит идентификатор типа. Этот тип подобен типу ресурса Менеджера ресурсов и сохранен в длинном целом. Apple зарезервировал все строчные пользовательские значения типа данных. Вы свободны создать пользовательские ценности типа данных с помощью прописных букв. Apple рекомендует использовать значения типа, начинающиеся с символа авторского права для указания пользовательских элементов данных, хранящих текстовые данные.
Временная структура
Панель инструментов Фильма обеспечивает много функций, позволяющих Вам работать со спецификациями времени. Многие из этих функций требуют, чтобы Вы поместили спецификацию времени в структуру данных, названную atime структурой. Временная структура позволяет Вам полностью описывать спецификацию времени. TimeRecord тип данных определяет формат временной структуры.
struct TimeRecord |
{ |
CompTimeValue value; /* time value (duration or absolute) */ |
TimeScale scale; /* units per second */ |
TimeBase base; /* reference to the time base */ |
}; |
typedef struct TimeRecord TimeRecord; |
Поле |
Описание |
|---|---|
|
Содержит временную стоимость. Временная стоимость определяет или продолжительность или абсолютное время путем указания соответствующего числа единиц времени. На время это - число единиц измерения времени в период. В течение абсолютного времени это - число единиц измерения времени с начала системы координат времени. Модуль для этого значения определяется полем масштаба. Временная стоимость выражена как a |
|
Содержит масштаб времени. Это поле указывает число единиц времени та передача каждую секунду. При указании значения 0 основа времени использует свой естественный масштаб времени. |
|
Содержит ссылку на основу времени. Вы получаете основу времени путем вызова Панели инструментов Фильма |
Если временная структура определяет продолжительность, установите это поле в nil. Иначе, это поле должно относиться к допустимой основе времени.
Вы указываете временную стоимость во временной структуре в 64-разрядном целочисленном значении следующим образом:
typedef Int64 CompTimeValue; |
Панель инструментов Фильма использует этот формат так, чтобы могли быть представлены чрезвычайно большие временные стоимости. Int64 тип данных определяет формат этих 64-разрядных целых чисел со знаком.
struct Int64 |
{ |
long hi; /* high-order 32 bits-value field in time structure */ |
long lo; /* low-order 32 bits-value field in time structure */ |
}; |
typedef struct Int64 Int64; |
Поле |
Описание |
|---|---|
|
Содержит старший разряд 32 бита значения. Старший бит представляет знак 64-разрядного целого числа. |
|
Содержит младший разряд 32 бита значения. |
Структуры фиксированной точки и Фиксированного Прямоугольника
Функции матрицы Панели инструментов Фильма обеспечивают два механизма для указания точек и прямоугольников. Некоторые функции работают со стандартными точками QuickDraw и прямоугольниками, использующими целочисленные значения для идентификации координат. Другие, такой как TransformFixedRect функция, работайте с точками и прямоугольниками, координаты которых выражены как числа фиксированной точки. При помощи чисел фиксированной точки в этих точках и прямоугольниках, Панель инструментов Фильма может поддерживать большую степень точности при определении графических объектов.
FixedPoint тип данных определяет фиксированную точку. FixedRect тип данных определяет фиксированный прямоугольник. Обратите внимание на то, что обе из этих структур определяют координату x перед координатой y. Это отличается от стандартных структур QuickDraw.
struct FixedPoint |
{ |
Fixed x; /* point's x coordinate as fixed-point number */ |
Fixed y; /* point's y coordinate as fixed-point number */ |
}; |
typedef struct FixedPoint FixedPoint; |
Поле |
Описание |
|---|---|
|
Определяет координату x точки как число фиксированной точки. |
|
Определяет координату y точки как число фиксированной точки. |
struct FixedRect |
{ |
Fixed left; /* x coordinate of upper-left corner */ |
Fixed top; /* y coordinate of upper-left corner */ |
Fixed right; /* x coordinate of lower-right corner */ |
Fixed bottom; /* y coordinate of lower-right corner */ |
}; |
typedef struct FixedRect FixedRect; |
Поле |
Описание |
|---|---|
|
Определяет x координату верхнего левого угла прямоугольника как число фиксированной точки. |
|
Определяет y координату верхнего левого угла прямоугольника как число фиксированной точки. |
|
Определяет x координату нижнего правого угла прямоугольника как число фиксированной точки. |
|
Определяет y координату нижнего правого угла прямоугольника как число фиксированной точки. |
Поддержка обработчика носителей
Видео, основа и поддержка обработчиков носителей промежуточного кадра, отправляющая их данные в другие дорожки. Текстовые данные могут также быть отправлены, но ни один из обработчиков носителей в настоящее время не получает их. Звук, музыка и 3D обработчики носителей не поддерживают отправку их данных к другим дорожкам.
Не все обработчики носителей поддерживают все входные типы. Обработчики носителей могут решить, которые вводят типы для поддержки. Таблица 9-1 перечисляет входные типы, поддерживаемые каждым предоставленным Apple обработчиком носителей.
Входной тип |
Видео |
Текст |
Звук |
MPEG |
Музыка |
Sprite |
Временной код |
3D |
|---|---|---|---|---|---|---|---|---|
Матрица |
x |
x |
|
x |
|
x |
x |
x |
Графический режим |
x |
x |
|
x |
|
x |
x |
x |
Клип |
x |
x |
|
x |
|
x |
x |
x |
Объем |
|
|
x |
x |
x |
|
|
|
Баланс |
|
|
x |
x |
x |
|
|
|
Изображение Sprite |
|
|
|
|
|
x |
|
x |
3D звук |
|
|
x |
|
x |
|
|
|
Компоненты обработчика данных
QuickTime представил основанный на памяти обработчик данных. Этот компонент обработчика данных работает с данными фильма, хранящимися в памяти (ссылаемый дескриптором) вместо в файле. Этот обработчик данных имеет значение подтипа компонента
HandleDataHandlerSubType ('hndl') |
Для создания фильма, использующего обработчик данных дескриптора, устанавливает тип ссылки на данные в HandleDataHandlerSubType когда Вы вызываете NewTrackMedia функция. Обратите внимание на то, что данные фильма в памяти автоматически не сохраняются с фильмом. Если Вы хотите сохранить данные, которые находятся в памяти, используйте FlattenMovie или InsertTrackSegment функции для копирования данных из памяти в файл. Обратите внимание на то, что существует специальный флаг для FlattenMovie и обработчики данных.
Обработчик данных дескриптора не использует псевдонимы в качестве своей ссылки на данные, и поэтому не использует дескрипторы псевдонима. Скорее это использует 4-байтовые дескрипторы памяти в качестве своей ссылки на данные. Ссылка на данные содержит фактический дескриптор, хранящий необходимые данные. Если Вы передаете значение дескриптора nilMovie Типы данных, обработчик данных выделяет и управляет дескриптором для Вас. Если Вы передаете значение дескриптора кроме nilMovie Типы данных, обработчик данных использует Ваш дескриптор. Это - тогда Ваша ответственность управлять дескриптором и избавиться от него в надлежащих случаях. Обратите внимание на то, что единственный дескриптор может быть совместно использован несколькими компонентами обработчика данных. Каждый раз, когда новые данные добавляются, обработчик данных изменяет размеры дескриптора для размещения новых данных.
Поддержка прогрессивных загрузок
Фильм в формате QuickTime Панель инструментов включает поддержку прогрессивных загрузок, позволяющих части фильма быть выведенной на экран, прежде чем все его данные были получены по сети или другому медленному каналу.
Приложения, использующие компонент контроллера фильма, предоставленный Apple автоматически, получают поддержку прогрессивных загрузок. Приложения, не использующие стандартный контроллер фильма, могут использовать две высокоуровневых функции для прогрессивных загрузок, QTMovieNeedsTimeTable и GetMaxLoadedTimeInMovie, определить, загружается ли фильм прогрессивно и, если так, для наблюдения, сколько из него было уже загружено. Наконец, несколько приложений, для которых нужно еще больше управления прогрессивными загрузками, такими как управление отдельными дорожками или носителями, могут использовать один или обе из низкоуровневых функций для прогрессивных загрузок, MakeTrackTimeTable и MakeMediaTimeTable.
Отображение прогрессивно загружаемого фильма
Перечисление 9-1 иллюстрирует, как использовать QTMovieNeedsTimeTable функция, чтобы узнать, если фильм, будучи прогрессивно загруженным, и GetMaxLoadedTimeInMovie функция, для обнаружения, сколько из фильма было загружено.
Перечисление 9-1 , Выводящее на экран прогрессивно загружаемый фильм
WindowPtr movieWindow; |
Movie theMovie; |
Boolean needsTimeTable; |
TimeValue loadedTime = -1; |
err = GetDisplayedMovie (&movieWindow, &theMovie); |
err = QTMovieNeedsTimeTable (theMovie, &needsTimeTable); |
if (needsTimeTable) |
{ |
err = GetMaxLoadedTimeInMovie (theMovie, &loadedTime); |
// Display the movie up to the current end |
} |
Низкоуровневые подпрограммы
Некоторым приложениям, возможно, понадобится больше управления прогрессивными загрузками, такими как управление отдельными дорожками или носителями, чем возможно с высокоуровневыми функциями для прогрессивных загрузок. Эти приложения могут использовать один или обе из низкоуровневых функций для прогрессивных загрузок, описанных в этом разделе, MakeTrackTimeTable и MakeMediaTimeTable.
Обработка демонстрационных ссылок носителей
Вы могли всегда использовать GetMediaSampleReference к выборкам доступа в фильме по одному. QuickTime представлен GetMediaSampleReferences (обратите внимание на то, что это - форма множественного числа GetMediaSampleReference функция), который можно использовать для получения информации о группах выборок. QuickTime также представлен AddMediaSampleReferences, который можно использовать для работы с группами выборок, уже добавленных к фильму.
Управление входными картами носителей
Панель инструментов Фильма содержит две функции для поддержания входных карт носителей: GetMediaInputMap и SetMediaInputMap.
Каждая дорожка имеет определенные атрибуты, такие как размер, позиция и объем, связанный с ним. Носители вводят карту той дорожки, описывает, где переменные параметры сохранены так, чтобы дорожки модификатора знали, куда отправить их данные. Когда дорожка копируется, ее входная карта также копируется. CopyTrackSettings также передает входную карту носителей.