[Перевод] Разработка приложений с использованием NexStreaming NexPlayer SDK

Разработка мобильного приложения-проигрывателя — дело непростое. Нужно обеспечить поддержку множества форматов видео, звука, субтитров. Придётся реализовать воспроизведение файлов, которые хранятся локально и в Интернете. Если вспомнить о том, что результат всех этих трудов будет исполняться в среде, к ресурсам которой следует относиться бережно, придётся заняться оптимизацией. Как подступиться к созданию качественного, быстрого и экономичного проигрывателя для Android? Ответить на этот вопрос поможет NexPlayer SDK.

7be1642401044e09a10fe86b5e25409e.jpg

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


NexStreaming — это глобальная компания, которая занимается разработкой программного обеспечения для мобильных устройств. Штаб-квартира NexStreaming находится в городе Сеуле, в Корее, а филиалы расположены в Испании, США, Японии и Китае. NexPlayer SDK — её наиболее популярный продукт. Это комплект разработки программного обеспечения для создания проигрывателей. Его используют в своих мобильных приложениях некоторые весьма известные компании, которые занимаются потоковой передачей видео. Проигрыватель совместим со всеми современными DRM-технологиями. Кроме того, его основной функционал можно расширить. Например, добавить средства для улучшения звука, поддержку рекламных вставок, функции сбора статистических сведений об аудитории.

NexPlayer SDK от NexStreaming предоставляет средства для декодирования и воспроизведения видео и аудио-данных. Разработчики приложений могут использовать SDK для быстрого создания собственных продуктов. NexPlayer SDK надёжен, стабилен, совместим с международными стандартами. Из этого материала вы узнаете о том, как с помощью NexPlayer SDK создать проигрыватель, рассчитанный на архитектуру x86.

Основные возможности


NexPlayer SDK оптимизирован для платформы x86, то есть, его полностью поддерживают устройства, построенные на этой платформе. Вот основные возможности SDK:

  • Поддержка Android 1.6 или выше
  • Проигрывание файлов форматов mp4, 3gp, avi, asf, piff
  • Поддержка технологий потоковой передачи данных HTTP Live Streaming версии 5.0 и 3GPP Progressive Download. Поддержка протоколов AES128 и HTTPS, кодеков h.264, AAC, AAC+, eAAC+. SDK позволяет работать как с программными, так и с аппаратными кодеками.
  • Поддержка субтитров в форматах .smi, .srt, .sub, 3GPP timed text, TTML (только PIFF/CFF), CEA 608 и CEA 708. Поддержка технологии Web Video Text Tracks (WebVTT).


Как создать проигрыватель для платформы x86 с использованием NexPlayer SDK


Для начала надо скачать SDK с сайта NexStreaming, заполнив небольшую форму и дождавшись электронного письма с данными для входа на закрытый раздел сайта, где и находятся материалы. В частности, среди материалов, доступных для загрузки, можно обнаружить демонстрационное приложение в .apk-файле, которое можно тут же установить на Android-устройство, пример проекта, который можно импортировать в IDE, собственно SDK в виде набора библиотек, и документацию к нему. Для того чтобы решить, какие библиотеки нужны именно вам, стоит ознакомиться с документацией и взглянуть на примеры. Разработка приложения с использованием SDK NexPlayer — дело достаточно простое и понятное, да и наличие примеров способствует его быстрому освоению. Для создания работающего приложения, которое использует NexPlayer SDK, нужно около часа.

Интеграция NexPlayer SDK в Android-приложение, рассчитанное на платформу x86, заключается в копировании библиотек и исходного кода из SDK в ваш проект. Выполнив несколько простых шагов, описанных ниже, вы оснастите приложение базовыми компонентами, которые позволят ему отлично работать на устройствах, построенных на базе компонентов от Intel. Итак, подготовительный этап заключается в следующем:

  • Скопируйте необходимые библиотеки из папки SDK/libs в папку assets/x86 собственного проекта
  • Скопируйте необходимые библиотеки из папки SDK/libs в папку libs/x86 проекта
  • Скопируйте java-файлы из SDK/src в папку src/com/nexstreaming/nexplayerengine проекта


Набор копируемых библиотек зависит от потребностей вашего приложения. Для того чтобы понять, какие именно библиотеки вам понадобятся, стоит взглянуть на демонстрационный пример и воспользоваться рекомендациями, данными ниже.

После копирования NexPlayer SDK обнаружит изменения и сможет использовать библиотеки для организации эффективной работы с ресурсами Intel. Как только все библиотеки окажутся в указанных директориях, SDK возьмёт на себя переключение между ARM и x86-версиями приложения. Если вы хотите обновить библиотеки NexPlayer SDK в уже существующем проекте, достаточно перезаписать их файлы.

NexPlayer SDK включает в себя большое количество библиотек, в том числе — тех, которые отвечают за поддержку DRM. Они находятся в папке app/assets/x86. Обязательный набор библиотек включает в себя движок проигрывателя (engine), декодеры (decoders) и средства визуализации (rendering layer). Вот их список:

  • libnexplayerengine.so
  • libnexalfactory.so
  • libnexadaptation_layer_for_dlsdk.so
  • libnexralbody_audio.so
  • libnexralbody_video_opengl.so
  • libnexral_nw_ics.so
  • libnexral_nw_jb.so
  • libnexcal_oc_ics.so
  • libnexcal_oc_jb.so
  • libnexcralbody_mc_jb.so
  • libnexcal_in_aac_x86.so
  • libnexcal_in_mp3_x86.so
  • libnexcal_in_amr_x86.so


В некоторых из имён библиотек содержится сокращение «ics». Оно указывает на то, что библиотека предназначена для Android Ice Cream Sandwich. Аббревиатура «jb» говорит о том, что библиотека предназначена для Android Jelly Bean. Если ваше приложение рассчитано на поддержку определенных версий Android, библиотеки для неподдерживаемых версий можно убрать.

Вот библиотеки, ответственные за поддержку кодеков:

  • libnexcal_h364_x86.so — библиотека поддержки видео формата H.264
  • libnexcal_aac_x86.so — библиотека поддержки звука для форматов AAC, AAC-Plus и HE-AAC
  • libnexcal_mp3_x86.so — библиотека поддержки звука для форматов MP2 и MP3


Ниже перечислены библиотеки, задача которых — поддержка субтитров:

  • libnexcal_3gpp_x86.so — поддержка формата 3GPP timed text
  • libnexcal_closedcaption_x86.so — поддержка форматов CEA 608 и CEA 708
  • libnexcal_ttml_x86.so — поддержка формата TTML (CFF)
  • libnexcal_webvtt_x86.so — поддержка формата WebVTT


Для того чтобы уменьшить размер приложения, включайте в проект только те библиотеки, которые вам необходимы.
Библиотеки из папки app/libs/x86 нужно загружать. Делается это в методе initManager () соответствующего класса. Например, для использования «NexHDSample» нужно загрузить подходящую x86-библиотеку в вышеупомянутом методе класса NexHDManager (app/src/NexHDManager.java) с помощью следующего кода:
System.loadLibrary («NexHTTPDownloaderSample_jni»);

Как отобразить видео на экране приложения, рассчитанного на платформу x86


При работе с NexPlayer SDK доступны два способа отображения видео. Это — использование подсистем вывода, основанных на NexVideoRenderer и на OpenGL. Рекомендуется применять именно NexVideoRenderer. Дело в том, что эта подсистема предоставляет уровень абстракции над сложными операциями управления поверхностями и задачами по выводу видео. Она выбирает наиболее подходящий способ вывода видео, основываясь на аппаратном обеспечении устройства и установленной на нём операционной системе.

Для того чтобы использовать NexVideoRenderer, нужно сделать следующее:

  1. Передать контекст (android.context.Context) в конструктор.
  2. Установить прослушиватели событий (NexPlayer.IListener и NexPlayer.IVideoRendererListener).
  3. Создать экземпляр объекта класса NexPlayer.
  4. Произвести необходимую подготовку NexPlayer (воспользоваться методами NexPlayer.setNexAlFactory и NexPlayer.init).
  5. Вызывать метод init объекта класса NexVideoRenderer (NexVideoRenderer.init).
  6. Добавить экземпляр NexVideoRenderer в качестве элемента интерфейса в макет.


Код класса NexVideoRenderer можно найти среди примеров использования SDK по адресу NexPlayerSample/src/com/nexstreaming/nexplayerengine/NexVideoRenderer.java

Потоковое вещание


Технология HTTP Live Streaming позволяет работать с несколькими аудио и видео-потоками. SDK эту возможность поддерживает, его API setMediaStream () позволяет выбирать потоки для воспроизведения. Сделать это можно из пользовательского интерфейса во время проигрывания материалов. Существуют следующие варианты работы с видео и звуком:

  1. Использование списка воспроизведения с различными вариантами звуковой дорожки. Видео и звук при таком подходе можно выбирать независимо.
  2. Использование списка воспроизведения с различными вариантами видео. Каждый воспроизводимый видеоклип содержит и звук и видео, но пользователь может выбирать альтернативные варианты видео. Например, это может быть материал, снятый камерой под разными углами или с разных точек.
  3. Комбинация списков доступных звуковых дорожек и видеоматериалов. Это — смесь двух вышеописанных вариантов. Основной видеопоток предоставляет видео-дорожки в различных битрейтах, но воспроизводимые с одним и тем же звуком. При этом доступны и дополнительные звуковые дорожки, например, на разных языках.


Анализ производительности и потребляемой мощности x86-приложения NexPlayerDemoApp


Ниже приводятся результаты испытаний, в ходе которых оценивается нагрузка на систему, создаваемая приложением NexPlayerDemoApp при запуске, простое, проигрывании локального MP4-файла и воспроизведении потокового видео. Приложение разработано с использованием NexPlayer SDK. Для анализа использован анализатор VTune для Android, а так же Intel SoC Watch. Испытания проводились на планшете, на котором установлена ОС Android 4.4.2. Он оснащён процессором Intel Atom Z3740 с частотой 1,6 ГГц и графическим ускорителем Intel HD Graphics (Gen 7). Устройство подключено к Интернету по Wi-Fi.

Эталонная точка измерений для устройства, построенного на процессоре Intel Atom Z3740

Пакетное состояние процессора % времени, проведенного в указанном состоянии, ядро №0 % времени, проведенного в указанном состоянии, ядро №1 % времени, проведенного в указанном состоянии, ядро №2 % времени, проведенного в указанном состоянии, ядро №3 % времени работы графического ядра
C0 4.00 2.50 0.40 0.40 0.30
C6 95.00 95.10 98.30 98.10 99.50


Приложение NexPlayerDemoApp в состоянии бездействия

Пакетное состояние процессора % времени, проведенного в указанном состоянии, ядро №0 % времени, проведенного в указанном состоянии, ядро №1 % времени, проведенного в указанном состоянии, ядро №2 % времени, проведенного в указанном состоянии, ядро №3 % времени работы графического ядра
C0 4.80 3.70 1.2 0.90 0.00
C6 93.50 94.10 93.40 93.90 100.00


Чем больше времени процессор Intel Atom Z3740 проводит в состоянии C0 во время простоя приложения — тем выше энергопотребление. В случае с NexPlayerDemoApp использование процессора очень близко к эталонной точке измерений, как результат — бездействие приложения не создаёт ненужную нагрузку на систему.

Приложение NexPlayerDemoApp при запуске

Пакетное состояние процессора % времени, проведенного в указанном состоянии, ядро №0 % времени, проведенного в указанном состоянии, ядро №1 % времени, проведенного в указанном состоянии, ядро №2 % времени, проведенного в указанном состоянии, ядро №3 % времени работы графического ядра
C0 4.80 3.70 1.2 0.90 0.90
C6 93.50 94.10 93.40 93.90 99.00


Эти данные так же очень близки к эталонной точке измерений.

Проигрывание локального видео


При воспроизведении видео x86-версия приложения NexPlayerDemoApp использует, в среднем, 33% мощности процессора. При анализе этой задачи аномалий не выявлено, при её выполнении создаётся равномерная нагрузка на процессор.

cc6bc8c6939fffa4ebf95c5e44b36d5f.png
Нагрузка на процессор, создаваемая x86-приложением NexPlayerDemoApp при проигрывании локального видео

Проигрывание потокового видео


При воспроизведении потокового видео x86-версия приложения NexPlayerDemoApp использует, в среднем, 25% мощности процессора. При анализе этой задачи аномалий не выявлено, при её выполнении создаётся равномерная нагрузка на процессор.

47df125a8fe26fe49333d506fb60c2b9.png
Нагрузка на процессор, создаваемая x86-приложением NexPlayerDemoApp при проигрывании потокового видео

Энергопотребление


Энергопотребление x86-версии приложения NexPlayerDemoApp составило примерно 3.8 Вт. Большую часть времени при измерениях осуществлялось проигрывание потокового видео, был небольшой период простоя. Остальное время ушло на воспроизведение локального видеофайла.

Приложение NexPlayerDemoApp на Android 5.0 Lollipop


Выясним, как работает демонстрационное приложение, построенное с использованием NexPlayer SDK, на Android 5.0 Lollipop. Для испытаний воспользуемся планшетом Asus Fonepad 8 на базе CPU Intel Atom Z3530. Устройство подключено к Интернету по Wi-Fi.

883d178f330dd2af7ac8ae6e9217641e.png
Главный экран приложения

На главном экране приложения можно найти несколько кнопок:

  • История просмотров (History).
  • Открыть ссылку (Open URL) — при нажатии на эту кнопку появляется всплывающее окно для ввода ссылки на потоковое видео.
  • Просмотр демонстрационных потоковых видеоклипов (Watch sample streams) — нажатие на эту кнопку открывает экран, где можно выбрать одно из предложенных видео для просмотра.
  • Воспроизведение локальных файлов (Play local files) — после нажатия на эту кнопку программа показывает список папок устройства, в которых находятся видеофайлы.


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

d4a98c04e2ccf2ee34a9309d83355bfe.png
Воспроизведение локального видео

Итоги


С помощью NexPlayer SDK можно быстро и просто разрабатывать приложения, основная задача которых — воспроизведение видео. Кроме того, проведенные испытания доказывают эффективность и низкое энергопотребление таких приложений на устройствах, построенных на платформе x86.

© Habrahabr.ru