Используя iChat Theater
iChat Theater позволяет приложениям отправлять дополнительные аудиотреки и видеотреки во время чата AV. Можно использовать любого NSView
как предварительно созданный источник видеосигнала или обеспечивают вспомогательное видео посредством периодических обратных вызовов для отдельных кадров. Аудио предоставлено через аудиоустройство и каналы.
Прежде, чем реализовать источник видеосигнала, необходимо выбрать буферный тип — пиксельный буфер или буфер OpenGL — который больше всего эффективно заполнен приложением во время обратного вызова. Пиксельный буфер заполнен в оперативной памяти — CPU, а не GPU. Если Вы представляете содержание с помощью OpenGL, то Вы обычно используете буфер OpenGL.
Существует несколько шагов, вовлеченных в использование iChat Theater в Вашем приложении:
Установите источник видеоданных и любые параметры видео.
Если Вы не используете
NSView
возразите как источник видеосигнала, реализуйте обратные вызовы, обеспечивающие отдельные видеокадры.Если Вы используете пиксельные буферы, реализуете пиксельные буферные методы с помощью Базового Видео. Если Вы используете OpenGL, реализуете методы OpenGL.
Создайте звуковые каналы и управляйте ими использующий Core Audio.
Используйте запуск и методы остановки для управления воспроизведением видео.
Регистр для уведомлений изменения состояния.
Необходимо зарегистрироваться для уведомлений для установления соединения с iChat Theater.
Остальная часть этой статьи объясняет, как выполнить каждый из этих шагов. Считайте Использование Представлений как статья Video Data Sources для подробных данных о том, как использовать NSView
возразите как источник видеоданных. Считайте статьи Using Pixel Buffers и Using OpenGL Buffers для подробных данных о реализации IMVideoDataSource
протокол.
Получение менеджера
Первый шаг в использовании iChat Theater должен получить совместно используемый объект менеджера, управляющий вспомогательным воспроизведением аудио и воспроизведением видео. sharedAVManager
метод класса возвращает совместно используемое IMAVManager
объект. Этот фрагмент кода получает состояние совместно используемого IMAVManager
объект:
IMAVManagerState state = [[IMAVManager sharedAVManager] state]; |
См. Ссылку класса IMAVManager для описаний различных состояний, возвращенных state
метод.
Установка источника видеоданных
Ваше приложение обеспечивает вспомогательный видеоконтент, отправляющийся по iChat Theater. Это выполняется с помощью модели делегации. Вы устанавливаете исходный объект видеоданных, соответствующий определенному протоколу, и Мгновенная платформа сообщения отправляет сообщение в объект источника данных, когда этому нужен следующий видеокадр. Следовательно, сообщения периодически отправляются в Ваш исходный объект видеоданных во время воспроизведения.
Например, этот фрагмент кода устанавливает источник видеоданных для совместно используемого IMAVManager
объект с помощью setVideoDataSource:
метод, затем устанавливает некоторые опции оптимизации с помощью setVideoOptimizationOptions:
метод, и запускает воспроизведение видео с помощью start
метод:
Перечисление 1 , Устанавливающее источник видеоданных
IMAVManager *avManager = [IMAVManager sharedAVManager]; |
[avManager setVideoDataSource:videoDataSource]; |
[avManager setVideoOptimizationOptions:IMVideoOptimizationStills]; |
[avManager start]; |
Установка параметров видео
Используйте setVideoOptimizationOptions:
метод для предоставления подсказок IMAVManager
возразите, таким образом, это может оптимизировать воспроизведение видео на основе типа источника видеосигнала.
Например, используйте IMVideoOptimizationStills
опция, если Вы совместно используете слайд-шоу как показано в Перечислении 1. Эта опция является подсказкой к iChat Theater, что видео не изменяется в течение долгих промежутков времени. Следовательно, iChat Theater предполагает, что видео не требует, чтобы много пропускной способности закодировало и отправило. Однако, если видео бесперебойно воспроизводимо, то установка этой опции оказывает негативное влияние на производительность.
Используйте IMVideoOptimizationReplacement
опция, если Вы хотите вынудить iChat Theater заменить видео исходящего локального пользователя Вашим источником видеоданных вместо того, чтобы вывести на экран оба источника видеосигнала бок о бок. При установке этой опции iChat может посвятить полный CPU и ресурсы пропускной способности к видео iChat Theater. Однако, если Вы не устанавливаете эту опцию, нет никакой гарантии, что бок о бок используется видео. iChat может заменить локальное видео при определенных обстоятельствах — например, это может заменить видео если видео, обсуждающее с приятелем на OS X v10.4 и ранее с многократными приятелями, или по медленному соединению.
Реализация источника видеоданных
Ваш источник видеоданных должен соответствовать IMVideoDataSource
неофициальный протокол. Необходимо выбрать тип буфера, который является самым эффективным для приложения.
Если Вы используете пиксельные буферы, то реализуете getPixelBufferPixelFormat:
и renderIntoPixelBuffer:forTime:
методы. Читайте Используя Пиксельные Буферы для подсказок относительно того, как реализовать эти методы.
Если Вы используете OpenGL, то реализуете getOpenGLBufferContext:pixelFormat:
и renderIntoOpenGLBuffer:onScreen:forTime:
методы. Читайте Используя Буферы OpenGL для подсказок относительно того, как реализовать эти методы.
По причинам производительности все эти обратные вызовы не вызываются на основной поток. Если Вы используете OpenGL, который не ориентирован на многопотоковое исполнение, для рендеринга обоим экрана и буфера, то необходимо принять некоторые дополнительные меры предосторожности. Читайте Используя Буферы OpenGL, чтобы узнать больше, как использовать OpenGL в многопоточном приложении.
Создание звуковых каналов
Аудиотреки не обрабатываются тот же путь как видеотреки. Вы определяете номер звуковых каналов прежде, чем играть любой AV использование setNumberOfAudioChannels:
метод. В настоящее время аудио может или быть моно или стерео. Вы получаете доступ к аудиоустройству и каналам с помощью audioDeviceUID
и audioDeviceChannels
методы соответственно. Используйте эти методы когда совместно используемое IMAVManager
находится в IMAVRunning
состояние; иначе, они возвращаются nil
.
Используйте Core Audio, чтобы управлять каналами и создать звуковое содержимое. Например, используйте AudioHardwareGetProperty
функция в Core Audio путем передачи kAudioHardwarePropertyDeviceForUID
и значение, возвращенное audioDeviceUID
получить устройство. Считайте Обзор Core Audio для начала работы с аудио и Ссылкой Платформы Core Audio для подробных данных о Core Audio.
Можно также играть любого NSSound
по iChat Theater с помощью setPlaybackDeviceIdentifier:
и setChannelMapping:
методы NSSound
. Перечисление 2 показывает, как использовать их метод. См. Ссылку класса NSSound для подробных данных о setPlaybackDeviceIdentifier:
и setChannelMapping:
методы.
playMonoForiChat:
метод в Перечислении 2 предназначается, чтобы быть методом категории, к которому Вы добавляете NSSound
. Если звук имеет один канал, то используйте playStereoForiChat:
метод вместо play
метод NSSound
играть звук по iChat Theater. Если звук является стерео, в примере кода существует подобный метод категории.
Перечисление 2 Играя звуки по iChat Theater
- (BOOL) playMonoForiChat:(BOOL)flag { |
if (flag) { |
// Set the audio output device. |
IMAVManager *avManager = [IMAVManager sharedAVManager]; |
[self setPlaybackDeviceIdentifier:[avManager audioDeviceUID]]; |
// Get the channel info for iChat Theater. |
NSArray *channels = [avManager audioDeviceChannels]; |
NSUInteger channelCount = [channels count]; |
// For a mono sound, map its single channel to those of the IMAVManager |
NSArray *mapping = (channelCount > 0) ? [NSArray arrayWithObject:channels] : nil; |
[self setChannelMapping:mapping]; |
} else { |
// Use default playback device and channel mapping. |
[self setPlaybackDeviceIdentifier:nil]; |
[self setChannelMapping:nil]; |
} |
return [self play]; |
} |
Управление воспроизведением видео
После того, как Вы установите источник видеоданных и создадите Ваши звуковые каналы, Вы готовы начать играть содержание AV в iChat. Вы просто отправляете start
к совместно используемому IMAVManager
возразите для игры, и stop
остановить содержание AV. IMAVManager
объектные переходы через несколько состояний во время воспроизведения.
Когда Вы отправляете start
к остановленному IMAVManager
объект, это изменяет состояние от IMAVRequested
к IMAVStartingUp
, тогда к IMAVPending
, и наконец к IMAVRunning
. Когда Вы вызываете start
метод, изменения состояния сразу к IMAVStartingUp
и возвраты метода. IMAVManager
возразите асинхронно переходам к другим состояниям.
С другой стороны, когда Вы отправляете stop
к выполнению IMAVManager
объект, это изменяет состояние от IMAVRunning
, к IMAVShuttingDown
, и затем к IMAVRequested
. Когда Вы вызываете stop
метод, изменения состояния сразу к IMAVShuttingDown
и возвраты метода. IMAVManager
возразите асинхронно переходам к IMAVRequested
. stop
метод сразу возвращается если IMAVManager
объект не находится в IMAVRunning
состояние.
Регистрация для уведомления изменения состояния
При использовании iChat Theater API, IMAVManager
объект может быть во многих различных состояниях в любое время — например, в зависимости от того, вызываете ли Вы start
или stop
метод. Даже после вызова этих методов, состояния IMAVManager
объект не гарантируется, потому что ошибки могут произойти при переходе от остановленного до состояния выполнения, или другое приложение с помощью iChat Theater API может вызвать изменения состояния, которые Вы не могли бы ожидать. Вызов других методов, в то время как IMAVManager
не находится в ожидаемом состоянии, может повысить исключения или ничего не сделать.
Как правило, Вы регистрируетесь для IMAVManagerStateChangedNotification
уведомление, которое будет уведомлено, когда совместно используемое IMAVManager
возразите состоянию изменений и затем используйте state
метод для получения нового состояния. Необходимо зарегистрироваться для этого уведомления рано в приложении перед отправкой state
к совместно используемому IMAVManager
объект, потому что регистрация для этого уведомления устанавливает соединение с iChat Theater. Иначе, утвердите значения, возвращенные IMAVManager
может не быть точным.