Как создать приложение для мобильного стриминга на iOS
Прямые эфиры с мобильных устройств позволяют поддерживать связь с аудиторией, где бы вы ни находились. Сервисы, которые предоставляют такую возможность, пользуются огромной популярностью и применяются в самых разных сферах.
В прошлой статье «Как создать приложение для мобильного стриминга на Android» мы говорили о том, как организовать стриминг на Android. А в этом материале подробно рассмотрим, как создать собственное приложение для стримов на iOS, и разберём, как интегрировать его с EdgeStreaming.
Потоковые протоколы
Для отправки видео и аудио через публичные сети существуют протоколы потоковой передачи. Один из самых распространённых протоколов для доставки видеофайлов — RTMP. Его приём поддерживают большинство стриминговых платформ. Он надёжный и отлично подходит для стриминга в высоком качестве благодаря низкой задержке и ретрансляции пакетов данных на основе протокола TCP.
Для распространения и проигрывания контента на устройствах пользователей стриминговые платформы предлагают популярные и масштабируемые форматы вещания — HLS и DASH. Устройства на iOS оснащены нативным плеером AVPlayer, который поддерживает HLS, поэтому остановимся именно на этом протоколе.
Выбор библиотеки для формирования RTMP-потока
Опенсорс-решений для RTMP-стриминга с iOS-устройств немного, а действительно рабочих вариантов ещё меньше. Давайте рассмотрим основные:
- LFLiveKit — устаревшее: последний коммит — 21.12.2016.
- HaishinKit — поддерживается на текущий момент, бесплатное.
- Larix SDK — рабочее решение, но платное ($300 за предоставление исходников).
- KSYLive — устаревшее: последний коммит — 22.03.2020, описание на китайском языке.
Учитывая всё это, самой подходящей будет HaishinKit. Это относительно новое, рабочее и при этом бесплатное решение с хорошей документацией.
К тому же у HaishinKit много плюсов:
- Постоянно обновляется
- Поддерживает RTMP
- Удобно устанавливается в приложение
- Скрывает работу с AVCaptureSession внутри себя: удобно, когда приложению не требуется дополнительная работа с сессией
- Поддерживает переключение и отключение камеры, отключение микрофона во время стрима
- Умеет изменять разрешение, битрейт, включать и выключать видео и аудио во время трансляции
- Даёт возможность достаточно гибко настроить параметры стриминга
- Есть возможность ставить эфир на паузу
Но есть и несколько минусов:
- Нет возможности использовать адаптивный битрейт
- Скрывает работу с AVCaptureSession внутри себя — это может вызвать проблемы, когда необходимы какие-либо действия с поступающими аудио и видео
Реализация стриминга по RTMP-протоколу с iOS-устройств
В HaishinKit есть два типа объектов для стриминга: RTMPStream и RTMPConnection.
Давайте пошагово разберём, как организовать мобильный стриминг.
1. Init
Чтобы воспользоваться HaishinKit в своём проекте, добавляем её через SPM, указав:
2. Разрешения
Указываем необходимые разрешения в Info.plist проекта:
- NSMicrophoneUsageDescription (Privacy — Microphone Usage Description).
- NSCameraUsageDescription (Privacy — Camera Usage Description).
3. Отображение потока с камеры
При стриминге с камеры смартфона надо видеть, что транслируется. Для этого есть соответствующий View, который будет отображать поток с камеры на экране. В iOS для этих целей применяется объект класса MTHKView, ĸ которому прикрепляется объект RTMPStream.
4. Подготовка к трансляции
Прежде всего настраиваем и активируем AVAudioSession. Сделать это можно в классе приложения AppDelegate:
Создаём объекты RTMPConnection и RTMPStream:
Задаём параметры потока rtmpStream:
5. Адаптивный битрейт
Для реализации адаптивного битрейта применяется два метода RTMPStreamDelegate:
- func rtmpStream (_stream: RTMPStream, didPublishSufficientBW connection: RTMPConnection) – вызывается каждую секунду, если пропускной способности хватает, применяется для повышения.
- func rtmpStream (_stream: RTMPStream, didPublishInsufficientBW connection: RTMPConnection) – вызывается, когда пропускной способности не хватает, применяется для понижения.
Пример реализации:
6. Фоновый стриминг
Apple не позволяет снимать видео в фоне, а значит, библиотека не может отправлять видеофрагменты на сервер. На стороне сервера из-за этого возникают сбои, и live-стрим прерывается.
Чтобы исправить этот недостаток, требуется версия с расширенным функционалом.
7. Запуск и остановка прямого эфира
Подключаемся к серверу и запускаем эфир:
Чтобы поставить стрим на паузу, используем булевое свойство paused со значением true:
Интеграция со стриминговой платформой EdgeЦентр
Для взаимодействия с EdgeStreaming понадобится EdgeЦентр API. Запросы будем выполнять нативным кодом с помощью методов структуры NetworkManager, которая передает файлы в класс HTTPCommunication. Парсинг данных происходит через протокол CodingKey с помощью структуры DataParser. Но подойдёт и любая другая HTTP-библиотека.
Пример метода для создания запроса:
Авторизация
Для работы с API надо авторизоваться. Для этого потребуются указанные при регистрации email и пароль для получения Access Token, который нужно будет применять в следующих запросах.
Получение PUSH URL
Получить URL для отправки RTMP-потока можно двумя способами:
Способ 1. Отправить Get all live streams для получения всех live-потоков. В ответе мы получим данные по всем созданным в аккаунте потокам.
Пример отправки:
Способ 2. Отправить Get live stream для получения конкретного live-потока. В ответе мы получим информацию только о запрошенном потоке, если такой существует.
Пример отправки:
Из ответов получаем push_url и берём его в качестве URL для отправки RTMP-потока. После начала стрима эфир запустится автоматически. Выбираем нужный поток в личном кабинете. Можно воспользоваться предварительным просмотром, прежде чем публиковать стрим на свой сайт или в плеер.
Воспроизведение активной трансляции
С помощью EdgeStreaming можно показать live-стрим на сторонних ресурсах в разных форматах, в том числе в HLS.
Одновременное транслирование и показ на одном устройстве мы в нашем примере рассматривать не будем. Стриминг должен быть запущен с любого другого устройства.
Для проигрывания активного стрима используем стандартный iOS видеоплеер AVPlayer.
Запуск воспроизведения
Перед началом нужно встроить hls_playlist_url активной трансляции в плеер при его инициализации. hls_playlist_url возвращается в ответе на Get live stream, о котором мы говорили выше.
Инициализация плеера:
Вашим зрителям останется только нажать на кнопку «плей» и начать просмотр.
Подведём итоги
В наших примерах мы показали простой и быстрый способ, как организовать онлайн-трансляцию в iOS-приложении. Всё, что вам понадобится, — это опенсорс-библиотека HaishinKit и EdgeStreaming. Вы можете легко скопировать код с наших примеров, подключиться к нашей платформе и запустить live-стрим без лишних усилий.