Получение QTKit

Эта глава определяет концептуальные основы архитектуры получения QTKit, ее поведения иерархии классов и основного объекта. Классы, составляющие эту часть API QTKit, описаны в наборе таблиц, группирующих классы получения согласно выполняемым задачам и обычно используемые методы. Если необходимо работать с получением носителей в приложении Какао, можно хотеть считать эту главу для лучшего понимания того, как можно использовать объекты получения и их связанные методы для выполнения множества записи задач.

В частности глава обсуждает, как QTKit получают работы API в обработке аудиоданных и видеоданных. Как правило, клиенты API используют три существенных типа объектов: получите вводы, выводы получения и сеанс получения. Это основной принцип понимания методологии и высокоуровневых работ API.

Глава также обсуждает много вариантов использования и сценариев для контакта с получением и записи проблем в Вашем цикле разработки приложений. Фрагменты кода выделяют различные методы, которые могут быть полезными в программировании с частью получения API QTKit.

Обзор

Эти 17 классов в получении QTKit API специально предназначены для обработки широкого диапазона основных, а также работы по дому обработки изображений профессионального уровня в получении и записи аудио/видео мультимедийного контента. Классы, сразу, устойчивы и мощны, все же просты в использовании, больше чем с 250 методами, уведомлениями и атрибутами.

В OS X v10.6, фильмы Вы создаете использование, получение QTKit создается с и таким образом совместимое с QuickTime X. Это приводит к более эффективному рендерингу и воспроизведению полученных носителей. Кроме того, 64-разрядное получение является теперь собственным в OS X v10.6 и поэтому намного более эффективным, чем использующая сервер реализация в OS X v10.5.

Используя эти классы и методы, можно записать звуковое содержимое профессионального качества и видеоконтент от одной или более камер и микрофонов, включая USB и устройства Firewire, а также устройства хранения данных DV. Классы ввода и вывода, включенные с платформой, разработаны для обеспечения всех компонентов, необходимо реализовать случай наиболее популярного способа использования для, носители получают систему, т.е. записывая от камеры до файла QuickTime.

Получение носителей в реальном времени

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

Возможности получения

Возможность получения, предоставленная получением QTKit API, включает точную кадром, аудио/видео синхронизацию, в дополнение к тому, чтобы позволять Вам предварительно просмотреть полученное содержание и сохранить его к файлу. Точное кадром получение означает, что можно указать, что получение и запись носителей произойдут с определенными временными кодами и другими метаданными на выборку. Например, использование QTKit получает APIs, можно указать точно число кадров в файле, который Вы хотите выписать.

QTKit получают API, также обеспечивает доступ к управлению передачей, такому как ускоренная перемотка и перемотка, на видео видеокамере. Кроме того, можно записать, получил данные QuickTime к файлу при обеспечении экранного предварительного просмотра.

Кроме того, API QTKit предоставляет Вам возможность совместно использовать iSight и другие веб-камеры между многократными приложениями.

Получите иерархию классов

Рисунок 2-1 иллюстрирует иерархию классов для классов, включающих часть API QTKit, выделенного аудио и видеосъемке. Упорядочивание и логическая структура этой иерархии обсуждены в следующем разделе.

Рисунок 2-1  QTKit получает иерархию классов

Упорядочивание получения и логика

В целях лучшего концептуального понимания классы, формирующие архитектуру получения API QTKit, могут быть сгруппированы следующим образом:

Для полного описания всех классов получения QTKit и их связанных методов, обратитесь к Ссылке Платформы QTKit. Ссылка является текущей и актуальной для OS X v10.6 и QuickTime 7.6.3.

Базовые классы

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

Из классов в этой группе самое полезное QTCaptureSession. Этот класс обеспечивает интерфейс для соединения входных источников для вывода мест назначения. Метод, используемый обычно в этом классе, startRunning, который говорит получателю начинать получать данные от своих вводов и затем отправлять те данные в его выводы. Особенно при использовании этого метода когда данные не должны быть отправлены в выводы файла, предварительные просмотры или другие выводы, сеанс получения не должен работать, так, чтобы издержки от получения не влияли на производительность приложения.

Другие классы в этой группе, QTCaptureInput и QTCaptureOutput, которые являются оба абстрактными классами, обеспечивают интерфейсы для соединения вводов и выводов. Входной источник может иметь многократные соединения, который характерен для многих камер, имеющих и аудиовыход и потоки видеовыхода. Когда Вы используете QTCaptureOutput объекты, у Вас не должно быть постоянного числа соединений, но Вам действительно нужно место назначения для Вашего сеанса получения и всех его входных данных.

Последний из этих четырех классов в этой группе, QTCaptureConnection, представляет соединение, по которому единый поток данных носителей отправляется от a QTCaptureInput к a QTCaptureSession и от a QTCaptureSession к a QTCaptureOutput.

Табличные 2-1  классы Ядра: Общее использование

Класс

Группа

Задачи

Обычно используемые методы

QTCaptureSession

Ядро

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

startRunning, addInput:error:, addOutput:error:

QTCaptureInput

Ядро

Обеспечивает входные исходные соединения для a QTCaptureSession. Используйте подклассы этого класса для вводов сеанса.

connections

QTCaptureOutput

Ядро

Обеспечивает интерфейс для соединения выходных мест назначения получения, таких как файлы QuickTime и предварительные просмотры видео, к a QTCaptureSession.

connections

QTCaptureConnection

Ядро

Представляет соединение, по которому единый поток данных носителей отправляется от a QTCaptureInput к a QTCaptureSession и от a QTCaptureSession к a QTCaptureOutput.

formatDescription, mediaType, setEnabled:, isEnabled

Классы ввода/вывода

Существует шесть конкретных выходных классов и один входной класс, принадлежащий этой группе, как показано в Таблице 2-2.

Можно использовать методы, доступные в QTCaptureDeviceInput класс, например, для обработки входных источников для различных устройств хранения данных, таких как камеры и микрофоны. Эти шесть выходных классов предоставляют выходным местам назначения для QTCaptureSession объекты, которые могут использоваться, чтобы записать полученные носители в фильмы в формате QuickTime или предварительно просмотреть получающееся видео или аудио. QTCaptureFileOutput, абстрактный суперкласс, предоставляет выходному месту назначения для сеанса получения для записи полученных носителей просто в файлы.

Обратите внимание на то, что методы делегата, показанные в Таблице 2-2, принадлежат NSObject и не может быть вызван на этих классах.

Табличный 2-2  Ввод / выходные классы: Общее использование

Класс

Группа

Задачи

Обычно используемые методы

QTCaptureAudioPreviewOutput

Ввод/вывод

Представляет выходное место назначения для a QTCaptureSession это может использоваться для предварительного просмотра получаемого аудио.

volume, setVolume:, setOutputDeviceUniqueID:

QTCaptureDecompressedAudioOutput

Ввод/вывод

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

setDelegate:, captureOutput:didOutputAudioSampleBuffer:fromConnection:

QTCaptureDecompressedVideoOutput

Ввод/вывод

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

setDelegate:, captureOutput:didOutputVideoFrame:withSampleBuffer:fromConnection:

QTCaptureDeviceInput

Ввод/вывод

Представляет входной источник для устройств хранения данных, таких как iSight и камеры DV и микрофоны.

initWithDevice:; возвращает экземпляр QTCaptureDeviceInput связанный с данным устройством.

QTCaptureFileOutput

Ввод/вывод

Записи получили носители к файлам и определяют интерфейс для выводов что выборки носителей записи к файлам.

recordToOutputFileURL:, setDelegate:, captureOutput:didFinishRecordingToOutputFileAtURL:forConnections:dueToError:

QTCaptureMovieFileOutput

Ввод/вывод

Представляет выходное место назначения для a QTCaptureSession это пишет полученные носители в файлы фильма в формате QuickTime.

recordToOutputFileURL:, setDelegate:, captureOutput:didFinishRecordingToOutputFileAtURL:forConnections:dueToError:

QTCaptureVideoPreviewOutput

Ввод/вывод

Представляет выходное место назначения для a QTCaptureSession это может использоваться для предварительного просмотра получаемого видео.

visualContextForConnection:, setDelegate:, captureOutput:didOutputVideoFrame:withSampleBuffer:fromConnection:

Служебные классы

Существует три класса, принадлежащие этой группе: QTCompressionOptions, QTFormatDescription, и QTSampleBuffer, показанный в Таблице 2-3. Они лучше всего характеризуются как служебные классы, в которых они выполняют задачи, связанные с представлением, например, сжатиями для определенных носителей или описанием форматов различных выборок носителей.

Из классов в этой группе один из самых полезных QTCompressionOptions, который позволяет Вам описать опции сжатия для всех видов различных носителей, с помощью compressionOptionsIdentifiersForMediaType: и mediaType методы. Опции сжатия создаются из предварительных установок, включенных именованным идентификатором. Эти предварительно установленные идентификаторы перечислены в Ссылке Платформы QTKit в главе, описывающей этот класс.

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

Табличные 2-3  классы Утилиты: Общее использование

Класс

Группа

Задачи

Обычно используемые методы

QTCompressionOptions

Утилита

Представляет ряд опций сжатия для определенного типа носителей.

compressionOptionsIdentifiersForMediaType:, mediaType

QTFormatDescription

Утилита

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

localizedFormatSummary. Константа, QTFormatDescriptionVideoCleanApertureDisplaySizeAttribute

QTSampleBuffer

Утилита

Обеспечивает данные о формате, информацию синхронизации и метаданные по демонстрационным буферам носителей.

formatDescription

Классы пользовательского интерфейса

Существует два класса в этой определенной группе, один посвященный к предварительному просмотру видео, другой поддержки оказания для Базовых Слоев анимации. QTCaptureView и QTCaptureLayer объекты показаны в Таблице 2-4.

Можно использовать методы, доступные в QTCaptureView класс, который является подклассом NSView, к видео предварительного просмотра, обрабатывающемуся экземпляром QTCaptureSession. Класс создает и поддерживает свое собственное QTCaptureVideoPreviewOutput для сбора видео предварительного просмотра, Вам нужно от сеанса получения.

Поддержка Базовой Анимации предоставлена QTCaptureLayer класс, который является подклассом CALayer.

Табличный 2-4  Пользовательский интерфейс и Базовые классы Анимации: Общее использование

Класс

Группа

Задачи

Обычно используемые методы

QTCaptureView

Пользовательский интерфейс

Выводит на экран предварительный просмотр видео сеанса получения.

setCaptureSession:

QTCaptureLayer

Пользовательский интерфейс

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

+ layerWithSession:, – initWithSession:, – setSession:

Класс доступа к устройствам

В этой определенной группе существует только один класс, преданной доступу к устройству, как показано в Таблице 2-5.

Если Вы работаете с QTCaptureDevice объекты, Ваше приложение может считать любое число расширенных атрибутов, доступных этому классу, с помощью deviceAttributes и attributeForKey: методы. Кроме того, можно использовать кодирование значения ключа, чтобы получить и установить атрибуты. Если Вы хотите наблюдать изменения для данного атрибута, можно добавить наблюдателя значения ключа, где ключевой путь является ключом атрибута. Обратите внимание на то, что Вы не можете создать экземпляры QTCaptureDevice непосредственно.

Табличный 2-5  класс Доступа к устройствам: Общее использование

Класс

Группа

Задачи

Обычно используемые методы

QTCaptureDevice

Доступ к устройствам

Представляет доступное устройство захвата изображения.

inputDevices, open:, isOpen, close, localizedDisplayName

Как работает получение QTKit

Все приложения получения QTKit используют три основных типа объектов: получите вводы, выводы получения и сеанс получения. Вводы получения, которые являются подклассами QTCaptureInput, обеспечьте необходимые интерфейсы для других источников полученных носителей.

Ввод устройства захвата изображения, который является a QTCaptureDeviceInput объект — подкласс QTCaptureInput— обеспечивает интерфейс для получения от различного аудио/видеооборудования, такого как камеры и микрофоны. Выводы получения, которые являются подклассами QTCaptureOutput, предоставьте необходимые интерфейсы различным местам назначения для носителей, таких как файлы фильма в формате QuickTime или видео и аудио предварительные просмотры.

Сеанс получения, который является a QTCaptureSession возразите, управляет, как носители, который получен из связанных входных источников, распределяются связанным выходным местам назначения. Каждый ввод и вывод имеет одно или более соединений, представляющих мультимедийный поток определенного типа среды QuickTime, такого как видео или аудио носители. Сеанс получения попытается соединить все входные соединения с каждым из его выводов.

Как показано на рисунке 2-2 сеанс получения работает путем соединения вводов с выводами, чтобы записать и предварительно просмотреть видео от камеры.

  Соединение рисунка 2-2 вводит к выводам в сеансе получения
Connecting inputs to outputs in a capture session

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

Рисунок 2-3 показывает, как сеанс получения обрабатывает многократные аудиовходы.

Рисунок 2-3  , Обрабатывающий многократные аудиовходы в сеансе получения
Handling multiple audio inputs in a capture session

Как проиллюстрировано на рисунке 2-3, сеанс получения отправляет все свое входное видео к каждому выводу, принимающему видео и все его входное аудио к каждому выводу, принимающему аудио. Однако прежде, чем отправить отдельный аудиопоток в его выводы, это смешивает их вниз к одному потоку, который может быть отправлен в единственное соединение получения.

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

Соединения, принадлежащие каждому вводу и выводу, QTCaptureConnection объекты. Они описывают тип среды и формат каждого потока, взятого от ввода или отправленного в вывод. Путем ссылки на определенное соединение приложение может иметь контроль с более прекрасными зернами, по которому носителям вводит и оставляет сеанс. Таким образом можно включить и отключить определенные соединения и управлять определенными атрибутами носителей, входящих (например, объемы определенных звуковых каналов).

QTCaptureView в интерфейсном разработчике

Если Вы работаете с инструментами Xcode и Interface Builder, можно использовать в своих интересах QTCaptureView в библиотеке Interface Builder, показанной на рисунке 2-4.

Просто путем перетаскивания QTCaptureView в окне можно вывести на экран предварительный просмотр видео, которое приложение получило при использовании a QTCaptureSession объект. Учебное руководство по Приложению QTKit описывает подробно, как использовать это управление в построении Вашего приложения получения Какао.

Рисунок 2-4  Интерфейсный объект получения Разработчика

Контакт с потокобезопасностью

Классы получения QTKit, представленные в OS X v10.5 и QuickTime 7.3 обычно, имеют хорошие характеристики потокобезопасности. Чтобы быть более определенными, эти классы могут использоваться от фоновых потоков, за исключением QTCaptureView который наследовался от NSView и поэтому имеет несколько известных ограничений, как обсуждено в Сводке Потокобезопасности для документации OS X.

Несмотря на то, что сеансы получения, представленные QTCaptureSession возразите и их вводы (например, QTCaptureDeviceInput) и выводы (например, QTCaptureMovieFileOutput) может создаваться, выполняться и контролироваться от фоновых потоков, любые вызовы метода, видоизменяющие эти объекты или доступ, непостоянная информация должна быть сериализирована. Поэтому эти методы требуются, чтобы выполнять свою собственную синхронизацию (или блокирующий) вокруг любого доступа к объекту. Это поведение не отличается от любой незащищенной структуры данных, к которой нужно получить доступ от многократных потоков.

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

Используя получение QTKit

В этом разделе рассматриваются ряд сценариев примера использования, такой как, как создать простое приложение записи, получение носителей управления, дескриптор отбросил последние видеокадры, и управляйте размерностями полученного видео и его вывода. Когда Вы имеете дело с этими различными сценариями, Вы используете методы, доступные в получении QTKit API и методы кодирования, описанные в этом разделе.

Если необходимо изучить, как создать приложение, получающее и записывающее аудио/видео из внутреннего или внешнего источника, необходимо считать главы, посвященные тем задачам в Учебном руководстве по Приложению QTKit. Документ, предназначающийся для нового Какао и разработчиков QTKit, обходит Вас через шаги, которые необходимо выполнить для построения такого приложения.

Создание простого получения и запись приложения

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

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

  • QTCaptureMovieFileOutput. Это - выходное место назначения для QTCaptureSession это пишет полученные носители в файлы фильма в формате QuickTime.

  • QTCaptureDeviceInput. Этот объект обеспечивает входной источник для устройств хранения данных, таких как камеры и микрофоны.

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

Вы выполняете эти шаги, предпочтительно в порядке, определенном ниже, для построения приложения, с помощью инструментов Xcode и Interface Builder:

  1. Создайте проект приложения Какао в названном XCode, например, MyRecorder.

    @interface MyRecorder : NSObject
  2. Объявите переменные экземпляра, указывающие на объекты получения.

    QTCaptureSession            *mCaptureSession;
    QTCaptureMovieFileOutput    *mCaptureMovieFileOutput;
    QTCaptureDeviceInput        *mCaptureVideoDeviceInput;
    QTCaptureDeviceInput        *mCaptureAudioDeviceInput;
  3. Определите Интерфейсный выход Разработчика, mCaptureView, это указывает на a QTCaptureView объект.

    IBOutlet QTCaptureView *mCaptureView;
  4. В Вашем файле реализации сделайте следующее:

    • Создайте сеанс получения.

      mCaptureSession = [[QTCaptureSession alloc] init];
    • Найдите видеоустройство и подключите свои вводы и выводы к сеансу.

       QTCaptureDevice *videoDevice = [QTCaptureDevice defaultInputDeviceWithMediaType:QTMediaTypeVideo];
          success = [videoDevice open:&error];
      BOOL success = NO;
          NSError *error;
  5. Добавьте видеоустройство к сеансу как ввод устройства.

    mCaptureVideoDeviceInput = [[QTCaptureDeviceInput alloc] initWithDevice:videoDevice];
            success = [mCaptureSession addInput:mCaptureVideoDeviceInput error:&error];
  6. Создайте вывод файла ролика и добавьте его к сеансу.

        mCaptureMovieFileOutput = [[QTCaptureMovieFileOutput alloc] init];
        success = [mCaptureSession addOutput:mCaptureMovieFileOutput error:&error];
        if (!success) {
        }
    [mCaptureMovieFileOutput setDelegate:self];
  7. Свяжите свое представление получения в UI с сеансом и запустите его выполнение.

    [mCaptureView setCaptureSession:mCaptureSession];
            [mCaptureSession startRunning];
  8. Укажите опции сжатия для размера Вашего видео и качества Вашего аудиовыхода.

    NSEnumerator *connectionEnumerator = [[mCaptureMovieFileOutput connections] objectEnumerator];
            QTCaptureConnection *connection;
     
            while ((connection = [connectionEnumerator nextObject])) {
                NSString *mediaType = [connection mediaType];
                QTCompressionOptions *compressionOptions = nil;
                if ([mediaType isEqualToString:QTMediaTypeVideo]) {
                    compressionOptions = [QTCompressionOptions compressionOptionsWithIdentifier:@"QTCompressionOptions240SizeH264Video"];
                } else if ([mediaType isEqualToString:QTMediaTypeSound]) {
                    compressionOptions = [QTCompressionOptions compressionOptionsWithIdentifier:@"QTCompressionOptionsHighQualityAACAudio"];
                }
     
                [mCaptureMovieFileOutput setCompressionOptions:compressionOptions forConnection:connection];
    }
  9. Реализация запускает и останавливает действия и указывает выходное место назначения для Ваших носителей с записанными данными, в этом случае фильм в формате QuickTime (.mov) в Вашем /Users/Shared папка.

    - (IBAction)startRecording:(id)sender
    {
        [mCaptureMovieFileOutput recordToOutputFileURL:[NSURL fileURLWithPath:@"/Users/Shared/My Recorded Movie.mov"]];
    }
     
    - (IBAction)stopRecording:(id)sender
    {
        [mCaptureMovieFileOutput recordToOutputFileURL:nil];
    }
  10. Выведите свой полученный фильм в указанном пути и откройте Ваш фильм в формате QuickTime в пути, в котором Вы указали /Users/Shared/My Recorded Movie.mov.

    - (void)captureOutput:(QTCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL forConnections:(NSArray *)connections dueToError:(NSError *)error
    {
        [[NSWorkspace sharedWorkspace] openURL:outputFileURL];
    }

После создания и компиляции этого кода, Ваш полученный вывод появляется как фильм, играющий в QuickTime X приложений Проигрывателя, как показано на рисунке 2-5.

  Вывод Captured рисунка 2-5, проигрывая как QuickTime X фильмов

Указание опций сжатия

Особенно, на последнем шаге построения Вашего получения и рекордного приложения (Шаг 9), Вы указываете идентификатор опции сжатия для определенного типа носителей, в этом случае, набор носителей, чтобы вывести на экран и воспроизвести в размере 320 x 240, закодированный с кодеком H.264. Это важно для понимания, в котором можно использовать QTCompressionOptions объект описать опции сжатия для детали полученные носители и ее последующий вывод и рендеринг. Если Вы не укажете опцию сжатия, то Ваши полученные носители будут выведены как сырые данные, собственные устройством видеокадры, которые может быть трудно вывести на экран и воспроизвести на различных устройствах как фильмы в формате QuickTime.

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

Метод кодирования, который Вы используете, должен передать эти идентификаторы compressionOptionsWithIdentifier: метод класса сконфигурировать экземпляр с опциями сжатия для того идентификатора. Обратите внимание на то, что каждый идентификатор представляет ряд опций, определяющих, как будут сжаты носители. Также обратите внимание на то, что не все идентификаторы доступны в 64-разрядном, как показано в Перечислении 2-1.

  Идентификаторы опций Listing 2-1 Compression

@"QTCompressionOptionsLosslessAppleIntermediateVideo"; //Not available in 64-bit.
@"QTCompressionOptionsLosslessAnimationVideo";
@"QTCompressionOptionsJPEGVideo";
@"QTCompressionOptions120SizeH264Video";
@"QTCompressionOptions240SizeH264Video";
@"QTCompressionOptionsSD480SizeH264Video";
@"QTCompressionOptions120SizeMPEG4Video"; //Not available in 64-bit.
@"QTCompressionOptions240SizeMPEG4Video"; //Not available in 64-bit.
@"QTCompressionOptionsSD480SizeMPEG4Video"; //Not available in 64-bit.
@"QTCompressionOptionsLosslessALACAudio";
@"QTCompressionOptionsHighQualityAACAudio";
@"QTCompressionOptionsVoiceQualityAACAudio";

Управление видео размерностями

Используя идентификаторы опций сжатия, можно управлять размерностями полученного видео, когда оно записано в диск. Преимущество выполнения этого состоит в том, что Вы сохраняете дисковое пространство и используете меньше дисковой пропускной способности. Это особенно важно при использовании недавних поколений встроенных iSight камер, в их максимальном разрешении, выводящих необработанные видеокадры на скорости передачи данных, которая выше, чем стандартный рабочий стол или жесткий диск для ноутбука могут обработать.

Управлять размерностями видео, записанного QTCaptureFileOutput, Вы устанавливаете опции сжатия, осуществляющие определенный размер (QTCompressionOptionsSD480SizeH264Video, например, как показано в Перечислении 2-2). Как обсуждено в Указании Опций Сжатия, идентификаторы опций сжатия являются одним способом управлять видео размерностями, при использовании вывода файла.

Если Вы используете QTCaptureDecompressedVideoOutput или QTCaptureVideoPreviewOutput, используйте пиксельные буферные атрибуты (setPixelBufferAttributes:) управлять видео размерностями.

Если Вы хотите управлять видео размерностями вывода файла, не сжимая видео, существует два метода, доступные в QTCaptureFileOutput:

- (NSSize)maximumVideoSize
- (void)setMaximumVideoSize:(NSSize)maximumVideoSize

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

Как имеет место с setPixelBufferAttributes: в QTCaptureDecompressedVideoOutput и QTCaptureVideoPreviewOutput, когда это возможно, устройства, поддерживающие различные аппаратные разрешения, автоматически реконфигурированы для использования наименьшего количества пропускной способности, все еще выполняя требования всех выводов в сеансе получения.

Создавание приложения захвата Единственного Кадра

Если Ваше приложение должно получить единственные кадры мультимедийного контента — например, от внутренней или внешней iSight камеры — можно сделать так легко и с минимальные строки кода Какао, с помощью классов получения в API QTKit.

Метод получения единственного кадра распространен в изображении движущихся объектов и телевизионных отраслях и известен как анимация движения остановки. Вы захватываете единственные кадры от видеопотока и выводите те кадры, с большой точностью и надежностью (избегающий разрыва, например), в фильм в формате QuickTime. Когда кадры связываются в фильм для воспроизведения, Вы создаете иллюзию движения, и таким образом, анимация неподвижных изображений.

Для создания этого типа приложения Вы работаете по существу с тремя классами получения:

  • QTCaptureSession. Этот объект является, снова, Вашим основным интерфейсом для получения мультимедийных потоков.

  • QTCaptureDecompressedVideoOutput. Это - Ваше выходное место назначения для a QTCaptureSession возразите, что можно использовать для обработки распакованных кадров от получающегося видео. Используя методы, предоставленные в этом классе, можно произвести распакованные видеокадры (CVImageBuffer), как показано на рисунке 2-6, которые подходят для высококачественной обработки видеоданных.

  • QTCaptureDeviceInput. Этот объект является Вашим входным источником для устройств хранения данных, таких как камеры и микрофоны.

Рисунок 2-6  , Создающий анимацию движения остановки

Вы выполняете эти шаги, как обрисовано в общих чертах ниже, для построения этого приложения:

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

  2. Объявите три переменные экземпляра та точка к a QTMovie объект, один из которых указывают для Взаимодействия через интерфейс с выходами Разработчика.

     IBOutlet QTCaptureView  *mCaptureView;
     IBOutlet QTMovieView    *mMovieView;
     QTMovie                 *mMovie;
  3. Объявите переменные экземпляра, указывающие на три объекта.

    QTCaptureSession                  *mCaptureSession;
    QTCaptureDeviceInput              *mCaptureDeviceInput;
    QTCaptureDecompressedVideoOutput  *mCaptureDecompressedVideoOutput;
  4. Объявите метод IBAction.

    - (IBAction)addFrame:(id)sender;
  5. Установите сеанс получения, выводящий необработанные кадры, которые Вы хотите захватить.

        [mMovieView setMovie:mMovie];
        if (!mCaptureSession) {
            BOOL success;
            mCaptureSession = [[QTCaptureSession alloc] init];
  6. Добавьте ввод устройства для того устройства к сеансу получения.

    QTCaptureDevice *device = [QTCaptureDevice defaultInputDeviceWithMediaType:QTMediaTypeVideo];
            success = [device open:&error];
            if (!success) {
                [[NSAlert alertWithError:error] runModal];
                return;
            }
     
     mCaptureDeviceInput = [[QTCaptureDeviceInput alloc] initWithDevice:device];
            success = [mCaptureSession addInput:mCaptureDeviceInput error:&error];
            if (!success) {
                [[NSAlert alertWithError:error] runModal];
                return;
            }
  7. Добавьте распакованный видеовыход, возвращающий необработанные кадры сеансу.

     mCaptureDecompressedVideoOutput = [[QTCaptureDecompressedVideoOutput alloc] init];
            [mCaptureDecompressedVideoOutput setDelegate:self];
            success = [mCaptureSession addOutput:mCaptureDecompressedVideoOutput error:&error];
            if (!success) {
                [[NSAlert alertWithError:error] runModal];
                return;
            }
  8. Предварительно просмотрите видео от сеанса в окне документа.

        [mCaptureView setCaptureSession:mCaptureSession];
  9. Запустите сеанс.

            [mCaptureSession startRunning];
        }
    }
  10. Реализуйте метод делегата это QTCaptureDecompressedVideoOutput вызовы каждый раз, когда это принимает кадр. Обратите внимание на то, что этот метод вызывают для каждого входящего кадра.

    - (void)captureOutput:(QTCaptureOutput *)captureOutput didOutputVideoFrame:(CVImageBufferRef)videoFrame withSampleBuffer:(QTSampleBuffer *)sampleBuffer fromConnection:(QTCaptureConnection *)connection
  11. Сохраните последний кадр. Необходимо выполнить это в a @synchronized блокируйте, потому что этот метод делегата не вызывают на основном потоке.

    {
        CVImageBufferRef imageBufferToRelease;
     
        CVBufferRetain(videoFrame);
     
        @synchronized (self) {
            imageBufferToRelease = mCurrentImageBuffer;
            mCurrentImageBuffer = videoFrame;
        }
     
        CVBufferRelease(imageBufferToRelease);
    }
  12. Получите новый кадр. Необходимо выполнить это в a @synchronized блокируйте, потому что метод делегата, устанавливающий новый кадр, не вызывают на основном потоке.

    - (IBAction)addFrame:(id)sender
    {
        CVImageBufferRef imageBuffer;
     
        @synchronized (self) {
            imageBuffer = CVBufferRetain(mCurrentImageBuffer);
        }
  13. Создайте NSImage и добавьте его к фильму.

    if (imageBuffer) {
            NSCIImageRep *imageRep = [NSCIImageRep imageRepWithCIImage:[CIImage imageWithCVImageBuffer:imageBuffer]];
            NSImage *image = [[[NSImage alloc] initWithSize:[imageRep size]] autorelease];
            [image addRepresentation:imageRep];
            CVBufferRelease(imageBuffer);
     
            [mMovie addImage:image forDuration:QTMakeTime(1, 10) withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
                                                                                 @"jpeg", QTAddImageCodecType,
                                                                                 nil]];
            [mMovie setCurrentTime:[mMovie duration]];
     
            [mMovieView setNeedsDisplay:YES];
     
            [self updateChangeCount:NSChangeDone];
        }
    }

Приостановка и возобновление записи

Если Ваше приложение должно управлять записью полученных носителей к единственному файлу, можно использовать в своих интересах улучшенную функциональность записи, предоставленную в OS X v10.6. Вы используете методы экземпляра, доступные в QTCaptureFileOutput класс, которые разработаны для выполнения этой задачи:

- (BOOL)isRecordingPaused
- (void)pauseRecording
- (void)resumeRecording

Вы используете isRecordingPaused метод, чтобы возвратиться, ли, записывая к файлу, возвращенному outputFileURL был ранее приостановлен с помощью pauseRecording метод. При приостановке записи полученные выборки не записаны в выходной файл, но новые выборки могут быть записаны в тот же файл в будущем путем вызова resumeRecording. Значение этого метода является значением ключа заметное использование ключа @"recordingPaused".

pauseRecording метод, как Вы ожидали бы, заставляет получатель прекращать писать полученные выборки в файл текущей производительности, возвращенный outputFileURL. Однако это оставляет файл открытым так, чтобы выборки могли быть записаны в него в будущем, когда resumeRecording вызывается. Это позволяет Вам записывать многократные участки среды, которые не непрерывны своевременно к единственному файлу. Когда Вы прекращаете записывать или использование файлов изменения recordToOutputFileURL:bufferDestination: или запись автоматически останавливается вследствие состояния ошибки, в то время как запись приостанавливается, выходной файл будет закончен и обычно закрываться, не требуя соответствующего вызова к resumeRecording. Когда нет никакого файла текущей производительности, или когда запись уже приостанавливается, этот метод ничего не делает. Можно вызвать этот метод в captureOutput:didOutputSampleBuffer:fromConnection: метод делегата для паузы, записывающей после точной выборки носителей.

Контакт с отброшенными последними видеокадрами

По умолчанию, QTCaptureDecompressedVideoOutput объект, подкласс QTCaptureOutput, дескрипторы получили видеокадры через метод делегата и передают все полученные кадры делегату, даже если они получены на более высоком уровне, чем делегат обслуживает их. Если Вы не реализуете свою собственную поточную обработку и отбрасывающую кадр стратегию так, чтобы Вы не блокировали поток делегата, на котором Вы получаете новые видеокадры, то Ваше приложение примет удар исполнения всех условий, поскольку видеокадры стоятся в очереди в памяти более быстро, чем они могут быть обслужены.

Но если Вы не должны успешно получать каждый кадр, можно использовать два метода, доступные в QTCaptureDecompressedVideoOutput это позволяет Вам автоматически отбрасывать скопированные, или последние видеокадры. Эти методы

- (BOOL)automaticallyDropsLateVideoFrames
- (void)setAutomaticallyDropsLateVideoFrames:(BOOL)automaticallyDropsLateVideoFrames

Если Вы устанавливаете setAutomaticallyDropsLateVideoFrames: метод к YES, QTCaptureDecompressedVideoOutput объект отбросит дополнительные кадры, стоящиеся в очереди, в то время как Вы блокируете поток обратного вызова делегата. В сочетании с этим свойством можно использовать следующий метод делегата:

- (void)captureOutput:(QTCaptureOutput *)captureOutput didDropVideoFrameWithSampleBuffer:(QTSampleBuffer *)sampleBuffer fromConnection:(QTCaptureConnection *)connection;

Когда Вы устанавливаете automaticallyDropsLateVideoFrames к YES, этот метод вызывают каждый раз, когда отбрасывается последний видеокадр. Метод вызывают один раз для каждого отброшенного кадра и можно вызвать перед вызовом к outputVideoFrame:withSampleBuffer:fromConnection: или captureOutput:didOutputVideoFrame:withSampleBuffer:fromConnection: метод делегата, во время которого те кадры были отброшены возвраты. QTSampleBuffer объект передал этому методу делегата, будет содержать метаданные об отброшенном видеокадре, таком как его продолжительность и метка времени представления, но не содержит фактических видеоданных. Делегаты не должны предполагать, что этот метод вызовут на основном потоке. Поскольку этот метод можно вызвать на том же потоке, который ответственен за вывод видеокадров, должно быть эффективно предотвратить дальнейшие проблемы производительности получения, такие как дополнительные отброшенные видеокадры.

Управление частотой кадров полученного видео

Много приложений получения QTKit должны управлять частотой кадров полученного видео в основном по причинам производительности. Например, Вы, возможно, должны записать видео в высоком разрешении, но не должны записывать при высокой частоте кадров, таким образом, можно сохранить значительное количество памяти, дисковой пропускной способности и пропускной способности шины устройства путем предотвращения получения дополнительных кадров. Два метода, в частности оба в QTCaptureFileOutput и QTCaptureDecompressedVideoOutput, полезная обработка обязанностей по выводу полученного видео. Они:

- (NSTimeInterval)minimumVideoFrameInterval
- (void)setMinimumVideoFrameInterval:(NSTimeInterval)minimumVideoFrameInterval

Вы используете эти методы для указания минимальной суммы времени, которое должно разделить последовательные кадры, выведенные получателем, который является инверсией максимальной частоты кадров. В каждом случае значение 0 указывает неограниченную максимальную частоту кадров. Значение по умолчанию 0. Каждый раз, когда возможно, устройства, поддерживающие различные аппаратные частоты кадров, будут автоматически реконфигурированы для использования наименьшего количества пропускной способности, все еще выполняя требования всех выводов в сеансе получения.

Получение единого потока от мультиплексированного устройства

Мультиплексированные устройства, такие как DV и камеры HDV, где аудио-и видеопотоки смешаны, представлены в получении QTKit API типом среды QTMediaTypeMuxed. Для получения единого потока от устройства (например, только видео), Вы отключаете аудиосоединения на вводе устройства для устройства захвата изображения при помощи QTCaptureConnection setEnabled: метод и передающий в NO.

В QTKit получают API, QTCaptureDevice объект, показанный в Перечислении 2-2, представляет доступное устройство захвата изображения. Это означает что каждый экземпляр QTCaptureDevice соответствует устройству захвата изображения, подключающемуся или ранее подключенному к компьютеру пользователя во время времени жизни приложения. Вы не можете создать экземпляры QTCaptureDevice непосредственно. Единственный уникальный экземпляр создается автоматически каждый раз, когда устройство подключено к компьютеру и может быть получено доступ с помощью deviceWithUniqueID: метод класса. Массив всех в настоящее время подключенных устройств может также быть получен с помощью inputDevices метод класса.

Таблица 2-6 детализирует типы среды, поддерживаемые QTCaptureDevice и примеры устройств, поддерживающих их:

Табличные 2-6  Типы среды, поддерживаемые QTCaptureDevice

Тип среды

Описание

Устройства в качестве примера

QTMediaTypeVideo

Носители, который только содержит видеокадры.

камеры iSight (внешний и встроенный); USB и веб-камеры FireWire

QTMediaTypeMuxed

Мультиплексированные носители, которые могут содержать аудио, видео и другие данные в едином потоке.

Камеры DV

QTMediaTypeSound

Носители, который только содержит аудиосэмплы.

Встроенные микрофоны и строка - в разъемах; микрофон, встроенный к внешнему iSight; микрофоны USB и гарнитуры; любое другое устройство поддерживается Core Audio.

Перечисление 2-2 показывает, как получить единый поток от мультиплексированного устройства.

Перечисление 2-2  Получая единый поток от мультиплексированного устройства

QTCaptureDevice *theDefaultMuxedDevice;
QTCaptureDeviceInput *theDeviceInput;
BOOL success;
NSError *error;
 
...
 
// get the default muxed device
theDefaultMuxedDevice = [QTCaptureDevice defaultInputDeviceWithMediaType:QTMediaTypeMuxed];
 
// open the device
success = [theDefaultMuxedDevice open:&error];
if (YES == success) {
    // create and associate device input
    theDeviceInput = [QTCaptureDeviceInput deviceInputWithDevice:theDefaultMuxedDevice];
 
    // get the list of owned connections
    NSArray *ownedConnections = [theDeviceInput connections];
 
    // disable all the audio connections
    for (QTCaptureConnection *connection in ownedConnections) {
        if ( [[connection mediaType] isEqualToString:QTMediaTypeSound] ) {
            [connection setEnabled:NO];
        }
    }
} else {
    // do something with the error code
}

Конфигурирование камер для получения

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

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

В варианте использования, где необходимо получить доступ к пиксельным значениям полученных кадров для распознавания образов для изменения размеров CVImageBuffer, QTKit обеспечивает надлежащий API. Можно попросить CVImageBuffers из определенного размера и использования формата пикселя QTCaptureDecompressedVideoOutput setPixelBufferAttributes:. Это проиллюстрировано в следующем примере использования, показанном в Перечислении 2-3.

Перечисление 2-3  Получая распаковало кадры видеовыхода

    [decompressedVideoOutput setPixelBufferAttributes:[NSDictionary
                                                        dictionaryWithObjectsAndKeys:
                                                       [NSNumber
                                                        numberWithDouble:320.0], (id)kCVPixelBufferWidthKey,
                                                       [NSNumber
                                                        numberWithDouble:240.0], (id)kCVPixelBufferHeightKey,
                                                       [NSNumber
                                                        numberWitUnsignedInt:kCVPixelFormatType_32ARGB],
                                                        (id)kCVPixelBufferPixelFormatTypeKey,
                                                       nil]];

Когда надлежащий, указывание этих пиксельных буферных атрибутов заставит камеру быть автоматически реконфигурированной для лучшего соответствия выходного формата. Преобразования все еще могут быть необходимыми. Например, если камера не будет иметь режима RGB, то преобразование формата пикселя будет все еще требоваться. Однако QTKit выполнит все преобразования для Вас. Короче говоря, использование этого API позволяет QTKit выбирать самый оптимальный видео конвейер для требуемого вывода.