Часы фильма, звуковые часы и видеовыход
В этой главе описываются, как установить основной тактовый генератор фильма, как часы фильма по умолчанию выбраны, использование звуковых часов, как использовать SetMovieMasterClock с компонентами видеовыхода и флагами возможности компонента определяется для компонентов часов.
Обзор
Компоненты часов используются Панелью инструментов Фильма для основ времени. Основной тактовый генератор фильма - то, что управляет основой времени фильма.
Основа времени определяет значение текущего времени фильма и уровень, на котором время передает для фильма. Уровень указывает скорость и направление в который путешествия во времени в фильме. Основа времени также содержит ссылку на часы, обеспечивающие синхронизацию для основы времени.
Когда приложение открывает фильм, содержащий звуковую дорожку, QuickTime использует звуковые часы в качестве основного тактового генератора фильма. Звуковые часы являются компонентом часов, предоставленным непосредственно выбранным устройством аудиовыхода, или (если устройство аудиовыхода не обеспечивает один), часы, просто наблюдающие, что выборки проходят на их выходе к аппаратным средствам, и получающие часы из этого.
Другими словами, если Вы будете проигрывать фильм, содержащий аудио и видео носители, то видео будет играть на любом уровне, который играют аудио аппаратные средства. Если фильм испытает недостаток в звуковой дорожке, то QuickTime будет использовать системные часы в качестве основного тактового генератора фильма.
Часы, которые QuickTime выбирает через этот процесс, вызывают часами по умолчанию.
Можно получить компонент часов, связанный с данным носители путем вызова MediaGetClock.
Флаги возможности компонента описывают возможности компонента часов: в частности, ли часы сохраняют постоянный уровень (в противоположность смещению) и поддерживает ли компонент функции обратного вызова.
Установка и изменение основного тактового генератора
В этом разделе описывается установить и изменить основной тактовый генератор, связанный с основой времени фильма.
Можно получить компонент часов, связанный с данным носители путем вызова MediaGetClock.
Функция ChooseMovieClock
ChooseMovieClock присваивает часы по умолчанию фильму. Если Вы изменили основной тактовый генератор фильма с SetMovieMasterClock, или хотел бы сбросить часы фильма, использовать ChooseMovieClock функция.
Связанные компоненты: компонентные часы видеовыхода
Часы Видеовыхода являются компонентом часов, связанным с определенным компонентом видеовыхода. Когда устройство вывода используется, эти часы позволяют основе времени, используемой фильмом в формате QuickTime управляться определенными выходными часами устройства для синхронизации видео и звука.
Приложение может попросить компонент часов, связанный с компонентом видеовыхода, и использовать эти часы в качестве основного тактового генератора фильма.
При использовании Компонента Видеовыхода можно получить Экземпляр Компонента Часов, связанного с Компонентом Видеовыхода путем вызова QTVideoOutputGetClock.
Как только у Вас есть этот Экземпляр Часов, он может быть связан с Фильмом путем вызова SetMovieMasterClock. Поскольку изменение в режиме отображения могло влиять на компонент часов, Ваше приложение должно вызвать QTVideoOutputGetClock только между вызовами к QTVideoOutputBegin и QTVideoOutputEnd функции.
Когда Вы захотите сбросить основной тактовый генератор фильма назад к часам по умолчанию, использовать ChooseMovieClock.
Если Вы ранее использовали SetMovieMasterClock для сброса, фильмы синхронизируют к часам по умолчанию, необходимо измениться на новое ChooseMovieClock метод:
ChooseMovieClock(myMovie, 0); |
Связанные компоненты: компонент звукового вывода
Компонент Звукового вывода является программным модулем, идентифицирующим, управляющим и играющим аудио на определенном устройстве. Компоненты видеовыхода, в дополнение к наличию компонента часов, могут иметь Компонент Звукового вывода, связанный с ними.
Разработчики могут изменить Компонент Звукового вывода, используемый Обработчиком Носителей путем вызова MediaSetSoundOutputComponent. Это позволяет выбирать между использованием аудиоустройства, связанного с устройством видеовыхода, другим устройством звукового вывода, установленным в системе или устройстве звукового вывода по умолчанию.
Используя компонент звукового вывода, связанный с компонентом видеовыхода
Найти Компоненты Звукового вывода связалось с Компонентным использованием Видеовыхода QTVideoOutputGetIndSoundOutput. Как только компонент получен, вызвать MediaSetSoundOutputComponent установить компонент звукового вывода для обработчика носителей.
Component theSoundOut = 0; |
ComponentInstance theVOutClock = NULL; |
UnsignedFixed theSupportedAudioRate, myWantedAudioRate = eAudioRate48khz; |
... |
// Does this Video Output Component have a |
// Sound Output Component associated with it? |
if (ComponentFunctionImplemented(theInstance, |
kQTVideoOutputGetIndSoundOutputSelect)) { |
// Get the first sound output component associated |
// with the video output component |
err = QTVideoOutputGetIndSoundOutput(inVOComponentInstance, |
1, &theSoundOut); |
if (err || 0 == theSoundOut) goto bail; |
// Not all sound output components support all sample |
// rates, use GetSoundOutputInfo with the siSampleRateAvailable |
// selector and figure it out |
theSupportedAudioRate = MyChooseAudioRate(myWantedAudioRate, |
theSoundOut); |
// Set the sample rate for the audio output |
err = SoundComponentSetInfo((ComponentInstance)theSoundOut, |
NULL, siSampleRate, (void *)theSupportedAudioRate); |
if (err) goto bail; |
// For each audio tracks media set the sound output component |
for (i = 0;i < theNumberAudioTracks; i++) { |
err = MediaSetSoundOutputComponent(inAudioMediaHandlers[i], |
theSoundOut); |
if (err) goto bail; |
} |
} |
// Use the Video Output Clock as the Master Clock |
// Set up the video output clock after sound or it |
// gets set back to the default clock |
if (ComponentFunctionImplemented(inVOComponentInstance, |
kQTVideoOutputGetClockSelect)) { |
err = QTVideoOutputGetClock(inVOComponentInstance, &theVOutClock); |
if (err || NULL == theVOutClock) goto bail; |
SetMovieMasterClock(inMovie, (Component)theVOutClock, NULL); |
} |
Переключение Назад на компонент звукового вывода по умолчанию
Для переключения назад на Компонент Звукового вывода По умолчанию использовать MediaSetSoundOutputComponent и передача в NULL для параметра Компонента.
// Set the Sound Output back to the Default Sound Output |
for (i = 0;i < theNumberAudioTracks; i++) { |
err = MediaSetSoundOutputComponent(theAudioMediaHandler[i], NULL); |
if (err) goto bail; |
} |
// Switch back to the default clock |
ChooseMovieClock(myMovie, 0); |
Выбор часов
Как упомянуто в разделе Associated Components: Компонент Звукового вывода, выбор Sound Output Component сбросит основной тактовый генератор. Поэтому, как только Вы выбираете Sound Output Component, необходимо тогда установить основной тактовый генератор фильма. Можно или использовать Часы Видеовыхода (логический выбор при использовании Компонента Видеовыхода), или Вы могли, выбрал часы по умолчанию для обеспечения аудио и видео синхронизации для фильма.
При использовании Часов Видеовыхода, убедиться задержать часы фильма к часам по умолчанию перед вызовом QTVideoOutputEnd.
Если Вы хотите использовать Часы Видеовыхода, вызвать SetMovieMasterClock и передача в Экземпляре Часов Видеовыхода.
// Use the Video Output Clock as the Master Clock |
// Set up the video output clock after sound or it |
// gets set back to the default clock |
if (ComponentFunctionImplemented(theVOComponentInstance, |
kQTVideoOutputGetClockSelect)) { |
err = QTVideoOutputGetClock(gVOComponentInstance, &theVOutClock); |
if (err || NULL == theVOutClock) goto bail; |
SetMovieMasterClock(myMovie, (Component)theVOutClock, NULL); |
} |
При выборе или переключении на Часы По умолчанию, использовать ChooseMovieClock.
// Use the default clock |
ChooseMovieClock(myMovie, 0); |
Помните, не, все звуковые устройства имеют часы, и не все компоненты видеовыхода имеют компоненты часов, связанные с ними, так убедиться проверить.
SetMovieMasterClock и ChooseMovieClock сведет друг друга на нет; последний вызванный API является тем, устанавливающим часы.
MediaSetSoundOutputComponent может изменить основной тактовый генератор фильма.
Флаги возможности компонента для часов
Менеджер компонентов позволяет компоненту часов указывать информацию о своих возможностях в componentFlags поле структуры описания компонента. Apple определил два флага компонента для компонентов часов. Эти флаги указывают информацию о возможностях компонента часов. Автор компонента устанавливает эти флаги в componentFlags поле компонента ComponentDescription структура. Следующие константы могут использоваться для управления этими флагами. Авторы часов компонента должны установить их соответственно для их часов.
enum { |
kClockRateIsLinear = 1, /* clock keeps constant rate */ |
kClockImplementsCallBacks = 2 /* clock supports callback events */ |
}; |
kClockRateIsLinear указывает, что Ваши часы поддерживают постоянный уровень. Большинство часов, что Вы имеете дело с в повседневном мире, попадает в эту категорию. Примером часов с неправильным уровнем являются часы, зависящие от позиции мыши компьютера Macintosh; уровень часов мог бы измениться в зависимости от того, куда пользователь перемещает мышь. Установите этот флаг в 1, если Ваши часы имеют постоянный уровень.
kClockImplementsCallBacks указывает, что Ваши часы поддерживают события обратного вызова. Установите этот флаг в 1, если Ваши часы поддерживают события обратного вызова.
Необходимо установить componentFlags поле соответственно в структуре описания компонента, связанной с Вашим компонентом часов.