Архитектура 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, чтобы обработать основную, а также усовершенствованную работу по дому видео, аудио и обработки носителей изображения, и таким образом сократить код, который необходимо записать в цикле разработки приложений.

  Графика OS X рисунка 1-1 и уровни носителей

Поддерживаемые форматы носителя

QuickTime и QTKit поддерживают широкий диапазон основанных на стандартах форматов, в дополнение к собственным форматам от Apple и других.

Таблица 1-1 перечисляет некоторые из большего количества поддерживающихся форматов общего файла. Для полного списка поддерживаемых форматов обратитесь к странице технической характеристики изделия в http://www .apple.com/quicktime/pro/specs.html.

Таблица 1-1  частичный список форматов носителя и кодеков, поддерживаемых QuickTime и QTKit

Форматы аудио

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, не имея необходимость иметь дело с его врожденной сложностью или низкоуровневыми абстракциями.

Рисунок 1-2  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

Рисунок 1-3  задачи QTKit и возможности

В контексте поддержки потоков операций с линейными носителями 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.

Рисунок 1-4  фильм QTKit, носители и иерархия классов дорожки
The QuickTime Kit framework class hierarchy

Классы для воспроизведения фильма

Существует шесть классов в API QTKit, использующемся прежде всего для рендеринга и воспроизведения фильмов в формате QuickTime. Таблица 1-2 описывает кратко каждый из этих классов и для каких задач они обычно используются.

Таблица 1-2  фильм QTKit, носители и классы дорожки с их связанными задачами

Класс

Описание

Задачи

QTMovie

Объект, представляющий играемый набор данных носителей.

Обычно используемый в сочетании с a QTMovieView объект для воспроизведения. Также может использоваться для других целей, таких как преобразование данных носителей в другой формат.

QTMovieView

Подкласс NSView.

Используемый, чтобы вывести на экран и управлять фильмами в формате QuickTime в сочетании с a QTMovie объект, предоставляющий выводимый на экран фильм. Также операции редактирования поддержек на фильме.

QTTrack

Объект, представляющий упорядочивание и другие характеристики данных носителей в a QTMovie объект, такой как единственный видеотрек или аудиотрек.

Обеспечивает методы для получения и установки свойств дорожки.

QTMedia

Объект, представляющий данные, связанные с a QTTrack объект.

Обеспечивает методы для получения и установки свойств носителей.

QTDataReference

Представление ссылки на данные QuickTime, указывающей расположение фильма в формате QuickTime или некоторых данных носителей.

Используемый для указания расположения фильма или его данных носителей. Можно создать QTDataReference объекты, относящиеся к данным, хранившим в файлах, получили доступ к именам файлов использования, или URLs, или в памяти получил доступ к дескрипторам использования, указателям, или NSData объекты.

QTMovieLayer

Подкласс CALayer, обеспечение то, уровня, в который кадры a QTMovie объект может быть нарисован.

Предназначенный для оказания поддержки для Базовой Анимации.

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 в их исходном или «созданном» размере.

Таблица 1-3  QTMovie приписывает с их связанными задачами

Атрибуты

Задачи

QTMovieDurationAttribute

Продолжительность a QTMovie объект; значение для этого ключа имеет тип NSValue, интерпретируемый как a QTTime структура.

QTMovieCurrentTimeAttribute

Текущее время a QTMovie объект; значение для этого ключа имеет тип NSValue, интерпретируемый как a QTTime структура.

QTMovieEditableAttribute

Доступная для редактирования установка.

QTMovieLoadStateAttribute

Значение состояния загрузки; значение для этого ключа имеет тип NSNumber, интерпретируемый как a long.

QTMovieLoadStateErrorAttribute

Ошибка состояния загрузки a QTMovie объект; значение для этого ключа имеет тип NSError.

QTMovieNaturalSizeAttribute

Естественный размер a QTMovie объект; значение для этого ключа имеет тип NSValue, интерпретируемый как NSSize структура.

QTMovieOpenAsyncOKAttribute

Указывает, может ли файл ролика быть открыт асинхронно, если это возможно, NSNumber обертывание a BOOL.

QTMovieOpenAsyncRequiredAttribute

Указывает ли QTMovie должен быть открыт асинхронно, NSNumber обертывание a BOOL.

QTMovieOpenForPlaybackAttribute

Указывает ли QTMovie будет использоваться только для воспроизведения, NSNumber обертывание a BOOL.

Атрибуты 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, вместе с контроллером для воспроизведения, в окно, и затем установить атрибуты для фильма.

Рисунок 1-5  объект представления фильма

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.

Табличные 1-4  Методы для контакта с потокобезопасностью и их связанными задачами

Методы для потокобезопасности

Задачи

+enterQTKitOnThread

Выполняет любую QTKit-специфичную инициализацию для фонового потока. Необходимо соединить вызов к этому методу с последующим вызовом к +exitQTKitOnThread.

+enterQTKitOnThreadDisablingThreadSafetyProtection

Выполняет любую QTKit-специфичную инициализацию для фонового потока, позволяя неориентированные на многопотоковое исполнение компоненты. Необходимо соединить вызов к этому методу с последующим вызовом к +exitQTKitOnThread.

+exitQTKitOnThread

Выполняет любое QTKit-специфичное завершение работы для фонового потока. Необходимо соединить вызов к этому методу с предыдущим вызовом к +enterQTKitOnThread или +enterQTKitOnThreadDisablingThreadSafetyProtection.

-attachToCurrentThread

Присоединения a QTMovie возразите против текущего потока.

-detachFromCurrentThread

Отсоединения a QTMovie возразите против текущего потока.

Прежде чем любые операции 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 и аудиофайлы.

  1. Запустите XCode и создайте Документ какао базируемый проект.

  2. Импортируйте QTKit.h заголовочные файлы в Ваш проект

  3. Объявите сохраненную ссылку на 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
  4. Сохраните файл.

  5. В реализации (.m) файл Вашего проекта XCode, набор содержание Вашего документа фильма. Для начала Вы открываетесь MyDocument.m файл реализации.

  6. Установите расположение 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);
    }
  7. Добавьте @synthesize директива для генерации методов получателя и методов установщика Вам нужно и завершать Вашу реализацию.

    @synthesize movie;
  8. Освободите память.

    - (void)dealloc
    {
        QTMovie *movie = [self movie];
        [self setMovie:nil];
     
        [super dealloc];
    }
  9. Сохраните свой файл.

  10. Разработчик интерфейса запуска 3.2.

  11. Откройтесь MyDocument.xib файл.

    Из-за интеграции между Xcode 3.2 и Интерфейсным Разработчиком 3.2, методы Вы объявили в Вашем MyDocument.h файл был сохранен в синхронизации с Интерфейсным Разработчиком 3.2.

  12. В Интерфейсном Разработчике 3.2, выберите Tools> Library для открытия библиотеки сменных объектов.

    • Прокрутите вниз, пока Вы не найдете фильм в формате QuickTime объект Представления в библиотеке объектов, как показано на рисунке 1-5.

    QTMovieView объект предоставляет Вам экземпляр подкласса представления для отображения фильмов в формате QuickTime, предоставляющихся QTMovie объекты в Вашем проекте.

  13. Выберите текстовый объект «Your document contents here» в окне и нажмите Delete.

  14. Перетащите QTMovieView объект от библиотеки в Ваше окно и изменяет размеры объекта соответствовать окну.

    Обратите внимание на то, что объект комбинирует и представление и управление для воспроизведения носителей.

  15. Измените атрибуты представления фильма, показанные на рисунке 1-6.

    • Выберите Tools> Inspector.

    • В панели Inspector выберите значок Movie View Attributes, появляющийся как первый значок в строке наверху панели.

    • Удостоверьтесь, что проверяется флажок Show Controller.

      Атрибуты представления Movie рисунка 1-6
    The movie view attributes with the Show Controller box checkedThe movie view attributes with the Show Controller box checked
  16. Установите автокалибровку для QTMovieView объект в Размере Представления Фильма, как показано на рисунке 1-7.

      Размер представления Movie рисунка 1-7
  17. Подключите объект представления фильма к фильму в формате QuickTime, который будет выведен на экран. Вы делаете это путем определения привязки Какао:

    • В QTMovieView Инспектор (выбирают QTMovieView и откройтесь «Сдвигом Команды, я», в случае необходимости), перейдите к панели Bindings. (Можно также получить доступ к нему путем выбора Tools> Bindings Panel.)

    • В разделе Parameters панели Bindings откройте параметр фильма путем щелчка по треугольнику раскрытия рядом с ним.

    • В “Связывают с”: выпадающее меню, выберите File's Owner.

    • В Ключевом Поле трактов Модели введите текст movie, показанный на рисунке 1-8.

        Привязка представления Movie рисунка 1-8
      Binding the movie to the File’s Owner and specifying the model key path
    • Проверьте, “Связывают с”: флажок для сохранения настроек.

    В этом случае, путем указания привязки на рисунке 1-8, Вы дали Какао команду по существу создавать соединение во время выполнения между объектом, загружающим пользовательский интерфейс — т.е. объект Владельца Файла — и QTMovieView объект. Это соединение обеспечивает QTMovieView объект со ссылкой на фильм в формате QuickTime, который должен быть открыт и выведен на экран.

  18. Сохраните Ваш MyDocument.xib файл в Интерфейсном Разработчике и возвращается к Вашему проекту XCode.

  19. После завершения этой последовательности шагов Вы просто создаете и работаете 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 приложение.

  1. Создайте Документ какао базируемый проект.

  2. В Вашем файле объявления создайте экземпляр QTMovie возразите и выход для a QTMovieView.

    @interface MyDocument : NSDocument
    {
        QTMovie        *mMovie;
     
        IBOutlet    QTMovieView *mMovieView;
     
  3. Объявите переменную экземпляра mCIFilter это указывает на a CIFilter объект.

    CIFilter    *mCIFilter;
  4. Объявите переменную экземпляра mVideoPreviewFilter это указывает на объект типа NSString.

    NSString    *mVideoPreviewFilter;
    }
  5. В Вашем файле реализации объявите -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];
    }
  6. Вы связываете метод со всплывающим меню в Интерфейсном Разработчике, как показано на рисунке 1-9.

      Привязка рисунка 1-9 с владельцем файла
  7. Возвратитесь NSString объект связался с mVideoPreviewFilter переменная экземпляра. Это - метод получателя, возвращающий текущий выбор фильтра.

    - (NSString *)videoPreviewFilter
    {
        return mVideoPreviewFilter;
    }

    Обратите внимание на то, что в Базовом Изображении API, фильтры указаны как строки, так, чтобы идентификаторы строки использовались в качестве ключей для фильтрации имен.

  8. В Интерфейсном Разработчике Вы включаете Базовый рендеринг Анимации путем простой установки флажка, позволяющего Вам применить Базовый Слой анимации к Вашему QTMovieView объект. Это связывает его с videoPreviewFilter.

  9. Наконец, Вы добавляете эту строку кода к Вашему 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).

Рисунок 1-10  , Проверяющий, Хочет Базовый флажок Слоя анимации

Когда поддержка уровня включена для представления, представление и все его подпредставления, в действительности, зеркально отражаются Базовым деревом Слоя анимации. Представление и его подпредставления все еще принимают участие в цепочке респондента, все еще получают события и действие как любое другое представление. Однако при перерисовке потребностей, которые будут сделаны, и содержание не изменилось, дерево рендеринга обрабатывает перерисовку, а не приложение.

Кроме обеспечения кэшируемой перерисовки, поддержанные уровнем представления представляют много усовершенствованных визуальных свойств Базовых свойств Слоя анимации, включая:

  • Управление непрозрачностью представления

  • Дополнительная тень, указанное использование NSShadow объект

  • Составляется дополнительный массив Базовых фильтров Изображения, применяющихся к содержанию позади представления перед его содержанием,

  • Базовый фильтр Изображения раньше составлял содержание представления с фоном

  • Дополнительный массив Базовых фильтров Изображения, применяющихся к содержанию представления и его подпредставлений

Особенно, эта выборка использует в своих интересах усовершенствованный Базовый Слой анимации визуальные свойства и применяет Базовый фильтр Изображения к содержанию QTMovieView достигнуть холодного визуального эффекта.

При запуске приложения окно документа автоматически выведено на экран, показав предварительно выобранный фильм. Вы нажимаете кнопку воспроизведения, и фильм начинает играть. Вы нажимаете кнопку Pause, и фильм остановится. Всплывающее меню предоставлено для разрешения, Вы для выбора Core Image просачиваетесь для применения к фильму, показанному на рисунке 1-11. После запуска значение по умолчанию фильтра не установлено ни в Какое Значение.

Рисунок 1-11  , Выбор Core Animation, фильтрует для применения к фильму

Вы тогда выбираете фильтр по Вашему выбору, в то время как фильм играет или остановился, и фильтр будет автоматически применен к фильму. В то время как фильм играет, можно даже изменить фильтр.

Интеграция мультимедиа в OS X

QTKit может использоваться в качестве предпочтительного механизма аудио/воспроизведения видео для работы с и создавания приложений с другой графикой и платформами обработки изображений в OS X.

Например, Вы могли использовать Базовую Анимацию с кратным числом QTMovieLayer объекты для видео, составляющего композит в сочетании с воспроизведением в QTKit. Путем применения Базового Изображения фильтрует к воспроизведению видео носителей, можно использовать в своих интересах Базовую поддерживающую слой анимации поддержку, как продемонстрировано в Применении Базовых Фильтров Изображения к Фильму. Используя инструменты и графические основы, служившие в OS X, Вы могли создать богатые носителями, иммерсивные среды, такие как мультимедийный киоск, изображенный на рисунке 1-12.

В той среде у пользователя есть возможность взаимодействовать с мультимедийным контентом и чувствовать что содержание от многих различных углов и размерностей. В конечном счете опыт становится иммерсивным для пользователя, в котором возможно взаимодействовать на многократных уровнях с содержанием представления.

Рисунок 1-12  мультимедийный киоск создается с графикой и платформами обработки изображений в OS X