Как создать приложение для мобильного стриминга на Android
Эфиры с мобильных устройств позволяют поддерживать связь с аудиторией, где бы вы ни находились. Сервисы, которые предоставляют такую возможность, пользуются огромной популярностью и применяются в самых разных сферах и индустриях.
В этой статье подробно рассмотрим, как создать собственное приложение для стриминга с телефона и просмотра прямых трансляций на Android с нуля, и разберём, как интегрировать его с EdgeStreaming.
Протоколы потоковой передачи
Для отправки видео и аудио через публичные сети задействуются протоколы потоковой передачи. Один из самых популярных потоковых протоколов — RTMP. Его приём поддерживают большинство стриминговых платформ. Он надёжный и отлично подходит для проведения лайв-стримов благодаря низкой задержке и ретрансляции пакетов данных на основе протокола TCP.
Для распространения и показа контента на устройствах пользователей стриминговые платформы предлагают популярные и масштабируемые форматы вещания — HLS и DASH. Устройства на Android оснащены нативным плеером MediaPlayer, который поддерживает HLS, поэтому остановимся именно на этом протоколе.
Выбор библиотеки для формирования RTMP-потока
Опенсорс-решений для прямых RTMP-трансляций с Android-телефонов немного, а действительно рабочих вариантов ещё меньше. Давайте рассмотрим некоторые из них.
1. RTMP-RTSP-STREAM-CLIENT-JAVA
Плюсы:
- Свежая, стабильно обновляется
- Поддержка минимальной API 16
- Поддержка Camera и Camera2 API
- Переключение камеры во время live-стриминга
- Адаптивный битрейт
- Включение и выключение аудио и видео во время стрима
- Возможность настроить параметры трансляции
- Установка OpenGL-фильтров, изображений, GIF или текста в реальном времени
- Простое использование: всё работает «из коробки», без дополнительных манипуляций
- Наличие документации и инструкций на GitHub
- Удобный импорт через Gradle
Минусы:
- Отсутствует функция приостановки live-стрима
2. Hashinkit
Плюсы:
- Стабильно обновляется
- Поддерживает RTMP
- Использует актуальный Camera2 API
- Поддерживает переключение камеры во время стрима
- Позволяет настроить параметры трансляции
Минусы:
- Отсутствует возможность использования адаптивного битрейта
- Отсутствует функция приостановки стрима
3. Livevideobrodcaster
Плюсы:
- Поддержка минимального API 28
- Переключение камеры во время стрима
- Адаптивное качество (фреймрейт и битрейт)
- Включение и отключение аудио во время трансляции
Минусы:
- Устаревшая: последний ĸоммит — 28.07.2020
- Использует устаревший Camera API
- Отсутствует импорт через Gradle
- Значительно сложнее в реализации, чем предыдущие варианты
- Фреймы, отправляемые библиотекой, содержат ошибки (DC, AC, MV)
В итоге из трёх вариантов больше всего плюсов и меньше всего минусов у rtmp-rtsp-stream-client-java. Поэтому мы считаем её самым подходящим решением.
Реализация стриминга по RTMP-протоколу с Android-смартфона
В выбранной библиотеке есть несколько типов объектов для стриминга: RtmpCamera1 и RtmpCamera2. В первом для захвата видео применяется Camera API, во втором — Camera2 API.
Мы рекомендуем использовать первый, так как второй устарел начиная с Android API level 21. В нашем примере — актуальный RtmpCamera2.
Сейчас мы пошагово рассмотрим, как rtmp-rtsp-stream-client-java поможет в мобильном стриминге. Но сначала давайте кратко разберём схему её работы.
- При вызове метода происходит захват камеры.
- Захваченная сессия поступает на вход OpenGlView, где показывается пользователю.
- При вызове метода устанавливается соединение с удаленным сервером.
- Захваченная сессия передаётся по RTMP-протоколу на указанный rtmpUrl.
А теперь давайте пошагово разберём, как организовать мобильный онлайн-стриминг.
1. Init
Чтобы использовать библиотеку в своём проекте, необходимо разместить зависимости в build.gradle:
2. Разрешения
Указываем необходимые разрешения в файле AndroidManifest.xml:
3. Отображение потока с камеры
При стриминге со смартфона надо видеть, что транслируется. Для этого есть соответствующий View, который будет отображать видео на экране. В Android применяется SurfaceView или TextureView. Ещё в используемой библиотеке есть собственный OpenGlView, который наследуется от SurfaceView.
С RtmpCamera1 можно применить любой из этих View, а с RtmpCamera2 доступен только OpenGlView. Но среди них только он позволяет включать в стриминг различные фильтры, изображения, GIF или текст.
Добавляем OpenGlView ĸ Layout Activity или Fragment, чтобы видеть стрим:
4. Подготовка к трансляции
Чтобы инициализировать объект RtmpCamera2, нужен объект OpenGlView и реализация интерфейса ConnectCheckerRtmp:
Для использования адаптивного битрейта вносим дополнения в реализацию этого интерфейса:
В объект OpenGlView добавляем ĸоллбэĸ, в соответствующих методах которого будем запускать и останавливать превью:
Создаём объект RtmpCamera2, с помощью которого будет осуществляться стриминг:
5. Запуск и остановка эфира
Задаём параметры видео и аудио, запускаем live-стриминг.
Live-стрим с параметрами по умолчанию:
Эфир с кастомными параметрами:
Останавливаем стрим:
Интеграция со стриминговой платформой EdgeЦентр
Для взаимодействия с EdgeStreaming понадобится EdgeЦентр API. Запросы будем выполнять с помощью Retrofit совместно с RxJava. При желании можно выбрать любой другой способ отправки HTTP-запросов.
Авторизация
Для работы требуется авторизация. Применим указанные при регистрации email и пароль для получения Access Token, который будет использоваться в следующих запросах.
Получение PUSH URL
Получить URL для отправки RTMP-потока можно двумя способами:
Способ 1. Отправить запрос Get all live streams для получения всех live-потоков. В ответе мы получим данные по всем созданным в аккаунте видеопотокам.
Пример отправки:
Способ 2. Отправить Get live stream для получения конкретного live-потока. В ответе мы получим информацию только о запрошенном видеопотоке, если такой существует.
Пример отправки:
Из ответов получаем push_url и берём его в качестве URL для отправки RTMP-потока. После начала стрима трансляция запустится автоматически. Выбираем нужный поток в личном кабинете. Можно воспользоваться предварительным просмотром, прежде чем публиковать стрим на свой сайт.
Воспроизведение активной трансляции
С помощью EdgeStreaming можно показать стрим на сторонних ресурсах (в том числе в социальных сетях) в разных форматах, в том числе в HLS.
Одновременную запись и проигрывание на одном устройстве мы в нашем примере рассматривать не будем. Стриминг должен быть запущен с любого другого устройства.
Для воспроизведения активного стрима берём стандартный MediaPlayer Android. Если вы хотите получить больше контроля над видеопотоком и возможность кастомизации, мы рекомендуем обратить внимание на ExoPlayer.
Отображение на экране
Для отображения видеопотока на экране смартфона понадобится VideoView. Добавляем его в Layout Activity или Fragment, в котором вы планируете проигрывание:
Запуск воспроизведения
Перед началом встраиваем hls_playlist_url активного эфира в проигрыватель при его инициализации. hls_playlist_url возвращается в ответе на Get live stream, о котором мы говорили выше.
Инициализация плеера:
Как только инициализация завершится, запускаем стрим вызовом метода videoView.start().
Запуск плеера:
Подведём итоги
Организовать онлайн-трансляцию в Android-приложении с помощью наших примеров довольно просто и не займёт много времени. Всё, что вам понадобится, — это опенсорс-библиотека rtmp-rtsp-stream-client-java и наша стриминговая платформа.