Архитектура QTKit
В этой главе описываются основные принципы программной архитектуры QTKit.
Для разработки успешных приложений с помощью классов и методов в API QTKit необходимо не обязательно понять все подробности того, как соглашения QuickTime с и управляют видеоконтентом и мультимедийным контентом. Подход, проявленный в этой главе, должен предоставить Вам высокоуровневое описание шести классов, формирующих модель базового объекта для API, со списком их обычно используемых методов, задач и способов поведения. Следующая глава, Получение QTKit, описывает часть API, включающего классы, посвященные получению и записи носителей.
Глава также обсуждает много вариантов использования и сценариев для обработки воспроизведения носителей, редактирования, экспорта, проблем потокобезопасности и применения Базовых фильтров Изображения к воспроизведению видео. Намерение состоит в том, чтобы предоставить Вам фрагменты кода, демонстрирующие методы наиболее успешной практики и методы для сокращения времени и усилия в цикле разработки.
Графика и уровень носителей в OS X
QuickTime и QTKit являются графикой и платформами носителей, находящимися в OS X, включающем Базовое Видео, Базовое Изображение и Базовую Анимацию, а также OpenGL, Кварц и Core Audio.
Для лучше понимания этих платформ можно просмотреть их реализацию, изображенную графически как ряд уровней, показанных на рисунке 1-1. Каждый уровень обеспечивает прогрессивно более мощный и сложный набор прикладных служб. Уровень графики и носителей реализует много специализированных служб для игры аудио и видео мультимедийного контента и для рендеринга 2D и 3D графики.
QuickTime и QTKit являются базовыми технологиями Apple для отображения и получения, редактирования и экспорта огромного количества аудио, видео и связанного с мультимедиа содержания. Обе платформы являются мощными стандартными блоками в экосистеме технологий OS X, предназначенных для обеспечения разработчиков инструментами и платформами, необходимыми, чтобы создать и развернуть современные мультимедийные приложения.
Вы используете QuickTime и QTKit, чтобы обработать основную, а также усовершенствованную работу по дому видео, аудио и обработки носителей изображения, и таким образом сократить код, который необходимо записать в цикле разработки приложений.
Поддерживаемые форматы носителя
QuickTime и QTKit поддерживают широкий диапазон основанных на стандартах форматов, в дополнение к собственным форматам от Apple и других.
Таблица 1-1 перечисляет некоторые из большего количества поддерживающихся форматов общего файла. Для полного списка поддерживаемых форматов обратитесь к странице технической характеристики изделия в http://www .apple.com/quicktime/pro/specs.html.
Форматы аудио | AIFF, MP3, AU, WAV, uLaw |
Форматы видео | AVI, AVR, DV, M-JPEG, MPEG 1, MPEG 2, MPEG 4 |
Кодеки | AAC, AVI, AVR, DV, M-JPEG, MPEG 1, MPEG 2, MPEG 4, OpenDML, 3GPP, 3GPP2, AMC, H.264 |
Веб-форматы потоковой передачи | HTTP, RTP, RTSP |
Различие должно быть подчеркнуто здесь: аудио/видеоформаты, поддерживаемые QuickTime и QTKit, являются чрезвычайно форматами контейнера, спецификации которых только имеют дело с тем, как данные хранятся в файле, не, как это кодируется. В случае QuickTime, .mov
формат файла, который является собственным к QuickTime, служит мультимедийным контейнерным файлом, обычно содержащим одну или более дорожек, каждая из которых хранит определенный тип данных, таких как аудио, видео, эффекты или текст. Видеокодек, в отличие от этого, является программным обеспечением, включающим сжатие видео и распаковку цифровых сред. Кодек MPEG 4, например, основывается на формате файла QuickTime и является промышленным стандартом.
Платформа QTKit
Представленный в OS X v10.4, QTKit является Objective C, Основанной на какао платформой для управления основанными на времени носителями. Созданный поверх QuickTime, как показано на рисунке 1-2, платформа позволяет Вам включить воспроизведение фильма, редактирование фильма, экспортировать в стандартные форматы носителя, аудио/видеосъемку и запись и другие мультимедийные способы поведения легко в Ваше приложение Какао.
Разработчики QTKit не должны знать низкоуровневые работы фильма в формате QuickTime Панель инструментов, например, как показано на иллюстрации, чтобы воспроизвести или отредактировать фильмы. И при этом они не должны обязательно понимать терминологию и работы носителей и обработчиков данных, а также компонентов, которые являются частью QuickTime.
Как современный дизайн, программная архитектура QTKit создается с нуля для обеспечения разработчиков Какао питанием и возможностями, доступными в QuickTime, не имея необходимость иметь дело с его врожденной сложностью или низкоуровневыми абстракциями.
Таким образом QTKit обеспечивает намного менее сложный интерфейс программиста, чем QuickTime и представляет дистилляцию и абстракцию самых существенных функций QuickTime как маленький набор классов и методов. Большая функциональность упаковывается в относительно маленький объективный API.
Платформа сразу мощна, все же проста в использовании и работа с в Вашем приложении Какао. Особенно, QTKit обеспечивает классы Objective C, подходящие для использования в широком диапазоне Основанного на какао программного обеспечения, включая приложения с GUI, и инструменты намеревались работать в «бездисплейной» среде. Например, можно использовать платформу для записи инструментов командной строки, управляющих файлами фильма в формате QuickTime.
QTKit является также основным 64-разрядным интерфейсом в QuickTime. Вы используете QTKit для создавания 64-разрядных приложений для управления широким диапазоном мультимедийного контента, включая аудио, видео, анимацию, графику, текст, музыку и другие типы среды.
Для более подробной информации о классах и методах в API QTKit, обратитесь к Ссылке Платформы QTKit.
Если Вы хотите видеть заголовочные файлы платформы, можно найти их в OS X /System/Library/Frameworks
каталог как QTKit.framework
. QTMovieView
сменное управление находится в библиотеке Interface Builder объектов.
Задачи и возможности
Можно использовать методы и классы в API QTKit для выполнения многих существенных носителей, программируя задачи, показанные графически на рисунке 1-3. На базовом уровне API QTKit позволяет Вам:
Воспроизведите все типы носителей (как фильмы в формате QuickTime)
Носители редактирования
Экспорт от фильмов в формате QuickTime до других форматов
Получение и рекордные цифровые данные в фильмы в формате QuickTime
В контексте поддержки потоков операций с линейными носителями API QTKit предназначается для выполнения определенного диапазона задач, а именно, к:
Получите (или откройте существующие носители от диска или получите носители от определенного устройства),
Редактируйте/создавайте это носители
Носители экспорта для намеченного места назначения (например, сеть, мобильные устройства Apple, широковещательная передача, и т.д.)
Существующие носители на многократных устройствах, включая настольный и мобильное
Получение QTKit API
В каждой итерации OS X API QTKit был расширен с помощью новых функций и возможностей. В OS X v10.5, например, QTKit представил 17 новых классов для поддержки аудио/видеосъемки профессионального уровня, обсужденного в Получении QTKit.
Классы ввода и вывода, включенные с последней итерацией платформы, обеспечивают все компоненты, необходимые для Вашего приложения для реализации случая наиболее популярного способа использования для, носители получают систему: запись от камеры до файла QuickTime. Классы в получении QTKit, API позволяет Вашему приложению выполнить видеосъемку, включающую точную кадром аудио/видео синхронизацию. Можно тогда предварительно просмотреть полученное содержание и сохранить его к файлу.
QuickTime X
QuickTime X является новой архитектурой носителей, обеспечивающей ряд мультимедийных служб для эффективного, высокоэффективного воспроизведения аудио/видео носителей.
Вы получаете доступ к этим службам воспроизведения носителей, доступным в OS X v10.6, через QTKit путем выбора - в к QuickTime X с вызовом отдельного метода. То, как можно изменить существующий код QTKit для использования этих служб, обсуждено в разделе Opting into QuickTime X в главе, Принимающей QuickTime X для Воспроизведения.
Иерархия классов QTKit
Платформа QTKit состоит из 23 Objective C, классов Какао, вместе с более чем 400 методами, атрибутами, константами и уведомлениями. Платформа росла и развилась значительно с каждой итерацией OS X.
В целях лучшего концептуального понимания иерархия классов QTKit, показанная на рисунке 1-4, может быть разделена на группу из шести классов, обрабатывающих наиболее распространенную работу по дому дисплея носителей, воспроизведения и редактирования фильмов в формате QuickTime, а также поддержки Базовых Слоев анимации. Они обсуждены в этой главе.
Другая группа классов в API QTKit, разработанном для поддержки аудио/видеосъемки профессионального уровня и записи, обсуждена очень подробно в главе Получения QTKit.
Фильм, носители и часть класса дорожки иерархии классов для платформы QTKit состоят из четырех классов, QTMovie
, QTMedia
, QTTrack
и QTDataReference
, все из которых наследовались от NSObject
, в то время как QTMovieView
класс наследовался от NSView
и QTMovieLayer
класс, поддерживающий Базовый рендеринг Анимации, наследовался от CALayer
.
Классы для воспроизведения фильма
Существует шесть классов в API QTKit, использующемся прежде всего для рендеринга и воспроизведения фильмов в формате QuickTime. Таблица 1-2 описывает кратко каждый из этих классов и для каких задач они обычно используются.
Класс | Описание | Задачи |
---|---|---|
| Объект, представляющий играемый набор данных носителей. | Обычно используемый в сочетании с a |
| Подкласс | Используемый, чтобы вывести на экран и управлять фильмами в формате QuickTime в сочетании с a |
| Объект, представляющий упорядочивание и другие характеристики данных носителей в a | Обеспечивает методы для получения и установки свойств дорожки. |
| Объект, представляющий данные, связанные с a | Обеспечивает методы для получения и установки свойств носителей. |
| Представление ссылки на данные QuickTime, указывающей расположение фильма в формате QuickTime или некоторых данных носителей. | Используемый для указания расположения фильма или его данных носителей. Можно создать |
| Подкласс | Предназначенный для оказания поддержки для Базовой Анимации. |
QTMovie и объекты QTMovieView
Из этих 23 классов в API QTKit два, самые полезные и важные для понимания на концептуальном уровне, QTMovie
и QTMovieView
. Они формируют основу платформы, и в случае QTMovie
, включайте наибольшее число методов. Необходимо знать, как эти объекты ведут себя и какие задачи они предназначаются для выполнения для работы успешно с API.
Объектное представление QTMovie
A QTMovie
объект, представляющий играемый набор данных носителей. Фильм описывает источники и типы носителей в том наборе и их пространственной и временной организации. Эти наборы могут использоваться для представления (такого как воспроизведение на экране) или для организации носителей для обработки (таких как состав и транскодирование к различному типу сжатия).
A QTMovie
объект может быть инициализирован от файла, от ресурса, указанного URL, от блока памяти, от области монтажа, или из существующего фильма в формате QuickTime. Один раз a QTMovie
объект был инициализирован, он будет обычно использоваться в сочетании с a QTMovieView
для воспроизведения. Это может также использоваться для других целей, таких как преобразование данных носителей в другой формат.
Так же, как фильм в формате QuickTime содержит ряд дорожек, каждая из которых определяет тип, сегменты и упорядочивание данных носителей, которые это представляет, a QTMovie
объект связан с экземплярами QTTrack
класс. В свою очередь, a QTTrack
объект связан с синглом QTMedia
объект. QTMovie
экземпляры могут справочные данные, содержавшиеся в файлах, URLs, или в памяти. QTMovie
обеспечивает методы для получения и установки свойств фильма и для редактирования фильмов.
Вывести на экран a QTMovie
объект в окне, например, Вы используете QTMovieView
класс. Как подкласс NSView
, QTMovieView
воспроизведение фильма поддержек и редактирование, с панелью контроллера фильма, которая выведена на экран в представлении, но может быть дополнительно скрыта.
QTMovie
класс включает обширное число методов экземпляра и методов класса, позволяющих Вам выполнить широкий диапазон операций на фильмах в формате QuickTime. Некоторые из этих возможностей включают:
Создание и инициализация a
QTMovie
объектУправление воспроизведением фильма
Редактирование фильма
Сохранение данных фильма
Установка свойств фильма и атрибутов
Получение дорожек фильма и изображений фильма
QTMovie
класс также включает большое количество строковых констант, позволяющих Вам указать атрибуты фильма. Некоторые более обычно используемые атрибуты для обработки продолжительности и текущее время показаны в Таблице 1-3. QTMovieOpen
... атрибуты, например, могут использоваться для инициализации, и для выбора - в к высокоэффективным носителям воспроизводят услуги, предоставленные QuickTime X (отошлите toOpting в QuickTime X для получения дополнительной информации). Атрибуты, имеющие дело с состоянием загрузки, обсуждены в Контролирующем состоянии Загрузки.
Кодирование методов для использования этих атрибутов описано в Учебном руководстве по Приложению QTKit, в частности использование QTMovieNaturalSizeAttribute
для того, чтобы вывести на экран и воспроизвести фильмы в формате QuickTime в их исходном или «созданном» размере.
Атрибуты | Задачи |
---|---|
| Продолжительность a |
| Текущее время a |
| Доступная для редактирования установка. |
| Значение состояния загрузки; значение для этого ключа имеет тип |
| Ошибка состояния загрузки a |
| Естественный размер a |
| Указывает, может ли файл ролика быть открыт асинхронно, если это возможно, |
| Указывает ли |
| Указывает ли |
Атрибуты QTMovie
Рекомендуемый способ открыть файл ролика с initWithAttributes:error
. Это - теперь определяемый инициализатор QTMovie
класс в OS X v10.6. Вы делаете это:
- (id)initWithAttributes:(NSDictionary *)attributes |
error:(NSError **)errorPtr; |
+ (id)movieWithAttributes:(NSDictionary *)attributes |
error:(NSError **)errorPtr; |
Вы передаете в словаре атрибутов, описывающих, что это - Вы, хотят, и затем QTKit создаст фильм с тем набором характеристик. Существует три вида атрибутов, которые можно поместить в тот словарь атрибутов.
Атрибуты локатора данных. Это атрибуты, указывающие, где расположены данные фильма. Как правило, Вы передаете в имени файла или URL.
QTMovieFileNameAttribute
QTMovieURLAttribute
QTMoviePasteboardAttribute
QTMovieDataAttribute
QTMovieDataReferenceAttribute
Атрибуты конфигурации фильма. Это атрибуты, применился к фильму, поскольку он открывается. Например, если Вы хотите открыть фильм в доступном для редактирования состоянии, можно вставить этот атрибут и значение
YES
. Точно так же Вы могли присвоить делегата. Вы могли сказать, что хотите, чтобы фильм циклично выполнился, или Вы могли регулировать громкость к некоторому нестандартному объему, который Вы хотите. В основном в этой категории атрибутов можно вставить любой устанавливаемый атрибут. Эти атрибуты являются, которые могут быть считаны и записаны. Для получения информации об атрибутах можно установить и записать, относиться к Ссылке Платформы QTKit, в частности Ссылка класса QTMovie.QTMovieEditableAttribute
QTMovieDelegateAttribute
QTMovieLoopsAttribute
QTMovieVolumeAttribute
Специальные атрибуты инициализации. Это атрибуты, влияющие, как QTKit открывает фильм.
QTMovieDontInteractWithUserAttribute
QTMovieResolveDataRefsAttribute
QTMovieAskUnresolvedDataRefsAttribute
QTMovieOpenAsyncOKAttribute
QTMovieOpenAsyncRequiredAttribute
QTMovieOpenForPlaybackAttribute
Обратите внимание на то, что в OS X v10.6, определяемый инициализатор для QTMovie
класс initWithAttributes:error:
, чей первый параметр является словарем ключей атрибута и их требуемых значений. Как описано, один из этих атрибутов должен указать расположение данных носителей (например, с помощью QTMovieURLAttribute
ключ). Другие атрибуты могут указать желаемые открывающие фильм способы поведения, и другие все еще могут указать желаемые начальные значения QTMovie
свойства (например, QTMovieVolumeAttribute
).
Запрос асинхронной загрузки фильма
Используя новое QTMovieOpenAsyncRequiredAttribute
доступный в OS X v10.6, можно указать, хотите ли Вы, чтобы QTKit попытался инициализировать a QTMovie
возразите асинхронно против потока инициализации. Если QTMovieOpenForPlaybackAttribute
также указан и медиаресурс совместим с QuickTime X, асинхронное открытие будет всегда успешно выполняться. Если QuickTime 7 будет использоваться то вместо этого, QTKit попытается использовать свою ограниченную поддержку инициализации на приоритетных фоновых потоках; для некоторых типов среды это перестанет работать. В случаях отказа может приложение, принял решение повторить работу без установки QTMovieOpenAsyncRequiredAttribute
, или это может принять решение сообщить об отказе пользователю как надлежащем.
Вы выполняете это в своем коде путем передачи QTMovieOpenAsyncRequiredAttribute
и установка этого точно таким же образом, что Вы устанавливаете другой атрибут (QTMovieOpenForPlaybackAttribute
, как показано в Перечислении 3-2), т.е. путем помещения его в словарь атрибутов.
- (id)initWithAttributes:(NSDictionary *)attributes |
error:(NSError **)errorPtr; |
Вы используете этот фрагмент кода для передачи этого ключа.
QTMovie *movie = nil; |
NSError *error = nil; |
NSNumber *num = [NSNumber numberWithBool:YES]; |
NSDictionary *attributes = |
[NSDictionary dictionaryWithObjectsAndKeys: |
fileName, QTMovieFileNameAttribute, |
num, QTMovieLoopsAttribute, |
num, QTMovieOpenAsyncRequiredAttribute, |
nil]; |
movie = [[QTMovie alloc] initWithAttributes:attributes |
error:&error]; |
Путем установки QTMovieOpenAsyncRequiredAttribute
припишите NSNumber
обертывание YES
, Вы указываете что все операции, необходимые, чтобы открыть файл ролика (или другой контейнер) и создать допустимое QTMovie
объект должен произойти асинхронно. Это означает что методы +movieWithAttributes:error:
и -initWithAttributes:error:
должен возвратиться почти сразу, выполнив любые длинные операции на другом потоке.
Если Вы требуете асинхронного открытия, но QTMovie
неспособно соблюдать Ваш запрос, тогда методы +movieWithAttributes:error:
и -initWithAttributes:error:
возвратитесь с NSError
. Обратите внимание на то, что, если Вы даете QTMovie
ссылка на допустимые данные фильма с QTMovieOpenAsyncRequiredAttribute
, Вы будете всегда возвращать допустимое, неноль QTMovie
, даже если те данные не могут быть загружены асинхронно. Единственное время Вы будете когда-либо возвращать ноль, - то, если существует проблема с Вашими параметрами или с определением местоположения данных.
Протесты
Ваше приложение должно контролировать состояние загрузки фильма для определения прогресса тех операций. Фактически, если QTMovie
объект инициализируется с openAsyncOK=NO
, или использование autoplay
или просто позволяет QTMovieView
пользовательский интерфейс для управления игрой приложение должно контролировать состояние загрузки, как обсуждено в следующем разделе Monitoring Load State.
Открытие файла ролика и инициализация a QTMovie
объект для того файла может потребовать, чтобы значительное количество времени, возможно преобразовало данные в файле от одного формата до другого. Путем установки этого атрибута в NSNumber
обертывание значения YES
, Вы предоставляете QTMovie
разрешение возвратить неноль QTMovie
идентификатор к Вашему приложению сразу и затем продолжать обрабатывать данные файла внутренне. Если фильм открыт асинхронно, необходимо контролировать, загрузка фильма утверждают и гарантируют, что это достигло надлежащего порога прежде, чем попытаться выполнить определенные операции на фильме. Например, Вы не можете экспортировать или скопировать a QTMovie
объект до его состояния загрузки достиг QTMovieLoadStateComplete
.
Путем выполнения этого действия Вы дали разрешение QTKit породить фоновый поток для открытия медиаресурса. В то время как это происходит в фоновом режиме, Ваш основной поток не будет блокирован открывающими фильм операциями. Но как Вы знаете, что фильм готов играть, особенно если это - очень большой файл? Ответ: необходимо контролировать состояния загрузки. Это вызвано тем, что соответствующие данные фильма могут не быть там, и это может не быть значимо для выяснения у фильма его различные свойства.
Состояния загрузки важны для понимания в работе с QTKit в QuickTime X. Они обсуждены подробно в следующем разделе Monitoring Load State.
Контроль состояния загрузки
Поскольку открытие файла ролика или URL может включить чтение и обработку больших сумм данных фильма, QTKit может занять ненезначительное количество времени для создания a QTMovie
объект, готовый к проверке и воспроизведению. Соответственно, необходимо обратить внимание на состояния загрузки фильма при открытии файла ролика или URL. Это определенные состояния загрузки фильма:
enum { |
QTMovieLoadStateError = -1L, // an error occurred while loading the movie |
QTMovieLoadStateLoading = 1000, // the movie is loading |
QTMovieLoadStateLoaded = 2000, // the movie atom has loaded; it's safe to query movie properties |
QTMovieLoadStatePlayable = 10000, // the movie has loaded enough media data to begin playing |
QTMovieLoadStatePlaythroughOK = 20000, //the movie has loaded enough media data to play through to end |
QTMovieLoadStateComplete = 100000L // the movie has loaded completely |
}; |
typedef NSInteger QTMovieLoadState; |
Состояния загрузки фильма просто указаны как целые числа, увеличивающиеся с — 1 - 100 000. — 1 указывает, что что-то произошло, который возвращает ошибку; другие состояния указывают загрузку. Для наблюдения за этими состояниями загрузки Вы регистрируетесь для QTMovieDidChangeLoadStateNotification
.
movie = [[QTMovie alloc] initWithAttributes:attributes |
error:&error]; |
[[NSNotificationCenter defaultCenter] |
addObserver:self |
selector:@selector(loadStateChanged:) |
name:QTMovieLoadStateDidChangeNotification |
object:movie]; |
Вы выпущены QTMovieDidChangeLoadStateNotification
уведомление, когда QTKit обнаруживает, что состояние загрузки изменилось от одного уровня до другого. Если Вы добираетесь до QTMovieLoadedStateLoaded
возвращенный, это означает, что теперь можно запросить объект для его различных свойств, таких как его продолжительность, естественный размер, объем, и т.д. Если Вы добираетесь QTMovieLoadStatePlaythroughOK
, это означает, что можно продолжать играть непрерывный до конца. Для обработки изменения состояния загрузки, с помощью метода, вызванного уведомлением, Вы делаете это:
- (void)loadStateChanged:(NSNotification *)notification |
{ |
QTMovie *movie = [notification object]; |
if (movie) { |
[self handleLoadStateChanged:movie]; |
} |
} |
- (void)handleLoadStateChanged:(QTMovie *)movie |
{ |
NSInteger loadState = [[movie |
attributeForKey:QTMovieLoadStateAttribute] longValue]; |
if (loadState == QTMovieLoadStateError) { |
/* an error occurred; handle it */ |
... |
} |
} |
Обратите внимание на то, что, как только Вы вызываете initWithAttributes:error
, Вы могли бы возвратить фильм, полностью загружающийся, когда Вы не получите уведомление изменения состояния загрузки. После вызова initWithAttributes:error
, обязательно проверьте состояние загрузки.
movie = [[QTMovie alloc] initWithAttributes:attributes |
error:&error]; |
[self handleLoadStateChanged:movie]; |
[[NSNotificationCenter defaultCenter] |
addObserver:self |
selector:@selector(loadStateChanged:) |
name:QTMovieLoadStateDidChangeNotification |
object:movie]; |
Не все медиа-файлы могут быть загружены асинхронно, таким образом, OS X v10.6 предоставляет Вам новое QTMovieLoadStateErrorAttribute
атрибут.
Можно проверить, что ошибка возвратилась, и затем повторите открытие медиа-файла на основном потоке, в зависимости от потребностей воспроизведения приложения.
- (void)handleLoadStateChanged:(QTMovie *)movie |
{ |
NSInteger loadState = [[movie |
attributeForKey:QTMovieLoadStateAttribute] longValue]; |
if (loadState == QTMovieLoadStateError) { |
NSError *error = [movie attributeForKey: |
QTMovieLoadStateErrorAttribute]; |
NSString *domain = [error domain]; |
NSInteger code = [error code]; |
if (/* not file not found or invalid URL ... */) { |
/* retry without QTMovieOpenAsyncRequiredAttribute */ |
} |
... |
} |
MyMediaPlayer
пример кода (показанный в Перечислении 1-1) иллюстрирует, как использовать и контролировать различные состояния загрузки в QuickTime X и OS X v10.6. Этот блок кода (полностью прокомментировал здесь) показывает метод, который можно использовать для выполнения той определенной задачи.
Перечисление 1-1 код MyMediaPlayer, контролирующий состояния загрузки
-(void)handleLoadStateChanged:(QTMovie *)movie |
{ |
NSInteger loadState = [[movie attributeForKey:QTMovieLoadStateAttribute] longValue]; |
if (loadState == QTMovieLoadStateError) { |
/* what goes here is app-specific */ |
/* you can query QTMovieLoadStateErrorAttribute to get the error code, if it matters */ |
/* for example: |
/* NSError *err = [movie attributeForKey:QTMovieLoadStateErrorAttribute]; */ |
/* you might also need to undo some operations done in the other state handlers */ |
} |
if ((loadState >= QTMovieLoadStateLoaded) && ([mMovieView movie] == nil)) { |
/* can query properties here */ |
/* for instance, if you need to size a QTMovieView based on the movie's natural size, you can do so now */ |
/* you can also put the movie into a view now, even though no media data might yet be available and hence |
nothing will be drawn into the view */ |
[mMovieView setMovie:movie]; |
} |
if ((loadState >= QTMovieLoadStatePlayable) && ([movie rate] == 0.0f)) { |
/* can start movie playing here */ |
} |
} |
-(void)movieLoadStateChanged:(NSNotification *)notification |
{ |
QTMovie *movie = (QTMovie *)[notification object]; |
if (movie) { |
[self handleLoadStateChanged:movie]; |
} |
} |
Обратите внимание на то, что изменения состояния загрузки могут произойти при переходе от любого данного состояния загрузки до любого другого состояния загрузки. Т.е. можно перейти от текущего состояния загрузки (независимо от того, что это, оказывается,) к почти любому другому состоянию загрузки, даже к QTMovieLoadStateError
. Необходимо также отметить, что любое данное приложение может принять решение обработать любое подмножество определенных состояний загрузки. Т.е. одно приложение могло бы заботиться о QTMovieLoadStateLoaded
но другой мог бы заботиться только о QTMovieLoadStatePlayable
. Важно понять, что изменения состояния загрузки не обязательно проходят через все определенные этапы. Первое состояние загрузки когда-либо сообщало, мог бы быть QTMovieLoadStateComplete
. Следует иметь в виду, что никогда не гарантируется, что приложение будет когда-либо получать любое состояние удельной нагрузки при запросах QTMovieLoadStateAttribute
.
Теперь, если Ваше приложение просто хочет играть носители, не имея дело с проблемами состояния загрузки, можно использовать метод на QTMovie
это не требует, чтобы Вы контролировали всю динамику состояния загрузки. Можно использовать autoplay
метод для контроля динамики загрузки для Вас.
// put a movie in a view and play it when ready |
movie = [[QTMovie alloc] initWithAttributes:attributes |
error:NULL]; |
[movieView setMovie:movie]; |
[movie autoplay]; |
Объектное представление QTMovieView
A QTMovieView
подкласс NSView
это может использоваться, чтобы вывести на экран и управлять фильмами в формате QuickTime. Вы обычно используете a QTMovieView
в сочетании с a QTMovie
объект, предоставляющий выводимый на экран фильм.
Вывести на экран a QTMovie
объект в окне, Вы используете QTMovieView
класс.
A QTMovieView
также операции редактирования поддержек на фильме. Это также обеспечивает дополнительную панель контроллера, позволяющую пользователям непосредственно управлять воспроизведением фильма. Если Вы хотите обеспечить свои собственные средства управления вместо этого, QTMovieView
класс обеспечивает полное дополнение методов для управления воспроизведением, таким как игра, пауза и остановка. Фильм может быть помещен в произвольном ограничительном прямоугольнике в системе координат представления, и остаток от представления может быть заполнен цветом заливки. Контроллер фильма, если это видимо, может также быть помещен в произвольном ограничительном прямоугольнике в системе координат представления.
QTMovieView в интерфейсном разработчике
A QTMovieView
объект (показанный на рисунке 1-5) предоставлен в Интерфейсном Разработчике, позволяющем Вам просто перетащить объект фильма в формате QuickTime, вместе с контроллером для воспроизведения, в окно, и затем установить атрибуты для фильма.
QTTrack, QTMedia и объектное представление QTDataReference
Фильм в формате QuickTime состоит из одной или более дорожек, каждая из которых связана с синглом носители. Точно так же a QTMovie
связан с одним или более объектами типа QTTrack
, каждый из которых связан с синглом QTMedia
объект. QTTrack
и QTMedia
классы обеспечивают много методов для работы на дорожках QuickTime и носителях, но только при использовании QuickTime 7.
QTTrack
класс представляет дорожку QuickTime (типа Track
). QTTrack
объекты связаны с QTMovie
объекты и методы поддержки для получения и установки свойств дорожки.
QTMedia
класс представляет QuickTime носители (типа Media
). QTMedia
объекты связаны с QTTrack
объекты и методы поддержки для получения и установки свойств носителей, но только при использовании QuickTime 7.
A QTDataReference
объект является представлением ссылки на данные QuickTime, использующейся для указания расположения фильма или его данных носителей. Можно создать QTDataReference
объекты, относящиеся к данным, хранившим в файлах, получили доступ к именам файлов использования, или URLs, или в памяти получил доступ к дескрипторам использования, указателям, или NSData
объекты.
Объектное представление QTMovieLayer
Как подкласс CALayer
, QTMovieLayer
объект предоставляет поддержку для Базовых Слоев анимации. Можно использовать этот объект вовлечь содержание фильма на уровень, представляя a QTMovie
в иерархии слоев. Используя layerWithMovie:
метод, например, Вы создаете автовыпущенный QTMovieLayer
связанный с указанным объектом. Можно тогда изменить характеристики по умолчанию — т.е. фильм начинает играть сразу на уровне 1.0 с его начала — путем установки свойств фильма или свойств слоя. (Для получения дополнительной информации о том, как использовать в своих интересах QTKit и Базовые Слои анимации в Вашем приложении, обратитесь к разделу Working With Core Animation Layers).
Структуры для контакта со временем
В дополнение к богатому набору классов и методов, платформа QTKit также обеспечивает много функций для работы с QTTime
и QTTimeRange
структуры. Они определяют QTTime
и QTTimeRange
структуры для представления определенных времен и времени располагаются в фильме или дорожке. Эти структуры:
QTTime
. Определяет значение и масштаб времени времени.typedef struct {
long long timeValue;
long timeScale;
long flags;
} QTTime;
QTTime
простая структура данных, состоящая из трех полей. В этом случае,timeScale
поле является числом модулей в секунду, Вы работаете с при контакте со временем.timeValue
поле является числом тех модулей в продолжительности.QTTimeRange
. Определяет диапазон времени и используется, например, для указания активного сегмента фильма или дорожки.typedef struct {
QTTime time;
QTTime duration;
} QTTimeRange;
QTTimeRange
также простая структура данных, состоящая из двух полей. В этом случае,time
поле указывает время начала диапазона иduration
поле указывает продолжительность диапазона.
Существует также много функций, которые Вы используете имея дело со временем. Они включают:
QTTime QTMakeTime (long long timeValue, long timeScale);
QTTime QTTimeIncrement (QTTime time, QTime increment);
QTTime QTMakeTimeScaled (QTTime time, long timeScale);
QTTimeRange QTMakeTimeRange (QTTime time, QTTime duration);
Вы используете эти функции для создания a QTTime
структура, получите и установите времена, выдержите сравнение QTTime
структуры, добавляют и вычитают времена и получают описание. Кроме того, другие функции также доступны для создания a QTTimeRange
структура, запрашивая диапазоны времени, создавая объединения и пересечения диапазонов времени, и получая описание.
В QTKit важно понять что основной объект для того, чтобы представить и проигрывать фильмы, QTMovie
, не полагается на единственный масштаб времени, так как времена все полностью выражены как QTTime
структуры. Для указания момента времени в системе координат времени, например, Вы используете a QTTime
структура. В QTKit Вы не должны думать о фильме или дорожке как наличие внутреннего масштаба времени, или что масштаб времени должен иметь некоторое значение на основе формата носителей в дорожке.
Контакт с потокобезопасностью
Интенсивные действия процессора могут задержать скорость отклика Вашего приложения путем блокирования пользовательского интерфейса или путем ограничения числа задач, которые могут быть выполнены одновременно. Как следствие пользовательский опыт страдает.
QTKit обеспечивает много методов для контакта с и управления QTMovie
объекты на фоновых потоках. Путем перемещения интенсивных процессором задач в фоновые потоки Вы высвобождаете основной поток и таким образом улучшаете скорость, скорость отклика и общую производительность Вашего приложения.
Элементы пользовательского интерфейса должны остаться на основном потоке, как бы то ни было. Также необходимо избежать создавать или представлять диалоговое окно или окно на фоновом потоке. Кроме того, Ваше приложение не должно позволять больше чем одному потоку работать над тем же QTMovie
объект в то же время, если Вы хотите гарантировать потокобезопасность. Как вызывающая сторона, это - Ваша ответственность гарантировать это дело обстоит так.
QTMovie
класс имеет методы класса и методы экземпляра, поддерживающие потокобезопасность, показанную в Таблице 1-4. Эти методы позволяют Вам уведомлять платформу, когда она будет использовать или закончена с помощью объектов QTKit на фоновых потоках. Когда Вы хотите использовать a, это включает возможность сообщить QTKit QTMovie
экземпляр на фоновом потоке, когда Вы присоединяете или отсоединяете a QTMovie
экземпляр от текущего потока. Обратите внимание на то, что эти методы могут быть вложены, несмотря на то, что +enter...
и +exit...
методы должны быть сбалансированы, как описано в поле задач в Таблице 1-4.
Методы для потокобезопасности | Задачи |
---|---|
| Выполняет любую QTKit-специфичную инициализацию для фонового потока. Необходимо соединить вызов к этому методу с последующим вызовом к |
| Выполняет любую QTKit-специфичную инициализацию для фонового потока, позволяя неориентированные на многопотоковое исполнение компоненты. Необходимо соединить вызов к этому методу с последующим вызовом к |
| Выполняет любое QTKit-специфичное завершение работы для фонового потока. Необходимо соединить вызов к этому методу с предыдущим вызовом к |
| Присоединения a |
| Отсоединения a |
Прежде чем любые операции QTKit могут быть выполнены на вторичном потоке, также +enterQTKitOnThread
или +enterQTKitOnThreadDisablingThreadSafetyProtection
должен быть вызван, и +exitQTKitOnThread
должен быть вызван прежде, чем выйти из потока. A QTMovie
объект может быть перемещен от одного потока до другого первым вызовом -detachFromCurrentThread
на первом потоке и затем -attachToCurrentThread
на втором потоке.
Рекомендуемые процедуры для работы с фоновыми потоками
Следуйте этим инструкциям для работы с QTMovie
объекты на фоновых потоках:
Выделите все
QTMovie
объекты на основном потоке.Воздействовать на a
QTMovie
на различном потоке отсоедините его от текущего потока. Вы используете-detachFromCurrentThread
метод экземпляра для фильма в формате QuickTime связался с этимQTMovie
как получено сquickTimeMovie:
метод). Тогда Вы присоединяете его к различному потоку с помощью-attachToCurrentThread
метод.Вызвать
+enterQTKitOnThread
перед созданием любых других запросов QTKit к вторичному потоку.Вызвать
+exitQTKitOnThread
прежде, чем выйти из потока Вы сделали QTKit, обращается.Будьте подготовлены обработать ошибки от любого из тех вызовов; некоторые фильмы не могут быть перемещены во вторичные потоки (это специфично для кодека).
Установка объекта QTMovie на основном потоке
Следующий фрагмент кода (Перечисление 1-2) демонстрирует, как установить a QTMovie
объект на основном потоке и как сделать экспорт на фоновом потоке.
Перечисление 1-2 , Настраивающее фильм на основном потоке и экспортирующее на фоновом потоке
- (void)doExportWithFile:(NSString *)inFile |
{ |
QTMovie *movie = nil; |
NSDictionary *attrs = [NSDictionary dictionaryWithObjectsAndKeys:(id)inFile, QTMovieFileNameAttribute, |
[NSNumber numberWithBool:NO], QTMovieOpenAsyncOKAttribute, nil]; |
movie = [QTMovie movieWithAttributes:attrs error:nil]; |
[movie detachFromCurrentThread]; |
[NSThread detachNewThreadSelector:@selector(doExportOnThread:) |
toTarget:self |
withObject:movie]; |
} |
// exporting on a background thread |
- (void)doExportOnThread:(QTMovie *)movie |
{ |
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; |
NSDictionary *attrs = [NSDictionary dictionaryWithObjectsAndKeys: |
[NSNumber numberWithBool:YES], QTMovieExport, |
[NSNumber numberWithLong:'M4V '], QTMovieExportType, nil]; |
[QTMovie enterQTKitOnThread]; |
[movie attachToCurrentThread]; |
// do export |
[movie writeToFile:@"/Users/Shared/iPodMovie.m4v" withAttributes:attrs]; |
[movie detachFromCurrentThread]; |
[QTMovie exitQTKitOnThread]; |
[pool release]; |
} |
Используя QTKit для воспроизведения носителей
В этом разделе рассматриваются некоторые методы кодирования, которые можно использовать для построения различных приложений Какао, с помощью классов и методов в QTKit. Основное внимание идет, как создать приложение медиапроигрывателя, включающее редактирование. Простые задачи, такие как открытие, сохранение и создание пустого файла ролика также объяснены. Последний раздел описывает более усовершенствованные методы программирования, которые можно использовать для интеграции Базового Изображения и Базовых методов Анимации для обработки изображений и применения фильтров к воспроизведению фильма.
Воспроизведение и редактирование
Выполните эти шаги для создавания простого приложения медиапроигрывателя QTKit, обрабатывающего воспроизведение и редактирование типов среды, которые QuickTime поддерживает, такой как .mov
, .mp4
и аудиофайлы.
Запустите XCode и создайте Документ какао базируемый проект.
Импортируйте
QTKit.h
заголовочные файлы в Ваш проектОбъявите сохраненную ссылку на a
QTMovie
экземпляр, с помощью @property директивы.@property(retain) QTMovie *movie;
В этой точке, коде в Вашем
MyDocument.h
файл должен быть похожим на это.#import <Cocoa/Cocoa.h>
#import <QTKit/QTKit.h>
@interface MyDocument : NSDocument
@property(retain) QTMovie *movie;
@end
Сохраните файл.
В реализации (.m) файл Вашего проекта XCode, набор содержание Вашего документа фильма. Для начала Вы открываетесь
MyDocument.m
файл реализации.Установите расположение URL для получения содержания Вашего документа фильма и используйте
setMovie:
метод для установки фильма документа, чтобы бытьQTMovie
возразите, что Вы просто создали.Прокрутите вниз к блоку кода, включающему
- (BOOL)readFromData:
метод.Замените тот блок кода следующим кодом на следующем шаге.
- (BOOL)readFromURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError
{
QTMovie *newMovie = [QTMovie movieWithURL:absoluteURL error:outError];
if (newMovie) {
[self setMovie:newMovie];
}
return (newMovie != nil);
}
Добавьте
@synthesize
директива для генерации методов получателя и методов установщика Вам нужно и завершать Вашу реализацию.@synthesize movie;
Освободите память.
- (void)dealloc
{
QTMovie *movie = [self movie];
[self setMovie:nil];
[super dealloc];
}
Сохраните свой файл.
Разработчик интерфейса запуска 3.2.
Откройтесь
MyDocument.xib
файл.Из-за интеграции между Xcode 3.2 и Интерфейсным Разработчиком 3.2, методы Вы объявили в Вашем
MyDocument.h
файл был сохранен в синхронизации с Интерфейсным Разработчиком 3.2.В Интерфейсном Разработчике 3.2, выберите Tools> Library для открытия библиотеки сменных объектов.
Прокрутите вниз, пока Вы не найдете фильм в формате QuickTime объект Представления в библиотеке объектов, как показано на рисунке 1-5.
QTMovieView
объект предоставляет Вам экземпляр подкласса представления для отображения фильмов в формате QuickTime, предоставляющихсяQTMovie
объекты в Вашем проекте.Выберите текстовый объект «Your document contents here» в окне и нажмите Delete.
Перетащите
QTMovieView
объект от библиотеки в Ваше окно и изменяет размеры объекта соответствовать окну.Обратите внимание на то, что объект комбинирует и представление и управление для воспроизведения носителей.
Измените атрибуты представления фильма, показанные на рисунке 1-6.
Выберите Tools> Inspector.
В панели Inspector выберите значок Movie View Attributes, появляющийся как первый значок в строке наверху панели.
Удостоверьтесь, что проверяется флажок Show Controller.
Установите автокалибровку для
QTMovieView
объект в Размере Представления Фильма, как показано на рисунке 1-7.Подключите объект представления фильма к фильму в формате QuickTime, который будет выведен на экран. Вы делаете это путем определения привязки Какао:
В
QTMovieView
Инспектор (выбираютQTMovieView
и откройтесь «Сдвигом Команды, я», в случае необходимости), перейдите к панели Bindings. (Можно также получить доступ к нему путем выбора Tools> Bindings Panel.)В разделе Parameters панели Bindings откройте параметр фильма путем щелчка по треугольнику раскрытия рядом с ним.
В “Связывают с”: выпадающее меню, выберите File's Owner.
В Ключевом Поле трактов Модели введите текст
movie
, показанный на рисунке 1-8.Проверьте, “Связывают с”: флажок для сохранения настроек.
В этом случае, путем указания привязки на рисунке 1-8, Вы дали Какао команду по существу создавать соединение во время выполнения между объектом, загружающим пользовательский интерфейс — т.е. объект Владельца Файла — и
QTMovieView
объект. Это соединение обеспечиваетQTMovieView
объект со ссылкой на фильм в формате QuickTime, который должен быть открыт и выведен на экран.Сохраните Ваш
MyDocument.xib
файл в Интерфейсном Разработчике и возвращается к Вашему проекту XCode.После завершения этой последовательности шагов Вы просто создаете и работаете
MyMediaPlayer
проект в XCode. Когда проигрыватель запускается, можно открыть и играть любой фильм в формате QuickTime по Вашему выбору. Просто найдите a.mov
файл и запуск фильм из меню File> Open в Вашем приложении медиапроигрывателя.
Методы редактирования носителей
QTKit обеспечивает четыре QTMovieView
методы для редактирования фильмов. Это
add:
. Метод действия, позволяющий Вам добавить содержание буфера обмена к фильму в текущее время фильма.addScaled:
. Метод действия, позволяющий Вам добавить содержание буфера обмена к фильму, масштабируемому для вписывания в текущий выбор фильма.replace:
. Метод действия, заменяющий текущий выбор фильма содержанием буфера обмена. Если нет никакого выбора, содержание буфера обмена заменяет весь фильм.trim:
. Метод действия, позволяющий Вам обрезать фильм к текущему выбору фильма. Если нет никакого выбора, текущий кадр сохраняется, и остаток от фильма удален.
Чтобы позволить редактировать возможности в Вашем демонстрационном приложении медиапроигрывателя, Вы добавляете эту строку кода в блоке кода, начинающемся readFromURL:ofType:error:
метод.
[newMovie setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute]; |
Полный блок кода для поддержки редактирования показан следующим образом:
- (BOOL)readFromURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError |
{ |
QTMovie *newMovie = [QTMovie movieWithURL:absoluteURL error:outError]; |
if (newMovie) { |
[newMovie setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute]; |
[self setMovie:newMovie]; |
} |
return (newMovie != nil); |
} |
Путем вызова setAttribute:forKey:
метод и использование QTMovie
доступный для редактирования атрибут, Вы отметили фильм как доступный для редактирования. Это означает, что любые операции редактирования, которые Вы выбираете, такой, как сокращено, копия и вставка, могут быть выполнены на самом фильме. Значение для этого ключа имеет тип NSNumber
, интерпретируемый как булево значение. Если фильм может быть отредактирован, значение YES
. Вы используете атрибуты, чтобы указать и выполнить большое количество обрабатывающих носители задач (некоторые из которых показаны в Таблице 1-3).
readFromURL:ofType:error:
метод позволяет Вам установить содержание документа путем чтения из файла или пакета файла, указанного типа, расположенного URL.
Сохранение фильма
Для сохранения фильма Вы делаете это:
- (IBAction)saveDocument:(id)sender |
{ |
[[movieView movie] updateMovieFile]; |
[self updateChangeCount:NSChangeCleared]; |
} |
Создание пустого файла ролика
Чтобы создать пустой файл ролика и поместить фильм в файл, сделайте это:
QTMovie *movie = nil; |
NSImage *image = nil; |
NSDictionary *attrs = nil; |
movie = [[QTMovie alloc] initToWritableFile:fileName error:NULL]; |
image = [NSImage imageNamed:@"myImage"]; |
attrs = [NSDictionary dictionaryWithObject:@"jpeg" |
forKey:QTAddImageCodecType]; |
[movie addImage:image |
forDuration:QTMakeTime(3, 1) |
withAttributes:attrs]; |
[movie updateMovieFile]; |
Получение изображения кадра фильма
Для получения изображения для кадра фильма в определенное время Вы просто используете frameImageAtTime:withAttributes:error:
метод, принимающий словарь атрибутов..
- (void *)frameImageAtTime:(QTTime)time |
withAttributes:(NSDictionary *)attributes |
error:(NSError **)errorPtr; |
Словарь атрибутов может содержать следующие ключи:
QTMovieFrameImageSize |
QTMovieFrameImageType |
QTMovieFrameImageRepresentationsType |
QTMovieFrameImageOpenGLContext |
QTMovieFrameImagePixelFormat |
QTMovieFrameImageDeinterlaceFields |
QTMovieFrameImageHighQuality |
QTMovieFrameImageSingleField |
Обратитесь к QTMovie.h
и Ссылка Платформы QTKit для получения дополнительной информации об этих атрибутах.
Для QTMovieFrameImageType
атрибут, некоторые возможные значения
QTMovieFrameImageTypeNSImage |
QTMovieFrameImageTypeCGImageRef |
QTMovieFrameImageTypeCIImage |
QTMovieFrameImageTypeCVPixelBufferRef |
QTMovieFrameImageTypeCVOpenGLTextureRef |
Если Вы хотите получить a CGImage
для кадра фильма в установленный срок, Вы просите определенный тип изображения (NSImage
значение по умолчанию, и представление по умолчанию NSBitmapImageRep
):
NSDictionary *dict = [NSDictionary |
dictionaryWithObject:QTMovieFrameImageTypeCGImageRef |
forKey:QTMovieFrameImageType]; |
QTTime time = [movie currentTime]; |
CGImageRef theImage = (CGImageRef)[movie frameImageAtTime:time |
withAttributes:dict error:NULL]; |
Применение базовых фильтров изображения к фильму
QTKit разработан для работы со многой другой графикой OS X и технологиями носителей, как обсуждено в Графике и Уровне Носителей в OS X. Эти технологии носителей, включающие Core Audio, Базовую Анимацию, 2D Кварц, Открывают GL и Core Image, предоставляют Вам мощный набор инструментов для разработки мультимедийного приложения.
Например, что, если Вы использовали QTKit для применения Базового фильтра Изображения к воспроизведению фильма в формате QuickTime? Эффекты применения того фильтра могли быть довольно ошеломляющими и визуально захватывающими.
Базовое Изображение является платформой Objective C, как QTKit, но прежде всего с API для обработки изображений. Это прибывает связанное длинным списком фильтров, которые Ваше приложение может использовать для выполнения таких задач как:
Улучшение и изменение неподвижных изображений
Обработка фотографий RAW
Генерация массива эффектов на живое воспроизведение видео
MyMovieFilter
, то, которое доступно в OS X v10.5, является приложением примера кода, демонстрирующим, как проигрывать фильм в поддержанный уровнем QTMovieView
и примените Базовый фильтр Изображения, в то время как играет фильм.
Вы выполняете эти шаги для построения MyMovieFilter
приложение.
Создайте Документ какао базируемый проект.
В Вашем файле объявления создайте экземпляр
QTMovie
возразите и выход для aQTMovieView
.@interface MyDocument : NSDocument
{
QTMovie *mMovie;
IBOutlet QTMovieView *mMovieView;
Объявите переменную экземпляра
mCIFilter
это указывает на aCIFilter
объект.CIFilter *mCIFilter;
Объявите переменную экземпляра
mVideoPreviewFilter
это указывает на объект типаNSString
.NSString *mVideoPreviewFilter;
}
В Вашем файле реализации объявите
-availableFilters
метод экземпляра@"VideoPreviewFilter"
свойство, возвращающеесяNSArray
возвращаемое значение. Это - массив CIFilters, который Вы используете для отображения всплывающего меню Фильтра.- (NSArray *)availableFilters
{
return [NSArray arrayWithObjects:
@"CIKaleidoscope",
@"CIGaussianBlur",
@"CIZoomBlur",
@"CIColorInvert",
@"CISepiaTone",
@"CIBumpDistortion",
@"CICircularWrap",
@"CIHoleDistortion",
@"CITorusLensDistortion",
@"CITwirlDistortion",
@"CIVortexDistortion",
@"CICMYKHalftone",
@"CIColorPosterize",
@"CIDotScreen",
@"CIHatchedScreen",
@"CIBloom",
@"CICrystallize",
@"CIEdges",
@"CIEdgeWork",
@"CIGloom",
@"CIPixellate",
nil];
}
Вы связываете метод со всплывающим меню в Интерфейсном Разработчике, как показано на рисунке 1-9.
Возвратитесь
NSString
объект связался сmVideoPreviewFilter
переменная экземпляра. Это - метод получателя, возвращающий текущий выбор фильтра.- (NSString *)videoPreviewFilter
{
return mVideoPreviewFilter;
}
Обратите внимание на то, что в Базовом Изображении API, фильтры указаны как строки, так, чтобы идентификаторы строки использовались в качестве ключей для фильтрации имен.
В Интерфейсном Разработчике Вы включаете Базовый рендеринг Анимации путем простой установки флажка, позволяющего Вам применить Базовый Слой анимации к Вашему
QTMovieView
объект. Это связывает его сvideoPreviewFilter
.Наконец, Вы добавляете эту строку кода к Вашему
setVideoPreviewFilter
блок метода в Вашем файле реализации:[[mMovieView layer] setFilters:[NSArray arrayWithObject:mCIFilter]];
Выбор поддержки уровня
У Вас есть a QTMovieView
объект, выбирающий поддержку уровня. Это означает это вместо стандарта NSView
поддерживая модель, это использует Базовую Анимацию, чтобы сделать ее рендеринг.
Поскольку QTMovieView
возразите теперь использует уровень, представляя видео в уровне, оно имеет все службы, что уровни названы на, включая возможность применить Базовый фильтр Изображения к тому уровню. Та служба является частью CALayer
интерфейс. Если Вы смотрите на CALayer.h
заголовочный файл, Вы находите свойство для применения a CIFilter
к нему.
В этом случае Вы взяли Ваш QTMovieView
и сказал, что это хочет быть уровнем теперь, таким образом, он ведет себя как любой Базовый Слой анимации. Тогда Вы указали a CIFilter
, который Вы хотели бы, чтобы Вы применились к этому уровню.
Работа с базовыми слоями анимации
Технически, поддержанные уровнем представления используют Базовые Слои анимации в качестве своего запоминающего устройства. Включение поддержки уровня для представления (и его потомки) в этом определенном примере кода выполняется через Интерфейсного Разработчика путем установки флажка Wants Core Animation Layer на Представлении Фильма в инспекторе Эффектов Представления Фильма Пэнеле (показанный на рисунке 1-10).
Когда поддержка уровня включена для представления, представление и все его подпредставления, в действительности, зеркально отражаются Базовым деревом Слоя анимации. Представление и его подпредставления все еще принимают участие в цепочке респондента, все еще получают события и действие как любое другое представление. Однако при перерисовке потребностей, которые будут сделаны, и содержание не изменилось, дерево рендеринга обрабатывает перерисовку, а не приложение.
Кроме обеспечения кэшируемой перерисовки, поддержанные уровнем представления представляют много усовершенствованных визуальных свойств Базовых свойств Слоя анимации, включая:
Управление непрозрачностью представления
Дополнительная тень, указанное использование
NSShadow
объектСоставляется дополнительный массив Базовых фильтров Изображения, применяющихся к содержанию позади представления перед его содержанием,
Базовый фильтр Изображения раньше составлял содержание представления с фоном
Дополнительный массив Базовых фильтров Изображения, применяющихся к содержанию представления и его подпредставлений
Особенно, эта выборка использует в своих интересах усовершенствованный Базовый Слой анимации визуальные свойства и применяет Базовый фильтр Изображения к содержанию QTMovieView
достигнуть холодного визуального эффекта.
При запуске приложения окно документа автоматически выведено на экран, показав предварительно выобранный фильм. Вы нажимаете кнопку воспроизведения, и фильм начинает играть. Вы нажимаете кнопку Pause, и фильм остановится. Всплывающее меню предоставлено для разрешения, Вы для выбора Core Image просачиваетесь для применения к фильму, показанному на рисунке 1-11. После запуска значение по умолчанию фильтра не установлено ни в Какое Значение.
Вы тогда выбираете фильтр по Вашему выбору, в то время как фильм играет или остановился, и фильтр будет автоматически применен к фильму. В то время как фильм играет, можно даже изменить фильтр.
Интеграция мультимедиа в OS X
QTKit может использоваться в качестве предпочтительного механизма аудио/воспроизведения видео для работы с и создавания приложений с другой графикой и платформами обработки изображений в OS X.
Например, Вы могли использовать Базовую Анимацию с кратным числом QTMovieLayer
объекты для видео, составляющего композит в сочетании с воспроизведением в QTKit. Путем применения Базового Изображения фильтрует к воспроизведению видео носителей, можно использовать в своих интересах Базовую поддерживающую слой анимации поддержку, как продемонстрировано в Применении Базовых Фильтров Изображения к Фильму. Используя инструменты и графические основы, служившие в OS X, Вы могли создать богатые носителями, иммерсивные среды, такие как мультимедийный киоск, изображенный на рисунке 1-12.
В той среде у пользователя есть возможность взаимодействовать с мультимедийным контентом и чувствовать что содержание от многих различных углов и размерностей. В конечном счете опыт становится иммерсивным для пользователя, в котором возможно взаимодействовать на многократных уровнях с содержанием представления.