Техническое примечание TN2300

Переход кода QTKit к основе AV

Платформа Основы AV предоставляет мощные услуги для получения, игры, проверки, редактирования и перекодирования основанных на времени аудиовизуальных носителей. Это - рекомендуемая платформа для всей разработки, включающей основанные на времени аудиовизуальные носители.

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

Введение
Начало работы
Работа с аудиовизуальными медиаресурсами
Получение носителей и доступ к камере
Представления времени
Ссылки
История версии документа

Введение

Представленный в OS X 10.7, Основа AV является платформой, которую можно использовать, чтобы играть и создать основанные на времени аудиовизуальные носители. Платформа включает много классов Objective C с базовым классом, являющимся AVAsset; этот класс представляет универсальный и инспекционный интерфейс модели для всех форм и источников аудиовизуальных носителей. Услуги, предложенные этой платформой, включают следующее:

Для получения дополнительной информации о различных классах платформы Основы AV, см. Руководство по программированию Основы AV.

Основа AV является рекомендуемой платформой для всей новой разработки, включающей основанные на времени аудиовизуальные носители на iOS и OS X. Основа AV также рекомендуется для переходящих существующих приложений на основе QTKit. Представленный в OS X 10.4, QTKit обеспечивает ряд классов Objective C и методов, разработанных для обработки основных задач воспроизведения, редактирования, экспорта, аудио/видеосъемки и записи, в дополнение ко многим другим мультимедийным возможностям.

Этот документ описывает отображение классов QTKit и методов к более новым Фундаментальным классам AV, чтобы помочь Вам начать работать с объектами Основы AV и их связанными методами для выполнения множества задач.

Начало работы

Для понимания, что требуется, чтобы модернизировать целое приложение, создавать приложение с XCode и последним SDK, как описано в Идентификации Осуждаемого APIs с XCode.

Чтобы заставить беглый взгляд на Ваш существующий двоичный файл видеть, что QuickTime API's Вы используете, используйте процесс, описанный в Проверке Вашего существующего двоичного файла с nm.

Идентификация осуждаемого APIs с XCode

Создайте свое приложение с XCode для идентификации всего APIs то обновление потребности. Удостоверьтесь и всегда создавайте свое приложение с помощью последней версии XCode и Mac OS X SDK. Поскольку платформы развиваются посредством различных выпусков, APIs представлен или осужден, и способы поведения существующего APIs могут иногда изменяться. Всегда используя последние инструменты, можно усовершенствовать приложение с текущими версиями всех платформ.

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

Проверка существующего двоичного файла с nm

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

nm выводит на экран список имени (таблица символов) каждого объектного файла в списке аргументов. Используйте egrep утилита для фильтрации вывода от nm инструмент и получает список только QuickTime APIs.

Вот вывод в качестве примера от nm инструмент, отфильтрованный с помощью egrep легко идентифицировать QuickTime APIs:

  Вывод Listing 1 Example от nm инструмент командной строки.

$ nm -m "MyQuickTimeApp.app/Contents/MacOS/MyQuickTimeApp"  | egrep "QuickTime|QTKit"
MyQuickTimeApp.app/Contents/MacOS/MyQuickTimeApp (for architecture ppc):
00002e2c (__TEXT,__text) non-external -[MyDocument makeMyMovie]
         (undefined [lazy bound]) external .objc_class_name_QTMovie (from QTKit)
         (undefined [lazy bound]) external _CloseMovieStorage (from QuickTime)
         (undefined [lazy bound]) external _CreateMovieStorage (from QuickTime)
         (undefined [lazy bound]) external _GetMoviesError (from QuickTime)
         (undefined) external _QTAddImageCodecQuality (from QTKit)
         (undefined) external _QTAddImageCodecType (from QTKit)
         (undefined [lazy bound]) external _QTMakeTime (from QTKit)
         (undefined) external _QTMovieEditableAttribute (from QTKit)
         (undefined) external _QTMovieFlatten (from QTKit)
         (undefined) external _QTMovieNaturalSizeAttribute (from QTKit)
         (undefined [lazy bound]) external _QTNewDataReferenceFromFullPathCFString (from QuickTime)
MyQuickTimeApp.app/Contents/MacOS/MyQuickTimeApp (for architecture i386):
00003025 (__TEXT,__text) non-external -[MyDocument makeMyMovie]
         (undefined [lazy bound]) external .objc_class_name_QTMovie (from QTKit)
         (undefined [lazy bound]) external _CloseMovieStorage (from QuickTime)
         (undefined [lazy bound]) external _CreateMovieStorage (from QuickTime)
         (undefined [lazy bound]) external _GetMoviesError (from QuickTime)
         (undefined) external _QTAddImageCodecQuality (from QTKit)
         (undefined) external _QTAddImageCodecType (from QTKit)
         (undefined [lazy bound]) external _QTMakeTime (from QTKit)
         (undefined) external _QTMovieEditableAttribute (from QTKit)
         (undefined) external _QTMovieFlatten (from QTKit)
         (undefined) external _QTMovieNaturalSizeAttribute (from QTKit)
         (undefined [lazy bound]) external _QTNewDataReferenceFromFullPathCFString (from QuickTime)

Больше информации об этих инструментах может быть найдено в их соответствующих страницах справочника (например, ввести man nm от Терминального приложения).

Работа с аудиовизуальными медиаресурсами

Представление аудиовизуальных медиаресурсов

В QTKit объект QTMovie представляет играемый набор данных носителей. A QTMovie объект связан с экземплярами класса QTTrack. A QTTrack объект представляет упорядочивание и другие характеристики данных носителей в a QTMovie объект, такой как единственный видеотрек или аудиотрек. В свою очередь, a QTTrack объект связан с единственным объектом QTMedia. A QTMedia объект представляет данные, связанные с a QTTrack объект.

Основа AV

Основной класс, что использование платформы Основы AV для представления носителей является AVAsset. AVAsset экземпляр является набором одной или более частей данных носителей (аудиотреки и видеотреки), которые предназначаются, чтобы быть представленными или обработанными вместе, каждый универсальный тип среды, включая (но не ограничиваясь этим) аудио, видео, текст, субтитры и подзаголовки. Объект актива предоставляет информацию о целом ресурсе, таком как его продолжительность или заголовок, а также подсказывает для представления, такого как его естественный размер.

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

Дорожка имеет много свойств, таких как ее тип, визуальные и/или слышимые характеристики, метаданные и временная шкала. Дорожка также имеет массив описаний формата (CMFormatDescriptions), каждый из которых описывает формат выборок носителей, на которые ссылается дорожка.

Дорожка может самостоятельно быть разделена на сегменты, представленные экземплярами AVAssetTrackSegment. Сегмент является временем, отображаясь от источника до временной шкалы дорожки актива.

К данным носителей, связанным с сегментом дорожки, можно только получить доступ с помощью AVAssetReader (см. Носители Записи для получения дополнительной информации).

Вот сводка классов для представления аудиовизуальных носителей с QTKit и Основой AV:

Рисунок 1  , Представляющий Аудиовизуальные Медиаресурсы с помощью QTKit и Основы AV.

Посмотрите Пример кода 'AVSimplePlayer' для примера работы с аудиовизуальными ресурсами в Основе AV.

Создание мультимедийных объектов

A QTMovie объект может быть инициализирован от файла, от ресурса, указанного URL, от блока памяти, от области монтажа, или из существующего фильма в формате QuickTime. QTMovie класс обеспечивает много методов для инициализации и создания объектов видеоклипа такой как initWithFile:error, movieWithURL:error и другие. Посмотрите рисунок 2.

Основа AV

Можно инстанцировать актива с помощью AVURLAsset (подкласс AVAsset) с URLs, относящимся к любым аудиовизуальным медиаресурсам, таким как потоки (включая Прямые трансляции HTTP), файлы фильма в формате QuickTime, файлы MP3 и файлы других типов. Можно также инстанцировать актива с помощью других подклассов, расширяющих аудиовизуальную модель носителей, такую как AVMutableComposition делает для временного редактирования. Например, Вы создаете новый пустой непостоянный состав с помощью composition метод. Тогда можно вставить все дорожки в данном диапазоне времени указанного актива в состав с помощью insertTimeRange:ofAsset:atTime:error: метод. Посмотрите рисунок 2.

Рисунок 2  , Создающий Мультимедийные объекты с помощью QTKit и Основы AV.

Посмотрите Пример кода 'AVSimplePlayer' для примера создания мультимедийных объектов в Основе AV.

Воспроизведение

Существует три класса QTKit, использующиеся для воспроизведения фильмов в формате QuickTime:

QTMovie - Обычно используемый в сочетании с a QTMovieView объект для воспроизведения. QTMovie обеспечивает различные методы для управления воспроизведением фильма такой как play, stop, и другие. Посмотрите рисунок 3.

QTMovieView (подкласс NSView) - Используемый, чтобы вывести на экран и управлять a QTMovie объект в окне, предоставляющем выводимый на экран фильм. Когда a QTMovie связан с a QTMovieView, встроенный пользовательский интерфейс контроллера фильма может также быть выведен на экран, позволив контроль за работой пользователей воспроизведения фильма через интерфейс. Посмотрите рисунок 4.

QTMovieLayer (подкласс CALayer) - Обеспечивает уровень в который кадры a QTMovie объект может быть нарисован. Предназначенный для оказания поддержки для Базовой Анимации. Посмотрите рисунок 5.

Основа AV

В Основе AV объект контроллера проигрывателя (AVPlayer) используется для управления воспроизведением актива, например запускаясь и останавливая воспроизведение, и ища на определенное время. Проигрыватель предоставляет Вам информацию о состоянии воспроизведения, поэтому если Вы должны, можно синхронизировать пользовательский интерфейс с состоянием проигрывателя. См. список некоторых общих методов контроллера проигрывателя на рисунке 3.

Вы используете экземпляр AVPlayer играть единственный актив. Вы используете объект AVQueuePlayer играть много элементов в последовательности (AVQueuePlayer подкласс AVPlayer).

Для игры актива Вы не обеспечиваете активы непосредственно для AVPlayer объект. Вместо этого Вы обеспечиваете экземпляр AVPlayerItem. Элемент проигрывателя управляет состоянием представления актива, с которым это связано. Элемент проигрывателя содержит дорожки элемента проигрывателя — экземпляры AVPlayerItemTrack — которые соответствуют дорожкам в активе.

Можно инициализировать элемент проигрывателя с существующим активом, или можно инициализировать элемент проигрывателя непосредственно от URL. Как с AVAsset, просто инициализация элемента проигрывателя не обязательно означает, что это готово к непосредственному воспроизведению. Можно наблюдать (использующий наблюдение значения ключа) свойство состояния элемента определять, если и когда это готово играть.

  Воспроизведение Носителей рисунка 3 с помощью QTKit и Основы AV.

Вывести на экран AVPlayer объект в окне использует AVPlayerView класс в AVKit платформа. AVPlayerView подкласс NSView это может использоваться для отображения визуального содержания AVPlayer возразите и стандартное управление воспроизведением. Стиль управления воспроизведением настраиваем (встроенный, плавающий, минимальный, скрытый). Там редактируют средства управления, чтобы позволить Вам обрезать носители и удалять те части, которые Вы не хотите сохранять. Также включенный кнопка для совместного использования носителей по электронной почте, текстового сообщения, YouTube и других. AVPlayer объект связался с AVPlayerView может использоваться для управления воспроизведением носителей, например запускаясь и останавливая воспроизведение, и ища на определенную главу.

  Воспроизведение Носителей рисунка 4 к окну с помощью QTKit и Основы AV (AVKit) и отображение стандарта управляет пользовательским интерфейсом.

Можно также направить вывод a AVPlayer к специализированному Базовому Слою анимации - экземпляр AVPlayerLayer или AVSynchronizedLayer. Посмотрите рисунок 5.

  Выходное место назначения слоя анимации ядра рисунка 5 для воспроизведения.

Посмотрите Пример кода 'AVSimplePlayer' для примера воспроизведения носителей в Основе AV.

Экспорт носителей

В QTKit можно использовать QTMovie writeToFile:withAttributes: метод для экспорта существующего фильма в новый фильм указанного типа и настроек. Различные настройки для работы экспорта фильма указаны в словаре атрибутов.

Можно также использовать a QTExportSession возразите для транскодирования данного QTMovie источник (или набор QTTrack объекты) согласно настройкам в a QTExportOptions объект. Клиенты QTExportSession может реализовать QTExportSessionDelegate интерфейс для получения прогресса и информации о завершении от экземпляра QTExportSession.

Основа AV

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

Вы используете сеанс экспорта (AVAssetExportSession), чтобы повторно закодировать существующий актив в формат, определенный одной из многих обычно используемых предварительных установок.

При необходимости в большем количестве управления трансформацией можно использовать читателя актива (AVAssetReader) и писателя актива (AVAssetWriter, посмотрите Носители Записи), объект в комбинации для преобразования актива от одного представления до другого. Используя эти объекты можно, например, выбрать, какая из дорожек Вы хотите быть представленными в выходном файле, укажите свой собственный выходной формат или измените актив во время процесса преобразования.

Вы используете AVAssetReader объект получить данные носителей актива, основан ли актив на файле или представляет совокупность данных носителей из многократных источников (как с объектом AVComposition). AVAssetReader позволяет Вам считать сырые данные недекодируемые выборки носителей непосредственно от хранения.

Вы инициализируете AVAssetReader с initWithAsset:error: и assetReaderWithAsset:error: методы. Тогда вызовите startReading: подготавливать получатель к получению выборки буферизует от актива. Вы считываете данные носителей актива путем добавления один или несколько конкретные экземпляры AVAssetReaderOutput к AVAssetReader объектное использование addOutput:, тогда вызовите copyNextSampleBuffer: синхронно скопировать следующий демонстрационный буфер для вывода.

  Экспорт Носителей рисунка 6 с помощью QTKit и Основы AV.

Посмотрите Пример кода 'avexporter' для примера экспорта носителей в Основе AV.

Запись носителей

Создать пустое QTMovie то, что можно тогда добавить носители к, Вы используете initToWritableDataReference:error: метод. Этот метод создает новый контейнер хранения в расположении, указанном по условию ссылка, и возвращает a QTMovie объект, имеющий тот контейнер как его ссылку на данные по умолчанию. Тогда вызовите addImage:forDuration:withAttributes: метод к изображениям к QTMovie, использование атрибутов указано в словаре атрибутов. Посмотрите рисунок 7.

Основа AV

Вы используете писателя актива (AVAssetWriter) объект записать данные носителей в новый файл указанного контейнерного типа, такого как файл фильма в формате QuickTime или файл MPEG 4. Вы инициализируете AVAssetWriter использование assetWriterWithURL:fileType:error: и initWithURL:fileType:error: методы.

Можно получить данные носителей для актива от экземпляра AVAssetReader, или даже извне Основы AV API установлен. Данные носителей представлены AVAssetWriter для записи в форме CMSampleBuffer. Формат данных носителей описан в a CMFormatDescription. Вы используете AVAssetWriterInput добавлять выборки носителей, упакованные как CMSampleBuffer объекты или наборы метаданных, к одноколейному пути выходного файла AVAssetWriter объект с помощью appendSampleBuffer: метод.

С AVAssetWriterInput можно также установить различные свойства для выходного файла. Например, outputSettings свойство указывает настройки кодировки для носителей, добавленных к выводу. naturalSize свойство позволяет клиенту устанавливать размерности дорожки. metadata свойство является набором метаданных уровня дорожки, которые связывают с активом и переносят в выходном файле. transform свойство указывает предпочтительную трансформацию визуальных данных носителей в выходном файле в целях дисплея.

AVAssetWriterInput вводы добавляются к Вашему AVAssetWriter использование addInput: метод. Вы добавляете последовательности демонстрационных данных к вводам писателя актива в пишущем выборку сеансе. Необходимо вызвать startSessionAtSourceTime: начать один из этих сеансов.

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

Рисунок 7  Пишущий Носители с помощью QTKit и Основы AV.

Посмотрите Пример кода 'AVReaderWriter для OSX' для примера записи носителей в Основе AV.

Редактирование

Для редактирования фильмов с QTKit, Вы воздействуете на выборы фильма, а также фильм, и отслеживает сегменты. QTMovie множество предложений различных методов для редактирования фильмов. Посмотрите рисунок 8.

Когда a QTMovie связан с a QTMovieView, QTMovieView также операции редактирования поддержек на фильме. Они воздействуют на текущий выбор фильма. Посмотрите рисунок 8.

Основа AV

С Основой AV Вы используете составы (AVComposition) для создания новых активов из существующих частей носителей (обычно, один или несколько видеотреков и аудиотреки). Вы используете непостоянный состав (AVMutableComposition), чтобы добавить и удалить дорожки и скорректировать их временные упорядочивания. Например, addMutableTrackWithMediaType:preferredTrackID: метод добавляет пустую дорожку указанного типа среды к a AVMutableComposition.

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

На его верхнем уровне, AVComposition набор дорожек, каждое представление носители определенного типа среды (например, аудио или видео), согласно временной шкале. Каждая дорожка представлена экземпляром AVCompositionTrack. Каждая дорожка состоит из массива сегментов дорожки, представленных экземплярами AVCompositionTrackSegment. Каждый сегмент представляет часть данных носителей, хранивших в исходном контейнере, указанном URL, идентификатором дорожки, и время, отображаясь. URL указывает исходный контейнер, и идентификатор дорожки указывает дорожку исходного контейнера, который будет представлен.

Можно получить доступ к сегментам дорожки дорожки с помощью свойства сегментов (массив AVCompositionTrackSegment объекты) AVCompositionTrack. Набор дорожек с информацией о типе среды для каждого и каждого с ее массивом сегментов дорожки (URL, идентификатор дорожки, и время, отображаясь), формируют полное низкоуровневое представление состава. Это представление может быть выписано в любой удобной форме, и впоследствии состав может быть перераспределен путем инстанцирования нового AVMutableComposition с объектами AVMutableCompositionTrack надлежащего типа среды, каждого с его набором свойств сегментов согласно сохраненному массиву URL, идентификатора дорожки, и время, отображаясь.

  Редактирование рисунка 8 с QTKit и основой AV.

Посмотрите Пример кода 'AVSimpleEditorOSX' для примера редактирования носителей в Основе AV.

Получение выборок носителей во время воспроизведения

Ядро QuickTime 7 Видео конвейер цифрового видео позволяет Вам получать доступ к отдельным кадрам носителей во время воспроизведения. Чтобы сделать это, Вы указываете визуальный контекст (QTVisualContextRef) при подготовке фильма в формате QuickTime к воспроизведению. С QTKit Вы устанавливаете визуальный контекст для a QTMovie использование setVisualContext: метод. Визуальный контекст указывает место назначения получения, в котором Вы хотите представить свое видео. Например, это может быть пиксельным буфером или текстурировать визуальный контекст. После указания контекста получения Вы свободны управлять кадрами, как Вы желаете.

Для синхронизации видео с частотой обновления дисплея Базовое Видео обеспечивает, таймер вызвал ссылку дисплея (CVDisplayLinkRef). Ссылка дисплея делает интеллектуальные оценки для того, когда кадр должен быть выведен, на основе типа дисплея и задержек. Вы устанавливаете обратный вызов для ссылки дисплея с CVDisplayLinkOutputCallback функция, вызванная каждый раз, когда ссылка дисплея хочет, чтобы приложение вывело кадр.

Когда кадры сгенерированы для дисплея, Базовое Видео обеспечивает различные буферные типы для хранения данных изображения. Базовое Видео определяет абстрактный буфер типа CVBuffer. Все другие буферные типы получены из CVBuffer ввести. Можно использовать CVBuffer APIs на любом Базовом Видео буфере.

Основа AV

Основа AV представляет AVPlayerItemOutput класс у Пумы OS X. AVPlayerItemOutput абстрактный класс, инкапсулирующий общий API для всех AVPlayerItemOutput подклассы. Экземпляры AVPlayerItemOutput может получить отдельные выборки от AVAsset во время воспроизведения AVPlayer. Вы управляете ассоциацией AVPlayerItemOutput экземпляр с AVPlayerItem как исходный ввод с помощью AVPlayerItem addOutput: и removeOutput: методы:

Когда AVPlayerItemOutput связан с AVPlayerItem, выборки предоставлены для типа среды в соответствии с правилами для смешивания, составом или исключением что AVPlayer почести среди многократных включенных дорожек того типа среды в его собственных целях рендеринга. Например, видео носители будут составлены согласно инструкциям, предоставленным через AVPlayerItem.videoComposition, если настоящее.

AVPlayerItemVideoOutput конкретный подкласс AVPlayerItemOutput это продает видеоизображения, поскольку Базовый Видео пиксель буферизует (CVPixelBufferRef). Используйте a AVPlayerItemVideoOutput в сочетании с Базовой ссылкой Видеодисплея (CVDisplayLinkRef) или Базовая Анимация выводит на экран ссылку (CADisplayLink) точно синхронизироваться с экранными обновлениями устройства.

Рисунок 9  , Получающий Выборки Носителей во время Воспроизведения с QuickTime/QTKit и Основой AV.

Получение неподвижных изображений от видео

Для получения изображения для кадра фильма в определенное время используйте QTMovie frameImageAtTime: или frameImageAtTime:withAttributes:error: метод, принимающий словарь атрибутов.

Точно так же posterImage: метод возвращает NSImage для кадра плаката a QTMovie, и currentFrameImage: метод возвращается NSImage для кадра в текущее время в a QTMovie. Посмотрите рисунок 10.

Основа AV

Для создания изображений миниатюр видео независимо от воспроизведения с помощью Основы AV Вы инициализируете экземпляр AVAssetImageGenerator с помощью актива, от которого Вы хотите генерировать миниатюры. AVAssetImageGenerator использует включенный видеотрек (и) значения по умолчанию для генерации изображений.

Можно сконфигурировать несколько аспектов генератора изображения, например, можно указать максимальные размерности для изображений, которые он генерирует и апертурное использование режима maximumSize и apertureMode соответственно. Можно тогда генерировать единственное изображение в установленный срок или серию изображений.

Вы используете copyCGImageAtTime:actualTime:error: генерировать единственное изображение в определенное время. Основа AV может не быть в состоянии произвести изображение в точно время, которое Вы запрашиваете, таким образом, можно передать как второй параметр указатель на a CMTime это по возврату содержит время, в которое было фактически сгенерировано изображение.

Для генерации серии изображений Вы отправляете генератор изображения a generateCGImagesAsynchronouslyForTimes:completionHandler: сообщение.

Рисунок 10  , Добирающийся Неподвижные изображения от Видео с помощью QTKit и Основы AV.

Посмотрите Пример кода 'AVReaderWriter для OSX' для примера получения неподвижных изображений от видео в Основе AV.

Метаданные носителей

Метаданные являются информацией о файле, дорожке или носителях, таких как художник и заголовок дорожки MP3. В QTKit метаданные инкапсулируются в непрозрачном контейнере и получили доступ к использованию a QTMetaDataRef. A QTMetaDataRef представляет репозиторий метаданных, состоящий из одного или более собственных контейнеров метаданных. QTMovie и QTTrack APIs поддерживает объединенный доступ к этим контейнерам.

Контейнер 
Each состоит из некоторого числа элементов метаданных. Элементы метаданных соответствуют индивидуально маркированным значениям с характеристиками, такими как ключи, типы данных, информация о локали, и т.д. Вы адресуете каждый контейнер его форматом хранения (kQTMetaDataStorageFormat). Существует поддержка классических пользовательских элементов данных QuickTime, метаданных iTunes и формата контейнера метаданных QuickTime. A QTMetaDataRef может иметь один или все они. QTMetaDataRefs может быть связан с фильмом, дорожкой или носителями.

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

Основа AV

В Основе AV Активы могут также иметь метаданные, представленные экземплярами AVMetadataItem. AVMetadataItem объект представляет элемент метаданных, связанных с аудиовизуальным активом или с одной из его дорожек. Для создания элементов метаданных для собственных активов Вы используете непостоянный подкласс, AVMutableMetadataItem.

Элементы метаданных имеют ключи, согласующиеся со спецификацией формата контейнера, из которого они привлечены. Полное изложение форматов метаданных, ключей метаданных и ключевых пространств метаданных, поддерживаемых Основой AV, доступно среди определения в AVMetadataFormat.h интерфейсный файл.

Можно загрузить значения элемента метаданных «лениво» с помощью методов от AVAsynchronousKeyValueLoading протокол. AVAsset и другие классы поочередно обеспечивают свои метаданные лениво так, чтобы можно было получить объекты из тех массивов, не подвергаясь наверху для элементов, которые Вы в конечном счете не проверяете.

Можно отфильтровать массивы элементов метаданных локалью или использованием ключевого и ключевого пространства metadataItemsFromArray:withLocale: и -metadataItemsFromArray:withKey:keySpace: соответственно.

  Метаданные носителей рисунка 11.

Посмотрите Пример кода 'avmetadataeditor' для примера работы с метаданными носителей в Основе AV.

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

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

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

• Ядро

• Ввод/вывод

• Утилита

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

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

Эти классы и их отображения к различной Основе AV получают APIs, описаны более подробно в разделах ниже.

Основа AV

Основа AV также обеспечивает полный комплект получения APIs, предоставляющий Вам полный доступ к камере и предусматривающий гибкий вывод. Классы, составляющие Основу AV, получают APIs, близко напоминают тех в QTKit.

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

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

Существует четыре класса в Получении QTKit, включающие базовые классы, как показано на рисунке 12.

Класс QTCaptureSession обеспечивает интерфейс для соединения входных источников для вывода мест назначения.

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

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

Основа AV

Четыре базовых класса получения в Основе AV показаны на рисунке 12. Как в QTKit, для управления получением от устройства, такого как камера или микрофон Вы собираете объекты представлять вводы и выводы и использовать экземпляр AVCaptureSession для координирования потока данных между ними. Объекты AVCaptureInput используются для конфигурирования портов от устройства ввода данных, и объекты AVCaptureOutput используются для управления выводом к файлу ролика или неподвижному изображению.

Соединение между вводом получения и выводом получения в сеансе получения представлено объектом AVCaptureConnection. Вводы получения (экземпляры AVCaptureInput) имейте один или несколько входных портов (экземпляры AVCaptureInputPort). Выводы получения (экземпляры AVCaptureOutput) может принять данные из одного или более источников (например, объект AVCaptureMovieFileOutput принимает и видеоданные и аудиоданные).

  Ядро рисунка 12 получает классы для QTKit и основы AV.

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

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

Основа AV

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

  Классы Получения ввода/вывода рисунка 13 для QTKit и Основы AV.

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

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

Основа AV

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

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

Можно также установить свойства на устройстве захвата изображения (его режим фокуса, режим воздействия, и т.д.).

  Классы получения устройства рисунка 14 для QTKit и основы AV.

Показ пользователя, что зарегистрировано

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

Поддержка Базовой Анимации предоставлена классом QTCaptureLayer, который является подклассом CALayer (см. базовое руководство по программированию анимации). QTCaptureLayer видеокадры дисплеев, в настоящее время будучи полученным в иерархию слоев. Посмотрите рисунок 15.

Основа AV

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

  Классы рисунка 15 для Показа, Что Зарегистрировано с помощью QTKit и Основы AV.

Посмотрите Пример кода 'AVRecorder', Пример кода 'StopNGo для Mac' и Примера кода 'avvideowall' для примера получения носителей в Основе AV.

Представления времени

QTKit обеспечивает QTTime и структуры QTTimeRange для представления определенных времен и диапазонов времени в фильме или дорожке. Посмотрите рисунок 16.

Существует много функций, которые Вы используете в работе со временем, такой как QTMakeTime, QTMakeTimeRange, QTTimeIncrement, QTMakeTimeScaled и другие.

Вы используете эти функции для создания a QTTime структура, получите и установите времена, выдержите сравнение QTTime структуры, добавляют и вычитают времена и получают описание. Кроме того, другие функции также доступны для создания a QTTimeRange структура, запрашивая диапазоны времени, создавая объединения и пересечения диапазонов времени, и получая описание.

Основа AV

Время в Основе AV представлено примитивными структурами от Базовой платформы Носителей. Структура CMTime представляет отрезок времени. Более в частности, CMTime структура C, представляющая время как рациональное число с числителем ( int64_t значение), и знаменатель ( int32_t масштаб времени). Концептуально, масштаб времени указывает часть секунды, которую занимает каждый модуль в числителе. Таким образом, если масштаб времени равняется 4, каждый модуль представляет четверть секунды; если масштаб времени равняется 10, каждый модуль представляет одну десятую секунды и т.д.

В дополнение к простой временной стоимости, a CMTime может представлять нечисловые значения: +infinity, - бесконечность, и неопределенный. Это может также указать, округлилось ли время в некоторый момент, и это поддерживает число эпохи.

Основа AV обеспечивает много функций для работы с CMTime структуры. Например, Вы создаете время с помощью CMTimeMake, или одна из связанных функций такой как CMTimeMakeWithSeconds (который позволяет Вам создавать время с помощью значения плавающего и указывать предпочтительный масштаб времени). Существует несколько функций для основанной на времени арифметики и сравнить времена. Для списка всех доступных функций посмотрите Ссылку CMTime.

Если необходимо использовать CMTimes в аннотациях или Базовых контейнерах Основы, можно преобразовать a CMTime к и от a CFDictionary (см. CFDictionaryRef), использование CMTimeCopyAsDictionary и CMTimeMakeFromDictionary соответственно. Можно также получить строковое представление a CMTime использование CMTimeCopyDescription.

CMTimeRange структура C, имеющая время начала и продолжительность, оба выраженные как CMTimes. Диапазон времени не включает время, которое является временем начала плюс продолжительность.

Вы создаете использование диапазона времени CMTimeRangeMake или CMTimeRangeFromTimeToTime.

Базовые Носители обеспечивают функции, которые можно использовать, чтобы определить, содержит ли диапазон времени данное время или другой диапазон времени, или располагаются ли в два раза, равны, и вычислить объединения и пересечения диапазонов времени, такой как CMTimeRangeContainsTime, CMTimeRangeEqual, CMTimeRangeContainsTimeRange, и CMTimeRangeGetUnion.

Для списка всех доступных функций посмотрите Ссылку CMTimeRange.

Если необходимо использовать CMTimeRange в аннотациях или Базовых контейнерах Основы, можно преобразовать a CMTimeRange к и от a CFDictionary использование CMTimeRangeCopyAsDictionary и CMTimeRangeMakeFromDictionary соответственно. Можно также получить строковое представление a CMTime использование CMTimeRangeCopyDescription.

  Представления рисунка 16 времени.

Посмотрите Пример кода 'AVSimpleEditorOSX', Пример кода 'avexporter', Пример кода 'AVScreenShack' и Пример кода 'AVReaderWriter для OSX' для примера работы со временем в Основе AV.

Ссылки

Документы

Руководство по программированию основы AV

Пример кода

Пример кода 'AVSimplePlayer'

Пример кода 'AVSimpleEditorOSX'

Пример кода 'avexporter'

Пример кода 'AVScreenShack'

Пример кода 'AVReaderWriter для OSX'

Пример кода 'avvideowall'

Пример кода 'StopNGo для Mac'

Пример кода 'AVRecorder'

Пример кода 'avmetadataeditor'

Технические примечания

AVFoundation - Временной код поддержка с AVAssetWriter и AVAssetReader



История версии документа


ДатаПримечания
28.05.2013

Добавленная информация о классе AVPlayerView в новой платформе AVKit для OS X 10.9. Также добавленные разделы об идентификации осуждаемого APIs с XCode и проверки Вашего существующего двоичного файла с nm.

18.09.2012

Новый документ, обсуждающий, как перейти Ваш код QTKit к Основе AV.