Получение 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, выделенного аудио и видеосъемке. Упорядочивание и логическая структура этой иерархии обсуждены в следующем разделе.
Упорядочивание получения и логика
В целях лучшего концептуального понимания классы, формирующие архитектуру получения 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
.
Класс | Группа | Задачи | Обычно используемые методы |
---|---|---|---|
| Ядро | Основной интерфейс для получения мультимедийных потоков; управляет соединениями между вводами и выводами; когда получение работает, также управляет. |
|
| Ядро | Обеспечивает входные исходные соединения для a |
|
| Ядро | Обеспечивает интерфейс для соединения выходных мест назначения получения, таких как файлы QuickTime и предварительные просмотры видео, к a |
|
| Ядро | Представляет соединение, по которому единый поток данных носителей отправляется от a |
|
Классы ввода/вывода
Существует шесть конкретных выходных классов и один входной класс, принадлежащий этой группе, как показано в Таблице 2-2.
Можно использовать методы, доступные в QTCaptureDeviceInput
класс, например, для обработки входных источников для различных устройств хранения данных, таких как камеры и микрофоны. Эти шесть выходных классов предоставляют выходным местам назначения для QTCaptureSession
объекты, которые могут использоваться, чтобы записать полученные носители в фильмы в формате QuickTime или предварительно просмотреть получающееся видео или аудио. QTCaptureFileOutput
, абстрактный суперкласс, предоставляет выходному месту назначения для сеанса получения для записи полученных носителей просто в файлы.
Обратите внимание на то, что методы делегата, показанные в Таблице 2-2, принадлежат NSObject
и не может быть вызван на этих классах.
Класс | Группа | Задачи | Обычно используемые методы |
---|---|---|---|
| Ввод/вывод | Представляет выходное место назначения для a |
|
| Ввод/вывод | Представляет выходное место назначения для a |
|
| Ввод/вывод | Представляет выходное место назначения для a |
|
| Ввод/вывод | Представляет входной источник для устройств хранения данных, таких как iSight и камеры DV и микрофоны. |
|
| Ввод/вывод | Записи получили носители к файлам и определяют интерфейс для выводов что выборки носителей записи к файлам. |
|
| Ввод/вывод | Представляет выходное место назначения для a |
|
| Ввод/вывод | Представляет выходное место назначения для a |
|
Служебные классы
Существует три класса, принадлежащие этой группе: QTCompressionOptions
, QTFormatDescription
, и QTSampleBuffer
, показанный в Таблице 2-3. Они лучше всего характеризуются как служебные классы, в которых они выполняют задачи, связанные с представлением, например, сжатиями для определенных носителей или описанием форматов различных выборок носителей.
Из классов в этой группе один из самых полезных QTCompressionOptions
, который позволяет Вам описать опции сжатия для всех видов различных носителей, с помощью compressionOptionsIdentifiersForMediaType:
и mediaType
методы. Опции сжатия создаются из предварительных установок, включенных именованным идентификатором. Эти предварительно установленные идентификаторы перечислены в Ссылке Платформы QTKit в главе, описывающей этот класс.
Используя QTSampleBuffer
объекты, можно получить информацию о демонстрационных буферных данных, что Вы, возможно, должны вывести или обработать выборки носителей в буфере.
Класс | Группа | Задачи | Обычно используемые методы |
---|---|---|---|
| Утилита | Представляет ряд опций сжатия для определенного типа носителей. |
|
| Утилита | Описывает формат носителя выборок носителей и источников носителей, таких как соединения получения и устройства. |
|
| Утилита | Обеспечивает данные о формате, информацию синхронизации и метаданные по демонстрационным буферам носителей. |
|
Классы пользовательского интерфейса
Существует два класса в этой определенной группе, один посвященный к предварительному просмотру видео, другой поддержки оказания для Базовых Слоев анимации. QTCaptureView
и QTCaptureLayer
объекты показаны в Таблице 2-4.
Можно использовать методы, доступные в QTCaptureView
класс, который является подклассом NSView
, к видео предварительного просмотра, обрабатывающемуся экземпляром QTCaptureSession
. Класс создает и поддерживает свое собственное QTCaptureVideoPreviewOutput
для сбора видео предварительного просмотра, Вам нужно от сеанса получения.
Поддержка Базовой Анимации предоставлена QTCaptureLayer
класс, который является подклассом CALayer
.
Класс | Группа | Задачи | Обычно используемые методы |
---|---|---|---|
| Пользовательский интерфейс | Выводит на экран предварительный просмотр видео сеанса получения. |
|
| Пользовательский интерфейс | Обеспечивает уровень, в настоящее время выводящий на экран видеокадры будучи полученным от устройства, присоединенного к компьютеру, и предназначающийся для оказания поддержки для того, чтобы вовлечь содержание сеанса получения на уровень. |
|
Класс доступа к устройствам
В этой определенной группе существует только один класс, преданной доступу к устройству, как показано в Таблице 2-5.
Если Вы работаете с QTCaptureDevice
объекты, Ваше приложение может считать любое число расширенных атрибутов, доступных этому классу, с помощью deviceAttributes
и attributeForKey:
методы. Кроме того, можно использовать кодирование значения ключа, чтобы получить и установить атрибуты. Если Вы хотите наблюдать изменения для данного атрибута, можно добавить наблюдателя значения ключа, где ключевой путь является ключом атрибута. Обратите внимание на то, что Вы не можете создать экземпляры QTCaptureDevice
непосредственно.
Класс | Группа | Задачи | Обычно используемые методы |
---|---|---|---|
| Доступ к устройствам | Представляет доступное устройство захвата изображения. |
|
Как работает получение QTKit
Все приложения получения QTKit используют три основных типа объектов: получите вводы, выводы получения и сеанс получения. Вводы получения, которые являются подклассами QTCaptureInput
, обеспечьте необходимые интерфейсы для других источников полученных носителей.
Ввод устройства захвата изображения, который является a QTCaptureDeviceInput
объект — подкласс QTCaptureInput
— обеспечивает интерфейс для получения от различного аудио/видеооборудования, такого как камеры и микрофоны. Выводы получения, которые являются подклассами QTCaptureOutput
, предоставьте необходимые интерфейсы различным местам назначения для носителей, таких как файлы фильма в формате QuickTime или видео и аудио предварительные просмотры.
Сеанс получения, который является a QTCaptureSession
возразите, управляет, как носители, который получен из связанных входных источников, распределяются связанным выходным местам назначения. Каждый ввод и вывод имеет одно или более соединений, представляющих мультимедийный поток определенного типа среды QuickTime, такого как видео или аудио носители. Сеанс получения попытается соединить все входные соединения с каждым из его выводов.
Как показано на рисунке 2-2 сеанс получения работает путем соединения вводов с выводами, чтобы записать и предварительно просмотреть видео от камеры.
Сеанс получения работает путем распределения видео от его единственного соединения видеовхода до соединения, принадлежавшего каждому выводу. В дополнение к распределению отдельных мультимедийных потоков к каждому выводу сеанс получения также ответственен за смешивание аудио от многократных вводов вниз к единому потоку.
Рисунок 2-3 показывает, как сеанс получения обрабатывает многократные аудиовходы.
Как проиллюстрировано на рисунке 2-3, сеанс получения отправляет все свое входное видео к каждому выводу, принимающему видео и все его входное аудио к каждому выводу, принимающему аудио. Однако прежде, чем отправить отдельный аудиопоток в его выводы, это смешивает их вниз к одному потоку, который может быть отправлен в единственное соединение получения.
Сеанс получения также ответственен за обеспечение, что все носители синхронизируются с единственной основой времени, чтобы гарантировать, что синхронизируются все выходное видео и аудио.
Соединения, принадлежащие каждому вводу и выводу, QTCaptureConnection
объекты. Они описывают тип среды и формат каждого потока, взятого от ввода или отправленного в вывод. Путем ссылки на определенное соединение приложение может иметь контроль с более прекрасными зернами, по которому носителям вводит и оставляет сеанс. Таким образом можно включить и отключить определенные соединения и управлять определенными атрибутами носителей, входящих (например, объемы определенных звуковых каналов).
QTCaptureView в интерфейсном разработчике
Если Вы работаете с инструментами Xcode и Interface Builder, можно использовать в своих интересах QTCaptureView
в библиотеке Interface Builder, показанной на рисунке 2-4.
Просто путем перетаскивания QTCaptureView
в окне можно вывести на экран предварительный просмотр видео, которое приложение получило при использовании a QTCaptureSession
объект. Учебное руководство по Приложению QTKit описывает подробно, как использовать это управление в построении Вашего приложения получения Какао.
Контакт с потокобезопасностью
Классы получения 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:
Создайте проект приложения Какао в названном XCode, например,
MyRecorder
.@interface MyRecorder : NSObject
Объявите переменные экземпляра, указывающие на объекты получения.
QTCaptureSession *mCaptureSession;
QTCaptureMovieFileOutput *mCaptureMovieFileOutput;
QTCaptureDeviceInput *mCaptureVideoDeviceInput;
QTCaptureDeviceInput *mCaptureAudioDeviceInput;
Определите Интерфейсный выход Разработчика,
mCaptureView
, это указывает на aQTCaptureView
объект.IBOutlet QTCaptureView *mCaptureView;
В Вашем файле реализации сделайте следующее:
Создайте сеанс получения.
mCaptureSession = [[QTCaptureSession alloc] init];
Найдите видеоустройство и подключите свои вводы и выводы к сеансу.
QTCaptureDevice *videoDevice = [QTCaptureDevice defaultInputDeviceWithMediaType:QTMediaTypeVideo];
success = [videoDevice open:&error];
BOOL success = NO;
NSError *error;
Добавьте видеоустройство к сеансу как ввод устройства.
mCaptureVideoDeviceInput = [[QTCaptureDeviceInput alloc] initWithDevice:videoDevice];
success = [mCaptureSession addInput:mCaptureVideoDeviceInput error:&error];
Создайте вывод файла ролика и добавьте его к сеансу.
mCaptureMovieFileOutput = [[QTCaptureMovieFileOutput alloc] init];
success = [mCaptureSession addOutput:mCaptureMovieFileOutput error:&error];
if (!success) {
}
[mCaptureMovieFileOutput setDelegate:self];
Свяжите свое представление получения в UI с сеансом и запустите его выполнение.
[mCaptureView setCaptureSession:mCaptureSession];
[mCaptureSession startRunning];
Укажите опции сжатия для размера Вашего видео и качества Вашего аудиовыхода.
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];
}
Реализация запускает и останавливает действия и указывает выходное место назначения для Ваших носителей с записанными данными, в этом случае фильм в формате 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];
}
Выведите свой полученный фильм в указанном пути и откройте Ваш фильм в формате 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.
Указание опций сжатия
Особенно, на последнем шаге построения Вашего получения и рекордного приложения (Шаг 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
. Это - Ваше выходное место назначения для aQTCaptureSession
возразите, что можно использовать для обработки распакованных кадров от получающегося видео. Используя методы, предоставленные в этом классе, можно произвести распакованные видеокадры (CVImageBuffer
), как показано на рисунке 2-6, которые подходят для высококачественной обработки видеоданных.QTCaptureDeviceInput
. Этот объект является Вашим входным источником для устройств хранения данных, таких как камеры и микрофоны.
Вы выполняете эти шаги, как обрисовано в общих чертах ниже, для построения этого приложения:
Создайте Документ какао базируемый проект в XCode.
Объявите три переменные экземпляра та точка к a
QTMovie
объект, один из которых указывают для Взаимодействия через интерфейс с выходами Разработчика.IBOutlet QTCaptureView *mCaptureView;
IBOutlet QTMovieView *mMovieView;
QTMovie *mMovie;
Объявите переменные экземпляра, указывающие на три объекта.
QTCaptureSession *mCaptureSession;
QTCaptureDeviceInput *mCaptureDeviceInput;
QTCaptureDecompressedVideoOutput *mCaptureDecompressedVideoOutput;
Объявите метод IBAction.
- (IBAction)addFrame:(id)sender;
Установите сеанс получения, выводящий необработанные кадры, которые Вы хотите захватить.
[mMovieView setMovie:mMovie];
if (!mCaptureSession) {
BOOL success;
mCaptureSession = [[QTCaptureSession alloc] init];
Добавьте ввод устройства для того устройства к сеансу получения.
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;
}
Добавьте распакованный видеовыход, возвращающий необработанные кадры сеансу.
mCaptureDecompressedVideoOutput = [[QTCaptureDecompressedVideoOutput alloc] init];
[mCaptureDecompressedVideoOutput setDelegate:self];
success = [mCaptureSession addOutput:mCaptureDecompressedVideoOutput error:&error];
if (!success) {
[[NSAlert alertWithError:error] runModal];
return;
}
Предварительно просмотрите видео от сеанса в окне документа.
[mCaptureView setCaptureSession:mCaptureSession];
Запустите сеанс.
[mCaptureSession startRunning];
}
}
Реализуйте метод делегата это
QTCaptureDecompressedVideoOutput
вызовы каждый раз, когда это принимает кадр. Обратите внимание на то, что этот метод вызывают для каждого входящего кадра.- (void)captureOutput:(QTCaptureOutput *)captureOutput didOutputVideoFrame:(CVImageBufferRef)videoFrame withSampleBuffer:(QTSampleBuffer *)sampleBuffer fromConnection:(QTCaptureConnection *)connection
Сохраните последний кадр. Необходимо выполнить это в a
@synchronized
блокируйте, потому что этот метод делегата не вызывают на основном потоке.{
CVImageBufferRef imageBufferToRelease;
CVBufferRetain(videoFrame);
@synchronized (self) {
imageBufferToRelease = mCurrentImageBuffer;
mCurrentImageBuffer = videoFrame;
}
CVBufferRelease(imageBufferToRelease);
}
Получите новый кадр. Необходимо выполнить это в a
@synchronized
блокируйте, потому что метод делегата, устанавливающий новый кадр, не вызывают на основном потоке.- (IBAction)addFrame:(id)sender
{
CVImageBufferRef imageBuffer;
@synchronized (self) {
imageBuffer = CVBufferRetain(mCurrentImageBuffer);
}
Создайте
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
и примеры устройств, поддерживающих их:
Тип среды | Описание | Устройства в качестве примера |
---|---|---|
| Носители, который только содержит видеокадры. | камеры iSight (внешний и встроенный); USB и веб-камеры FireWire |
| Мультиплексированные носители, которые могут содержать аудио, видео и другие данные в едином потоке. | Камеры DV |
| Носители, который только содержит аудиосэмплы. | Встроенные микрофоны и строка - в разъемах; микрофон, встроенный к внешнему 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 выбирать самый оптимальный видео конвейер для требуемого вывода.