Воспроизведение видео в iOS приложениях

This post is also available in: Английский

iOS video player

Мобильные устройства Apple на операционной системе iOS заслуженно снискали всеобщую популярность среди покупателей. За каждым событием компании следят с большим интересом, ожидая появления новых и улучшения существующих функций. Но обычные пользователи могут лишь поверхностно оценивать внешнюю составляющую продукта. Взгляду разработчиков же открывается гораздо больше. Из всей четырехдневной конференции WWDC публично освещается обычно всего один доклад — keynote, кратко рассказывающий об основных нововведениях. Все остальные доклады, а всего их около ста, посвящены разработчикам. Это соотношение позволяет оценить скрытую часть айсберга, которая не менее интересна, чем то, что видно на поверхности. Начиная цикл статей о разработке под iOS, мы расскажем о функциональности встроенных в устройства Apple фреймворков для работы с онлайн-видео.

Иерархия фреймворков iOS для работы с видео включает следующие библиотеки:

Media Player Framework

Media Player Framework содержит класс MPMoviePlayerController, который реализует полностью готовый к использованию в собственных приложениях видеоплеер, который практически полностью повторяет плеер стандартного приложения «Видео».

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


1
2
3
4
MPMoviePlayerViewController* theMoviePlayer =
                   [[MPMoviePlayerViewController alloc]
                    initWithContentURL:[NSURL URLWithString:media_url]];
[self presentMoviePlayerViewControllerAnimated:theMoviePlayer];

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

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

Media Player позволяет воспроизводить контент в фоновом режиме, когда приложение свернуто или экран устройства заблокирован. Для этого в настройках приложения требуется указать параметр UIBackgroundModes со значением audio и задать категорию аудиосессии AVAudioSessionCategoryPlayback, используя API класса AVAudioSession.

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

AV Foundation Framework

AV Foundation не содержит готовых визуальных компонентов наподобие MPMoviePlayerController, но зато предоставляет более детализированный программный интерфейс для работы с медиаданными и позволяет реализовать собственный плеер целиком с нуля.

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

AVAsset - базовый класс, описывающий единицу медиаконтента, как единое целое, включающее треки, метаинформацию и прочее. Важной особенностью при работе с этим классом является то, что он может быть не готов к использованию сразу после инициализации. Многие свойства контента, такие как длительность, наличие треков и вообще возможность воспроизведения, становятся доступными асинхронно, а могут и вовсе не быть получены, например, в случае недоступности контента при загрузке по сети. Состояние воспроизведения asset-а отделено в отдельный класс AVPlayerItem, что позволяет одновременно воспроизводить один и тот же asset независимо друг от друга в нескольких плеерах. Экземпляры класса AVPlayerItem воспроизводятся с помощью объекта AVPlayer, перенаправляющего вывод на специальный слой Core Animation, имеющий тип AVPlayerLayer. К этому слою применимы все эффекты оформления, анимации, геометрические преобразования, как и к обычным слоям. Краткий обзор минимального кода, необходимого для воспроизведения видео, приведен в разделе руководства для разработчиков Putting it all Together: Playing a Video File Using AVPlayerLayer.

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

Класс AVAssetImageGenerator позволяет независимо от текущего воспроизведения вытаскивать из видеоресурса отдельные кадры, последовательности кадров или их уменьшенные копии для целей предварительного просмотра.

Класс AVAssetReader позволяет получить наиболее полный контроль над воспроизведением контента. С его помощью можно считывать и получать в удобном для дополнительной обработки виде отдельные сэмплы аудио- и видеодорожек asset-а. Затем эти сэмплы можно обработать любым доступным способом и показать пользователю или записать в файл с помощью AVAssetWriter. Например, добавить звуковые эффекты, отобразить визуальное представление аудиотрека, добавить различные фильтры к видео, натянуть воспроиводящееся видео как текстуру на трехмерный объект, и т.д. В общем, возможности ограничиваются фантазией разработчика, а также скоростью обработки кадров, так как при работе с AVAssetReader не может гарантироваться скорость считывания сэмплов в реальном времени.

Объект asset может содержать несколько альтернативных аудиодорожек и субтитров, например для разных языков. С помощью метода [AVPlayerItem selectMediaOption:inMediaSelectionGroup:] можно выбрать из них подходящие в том или ином случае.

Технология AirPlay позволяет авторам приложений для мобильных устройств задействовать телевизор подключенный к приставке Apple TV 2 как для зеркалирования основного экрана, так и для отображения дополнительного контента. В фреймворке AV Foundation для работы с AirPlay предусмотрено свойство объекта AVPlayer usesAirPlayVideoWhileAirPlayScreenIsActive, позволяющее установкой одного флага включить поддержку этой технологии. AirPlay может работать не только для нативных приложений, но и в веб среде.

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

Apple HTTP Live Streaming

Технология HTTP Live Streaming, которой мы уделяем большое внимание в блоге, занимает ключевое место в разработке приложений для просмотра онлайн-видео. Она обеспечивает на транспортном уровне всю расширенную функциональность помимо простого воспроизведения, которая доступна через AV Foundation. Стандарт HTTP LS разработан и запатентован компанией Apple. Он приобретает огромную популярность в онлайн видеовещании в последнее время, так как обладает рядом характеристик, делающих его идеальной технологией для передачи видео по сети. Он поддерживается большинством мобильных устройств и устройств ориентированных на просмотр видео, таких как телевизоры. Все новые функции описанные в стандарте появляются на устройствах Apple в первую очередь. Одним из основных достоинств технологии HTTP LS является возможность автоматически подстраивать вещание видеопотока под доступную ширину канала. Другие функции, которые становятся возможными благодаря ей, включают:

Требования Apple к приложениям

При проверке приложений перед выкладыванием в App Store тестировщики Apple среди прочего проверяют и функциональность приложения, связанную с видеовещанием. Перечислим основные требования, которые необходимо соблюсти:

Максимальные и рекомендуемые параметры кодирования видео для передачи по сети можно найти на странице 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 не является доступной для сторонних разработчиков даже на коммерческой основе.

При составлении этого обзора были использованы следующие источники:

Обновлено Mon Jan 2 23:16:57 2017 +0300