Прямые трансляции с мобильных устройств позволяют поддерживать связь с аудиторией, где бы вы ни находились. Сервисы, которые предоставляют такую возможность, пользуются огромной популярностью и используются в самых разных сферах.
В этой статье подробно рассмотрим, как создать собственное приложение для мобильного стриминга и просмотра прямых трансляций на Android, и разберём, как интегрировать его со стриминговой платформой EdgeЦентр.
Для отправки видео и аудио через публичные сети используются протоколы потоковой передачи. Один из самых популярных протоколов для доставки потоков — RTMP. Его приём поддерживают большинство стриминговых платформ. Он надёжный и отлично подходит для проведения прямых эфиров благодаря низкой задержке и ретрансляции пакетов данных на основе протокола TCP.
Для распространения и воспроизведения контента на устройствах пользователей стриминговые платформы предлагают популярные и масштабируемые форматы вещания — HLS и DASH. Устройства на Android оснащены нативным плеером MediaPlayer, который поддерживает воспроизведение HLS, поэтому остановимся именно на этом протоколе.
Опенсорс-решений для RTMP-стриминга с Android-устройств немного, а действительно рабочих вариантов ещё меньше. Давайте рассмотрим некоторые из них.
Плюсы:
Минусы:
Плюсы:
Минусы:
Плюсы:
Минусы:
В итоге из трёх вариантов больше всего плюсов и меньше всего минусов у rtmp-rtsp-stream-client-java. Поэтому мы считаем эту библиотеку самым подходящим решением.
В библиотеке rtmp-rtsp-stream-client-java есть два типа объектов для стриминга: RtmpCamera1 и RtmpCamera2. В первом для захвата потока с камеры смартфона используется Camera API, во втором — Camera2 API.
Мы рекомендуем использовать RtmpCamera2, так как Camera API устарел начиная с Android API level 21. В нашем примере мы используем актуальный RtmpCamera2.
Сейчас мы пошагово рассмотрим, как использовать библиотеку rtmp-rtsp-stream-client-java для мобильного стриминга. Но сначала давайте кратко разберём схему её работы.
А теперь давайте пошагово разберём, как организовать мобильный онлайн-стриминг.
Чтобы использовать библиотеку rtmp-rtsp-stream-client-java в своём проекте, необходимо добавить зависимости в build.gradle:
Указываем необходимые разрешения в файле AndroidManifest.xml:
При стриминге с камеры смартфона нужно видеть, что транслируется. Для этого есть соответствующий View, который будет отображать поток с камеры на экране. В Android используется SurfaceView или TextureView. Ещё в используемой библиотеке есть собственный OpenGlView, который наследуется от SurfaceView.
С RtmpCamera1 можно использовать любой из этих View, а с RtmpCamera2 доступен только OpenGlView. Но среди них только он позволяет использовать различные фильтры, изображения, GIF или текст во время трансляции.
Добавляем OpenGlView ĸ Layout Activity или Fragment, чтобы видеть поток с камеры:
Чтобы инициализировать объект RtmpCamera2, нужен объект OpenGlView и реализация интерфейса ConnectCheckerRtmp:
Для использования адаптивного битрейта вносим дополнения в реализацию этого интерфейса:
В объект OpenGlView добавляем ĸоллбэĸ, в соответствующих методах которого будем запускать и останавливать превью с камеры:
Создаём объект RtmpCamera2, с помощью которого будет осуществляться стриминг:
Задаём параметры видео и аудио, запускаем трансляцию.
Прямой эфир с параметрами по умолчанию:
Прямой эфир с кастомными параметрами:
Останавливаем эфир:
Для взаимодействия со стриминговой платформой EdgeЦентр будем использовать EdgeЦентр API. Запросы будем выполнять с помощью Retrofit совместно с RxJava. При желании можно использовать любой другой способ отправки HTTP-запросов.
Для работы с API нужно авторизоваться. Используем указанные при регистрации email и пароль для получения Access Token, который нужно будет использовать в следующих запросах.
Получить URL для отправки RTMP-потока можно двумя способами:
Способ 1. Отправить запрос Get all live streams для получения всех live-потоков. В ответе мы получим данные по всем созданным в аккаунте потокам.
Пример отправки запроса:
Способ 2. Отправить запрос Get live stream для получения конкретного live-потока. В ответе мы получим информацию только о запрошенном потоке, если такой существует.
Пример отправки запроса:
Из ответов на эти запросы получаем push_url и используем его в качестве URL для отправки RTMP-потока. После начала стрима трансляция запустится автоматически. Выбираем нужный поток в личном кабинете. Можно воспользоваться предварительным просмотром, прежде чем публиковать стрим на свой сайт или в плеер.
С помощью стриминговой платформы EdgeЦентр можно показать трансляцию на сторонних ресурсах в разных форматах, в том числе в 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 и наша стриминговая платформа.