This post is also available in: Английский
Мобильные устройства Apple на операционной системе iOS заслуженно снискали всеобщую популярность среди покупателей. За каждым событием компании следят с большим интересом, ожидая появления новых и улучшения существующих функций. Но обычные пользователи могут лишь поверхностно оценивать внешнюю составляющую продукта. Взгляду разработчиков же открывается гораздо больше. Из всей четырехдневной конференции WWDC публично освещается обычно всего один доклад — keynote, кратко рассказывающий об основных нововведениях. Все остальные доклады, а всего их около ста, посвящены разработчикам. Это соотношение позволяет оценить скрытую часть айсберга, которая не менее интересна, чем то, что видно на поверхности. Начиная цикл статей о разработке под iOS, мы расскажем о функциональности встроенных в устройства Apple фреймворков для работы с онлайн-видео.
Иерархия фреймворков iOS для работы с видео включает следующие библиотеки:
- Media Player Framework — простой в использовании, поддерживающий большинство функций «из коробки», достаточный для большинства приложений плеер с привычным пользовательским интерфейсом.
- AV Foundation Framework — предоставляет полный набор функций для управления воспроизведением видео и позволяет реализовать плеер любой сложности. Кроме того он включает функции съемки, редактирования, записи и перекодирования аудио и видео. В этой статье мы подробно остановимся на воспроизведении.
- Core Media и Core Video Framework — описывают низкоуровневые типы данных и системные интерфейсы для манипулирования медиаконтентом.
Media Player Framework
Media Player Framework содержит класс
1 | MPMoviePlayerController |
, который реализует полностью готовый к использованию в собственных приложениях видеоплеер, который практически полностью повторяет плеер стандартного приложения «Видео».
В простейшем варианте вы можете запустить плеер буквально в несколько строк кода, используя
1 | MPMoviePlayerViewController |
. В этом случае происходит переход на контроллер плеера, а интерфейс вашего приложения становится недоступен пользователю до тех пор, пока вы не закроете плеер:
1
2
3
4 MPMoviePlayerViewController* theMoviePlayer =
[[MPMoviePlayerViewController alloc]
initWithContentURL:[NSURL URLWithString:media_url]];
[self presentMoviePlayerViewControllerAnimated:theMoviePlayer];
В чуть более сложном варианте, экземпляр
1 | MPMoviePlayerController |
инициализируется с указанием ссылки на контент, после чего его свойство view можно добавить в иерархию текущего контроллера. В этом случае плеер точно также отображается в развернутом на весь экран виде, но теперь мы может добавить собственные компоненты поверх него.
Вы можете подписаться на оповещения, отправляемые плеером, и реагировать на них в собственном коде при совершении пользователем следующих действий: начало воспроизведения, пауза, перемотка, начало и конец воспроизведения через AirPlay, изменение режима масштабирования, переход в полноэкранный режим, изменения статуса загрузки видео, получение метаинформации. Все те же действия можно выполнять и программно через протокол
1 | MPMediaPlayback |
.
Media Player позволяет воспроизводить контент в фоновом режиме, когда приложение свернуто или экран устройства заблокирован. Для этого в настройках приложения требуется указать параметр UIBackgroundModes со значением audio и задать категорию аудиосессии
1 | AVAudioSessionCategoryPlayback |
, используя API класса
1 | AVAudioSession |
.
Проблемы с этим фреймворком начинаются, когда требуется изменить функциональность плеера, реализовать какую-либо отсутствующую в стандартном плеере функцию или изменить его визуальное оформление. В таких случаях на помощь разработчику приходит фреймворк AV Foundation.
AV Foundation Framework
AV Foundation не содержит готовых визуальных компонентов наподобие
1 | MPMoviePlayerController |
, но зато предоставляет более детализированный программный интерфейс для работы с медиаданными и позволяет реализовать собственный плеер целиком с нуля.
Перечислим основные классы фреймворка, которые используются для воспроизведения.
1 | AVAsset |
— базовый класс, описывающий единицу медиаконтента, как единое целое, включающее треки, метаинформацию и прочее. Важной особенностью при работе с этим классом является то, что он может быть не готов к использованию сразу после инициализации. Многие свойства контента, такие как длительность, наличие треков и вообще возможность воспроизведения, становятся доступными асинхронно, а могут и вовсе не быть получены, например, в случае недоступности контента при загрузке по сети. Состояние воспроизведения asset-а отделено в отдельный класс
1 | AVPlayerItem |
, что позволяет одновременно воспроизводить один и тот же asset независимо друг от друга в нескольких плеерах. Экземпляры класса
1 | AVPlayerItem |
воспроизводятся с помощью объекта
1 | AVPlayer |
, перенаправляющего вывод на специальный слой Core Animation, имеющий тип
1 | AVPlayerLayer |
. К этому слою применимы все эффекты оформления, анимации, геометрические преобразования, как и к обычным слоям. Краткий обзор минимального кода, необходимого для воспроизведения видео, приведен в разделе руководства для разработчиков Putting it all Together: Playing a Video File Using AVPlayerLayer.
Помимо базовой функциональности воспроизведения, AV Foundation совместно с другими фреймворками iOS предоставляет богатый набор других возможностей, позволяющих выполнять с медиаконтентом практически все, что только можно придумать. Перечислим наиболее интересные из них.
Класс
1 | AVAssetImageGenerator |
позволяет независимо от текущего воспроизведения вытаскивать из видеоресурса отдельные кадры, последовательности кадров или их уменьшенные копии для целей предварительного просмотра.
Класс
1 | AVAssetReader |
позволяет получить наиболее полный контроль над воспроизведением контента. С его помощью можно считывать и получать в удобном для дополнительной обработки виде отдельные сэмплы аудио- и видеодорожек asset-а. Затем эти сэмплы можно обработать любым доступным способом и показать пользователю или записать в файл с помощью
1 | AVAssetWriter |
. Например, добавить звуковые эффекты, отобразить визуальное представление аудиотрека, добавить различные фильтры к видео, натянуть воспроиводящееся видео как текстуру на трехмерный объект, и т.д. В общем, возможности ограничиваются фантазией разработчика, а также скоростью обработки кадров, так как при работе с
1 | AVAssetReader |
не может гарантироваться скорость считывания сэмплов в реальном времени.
Объект asset может содержать несколько альтернативных аудиодорожек и субтитров, например для разных языков. С помощью метода
1 | [AVPlayerItem selectMediaOption:inMediaSelectionGroup:] |
можно выбрать из них подходящие в том или ином случае.
Технология AirPlay позволяет авторам приложений для мобильных устройств задействовать телевизор подключенный к приставке Apple TV 2 как для зеркалирования основного экрана, так и для отображения дополнительного контента. В фреймворке AV Foundation для работы с AirPlay предусмотрено свойство объекта
1 | AVPlayer usesAirPlayVideoWhileAirPlayScreenIsActive |
, позволяющее установкой одного флага включить поддержку этой технологии. AirPlay может работать не только для нативных приложений, но и в веб среде.
Класс
1 | AVSynchronizedLayer |
позволяет синхронизировать время в других слоях приложения с временем воспроизведения контента. Это может быть полезно, например, если вы хотите, чтобы скорость анимации элементов интерфейса зависела от скорости воспроизведения видео, или, чтобы анимация воспроизводилась в обратном направлении при перемотке видео назад.
Apple HTTP Live Streaming
Технология HTTP Live Streaming, которой мы уделяем большое внимание в блоге, занимает ключевое место в разработке приложений для просмотра онлайн-видео. Она обеспечивает на транспортном уровне всю расширенную функциональность помимо простого воспроизведения, которая доступна через AV Foundation. Стандарт HTTP LS разработан и запатентован компанией Apple. Он приобретает огромную популярность в онлайн видеовещании в последнее время, так как обладает рядом характеристик, делающих его идеальной технологией для передачи видео по сети. Он поддерживается большинством мобильных устройств и устройств ориентированных на просмотр видео, таких как телевизоры. Все новые функции описанные в стандарте появляются на устройствах Apple в первую очередь. Одним из основных достоинств технологии HTTP LS является возможность автоматически подстраивать вещание видеопотока под доступную ширину канала. Другие функции, которые становятся возможными благодаря ей, включают:
- Вещание видеопотоков в прямом эфире (Live) с возможностью перемещения по потоку в пределах последних N часов (Sliding window).
- Шифрование передаваемого контента и защищенная аутентификация зрителей по протоколу HTTPS.
- Корректная работа с большинством сервером отдачи контента, медиа дистрибуторами, системами кэширования, роутерами и файрволами, благодаря работе поверх протокола HTTP.
- Альтернативные потоки могут использоваться не только для мультибитрейта, но и для обеспечения отказоустойчивости. Вы можете указать в плейлисте два потока, обслуживающихся разными датацентрами, и приложение автоматически выберет из них тот, который доступен в данный момент.
- Передача метаданных, привязанных к времени воспроизведения. Это может использоваться, например, для вставки рекламы или показа информации о начинающейся передаче при просмотре телеканала.
- Субтитры.
- Ускоренная перемотка и скрабинг по ключевым кадрам.
Требования Apple к приложениям
При проверке приложений перед выкладыванием в App Store тестировщики Apple среди прочего проверяют и функциональность приложения, связанную с видеовещанием. Перечислим основные требования, которые необходимо соблюсти:
- Видеовещание по каналам сотовой связи должно в обязательном порядке осуществляться с использованием HTTP LS.
- Аудиодорожки у альтернативных видеопотоков с разным битрейтом должны быть полностью идентичны, чтобы избежать звуковых артефактов при переключении потоков.
- По той же причине соотношение сторон у всех видеопотоков должно совпадать.
- Один из альтернативных потоков должен быть закодирован с полосой 64 кбит/с и содержать только аудиодорожку.
Максимальные и рекомендуемые параметры кодирования видео для передачи по сети можно найти на странице Best Practices for Creating and Deploying HTTP Live Streaming Media for the iPhone and iPad.
* * *
В этой статье мы перечислили лишь те возможности платформы iOS, которые лежат на поверхности, но на самом деле их гораздо больше. Количество различных комбинаций, которые можно составить, используя функции доступных фреймворков, безгранично. К сожалению, пока еще в iOS SDK существуют и некоторые заметные пробелы. Открытые API системы не включают средств для живого вещания медиапотока, снимаемого камерой и микрофоном устройства, в сеть в реальном времени. Те приложения, которые это делают, — Facetime, Skype, Ustream, — используют закрытый код, недоступный среднему разработчику. Другой пробел, особенно заметный при работе с профессиональным видео, — отсутствие полноценной системы DRM, наподобие Adobe Access (в iOS встроено воспроизведение шифрованного контента, а для управления ключами требуется интеграция сторонних библиотек — например, Adobe Access или Widevine). Система FairPlay, с помощью которой защищает контент сама Apple не является доступной для сторонних разработчиков даже на коммерческой основе.
При составлении этого обзора были использованы следующие источники:
- AV Foundation Programming Guide
- AV Foundation Framework Reference
- Презентации и примеры кода, представленные на конференции WWDC 2010 и WWDC 2011 (доступны только зарегистрированным разработчикам).