Amazon IVS: как быстро добавить видеотрансляции в приложение или на сайт

Video live streaming — это технология потоковой трансляции видео тысячам и миллионам зрителей в режиме близком к реальному времени. Видеостриминг находит своё применение в различных областях:

  • фитнес и образование;

  • онлайн события: презентации, конференции, семинары;

  • электронная коммерция;

  • музыкальные концерты;

  • игры и киберспорт.

В этой статье мы рассмотрим, как можно легко интегрировать видеотрансляции в приложение или на сайт, используя Amazon Interactive Video Service.

Что такое AWS Interactive Video Service?

AWS Interactive Video Service — это решение для прямых трансляций, которое быстро интегрируется в мобильные и веб-приложения.

В рамках своего сервиса Amazon предлагает:

  • быстрое создание новых трансляций в течении пары минут;

  • низкая (менее 3 секунд) задержка доставки видеопотока для зрителей;

  • простая интеграция с мобильными приложениями и веб-сайтами через SDK для трансляции и проигрывания видео;

  • масштабирование до десятков тысяч одновременных зрителей;

  • сохранение трансляции для просмотра в записи.

Ещё одна интересная возможность — это встраивание в трансляцию метаданных с гарантией их получения всеми зрителями. Метаданные будут синхронизированы с видео- и аудиопотоками. С помощью этой функциональности можно добавлять интерактивное взаимодействие со зрителями:

  • обновлять статистику в видеоигре;

  • показывать зрителю опросник и давать возможность выбрать ответ во время вебинара;

  • предоставлять информацию о продукте и давать возможность купить демонстрируемый товар во время трансляций в e-commerce приложениях.

Amazon предоставляет SDK для iOS, Android и Web для интеграции вещания и проигрывания видео. Также на сайте AWS можно найти SDK для работы с IVS более чем на 10 языках программирования, включая Java, Python и Go.

Чтобы понять как работать с AWS IVS, давайте реализуем пример, состоящий из трёх компонент:

  • стриминг видео из браузера;

  • проигрывание видео в браузере;

  • управление каналами и отправка метаданных зрителям на бэкенде.

Отправка видео- и аудиопотоков

Начнём с создания минималистичной веб-страницы, на которой мы организуем вещание видеотрансляции.

Создадим html страницу и включим туда ссылку на broadcast SDK:


Далее нужно добавить canvas для отображения видео, которое мы будем транслировать:


Добавим также на страницу input элементы для ingest endpoint и stream key:

  

Ingest endpoint — это url сервера Amazon, куда будут отправляться видео- и аудиопотоки. Stream Key — текстовый ключ, который уникально идентифицирует канал вещания. Они предоставляются Amazon после создания канала.

Ну и ещё нам понадобятся 2 кнопки для запуска и остановки трансляции:



Как вы видите, на событиях onclick вызываются функции startBroadcast() и stopBroadcast(). Про них поговорим чуть позже.

С веб-страницей мы закончили, поэтому теперь перейдем к javascript коду.

Первым делом нам надо создать broadcast client:

const streamConfig = IVSBroadcastClient.BASIC_LANDSCAPE;
const client = IVSBroadcastClient.create({
    streamConfig: streamConfig,
});

SDK предлагает несколько предопределенных конфигураций, которыми можно воспользоваться. Полный список можно посмотреть в документации к библиотеке. Давайте для примера возьмём IVSBroadcastClient.BASIC_LANDSCAPE.

Чтобы отобразить на странице видео, которое мы будем захватывать с помощью камеры, привяжем созданный клиент к элементу preview:

const previewEl = document.getElementById('preview');
client.attachPreview(previewEl);

Чтобы получить список устройств, с которых мы можем производить захват видео и аудио, сделаем navigator.mediaDevices.enumerateDevices():

const devices = await navigator.mediaDevices.enumerateDevices();
const videoDevices = devices.filter((d) => d.kind === 'videoinput');
const audioDevices = devices.filter((d) => d.kind === 'audioinput');

Теперь нужно получить поток одного из доступных видео устройств и зарегистрировать его в broadcast client:

const cameraStream = await navigator.mediaDevices.getUserMedia({
    video: {
        deviceId: videoDevices[0].deviceId,
        width: {
            ideal: streamConfig.maxResolution.width,
            max: streamConfig.maxResolution.width,
        },
        height: {
            ideal: streamConfig.maxResolution.height,
            max: streamConfig.maxResolution.height,
        },
    },
});
client.addVideoInputDevice(cameraStream, 'camera1', {index: 0});

То же самое нужно сделать и для аудиопотока:

const microphoneStream = await navigator.mediaDevices.getUserMedia({
    audio: {deviceId: audioDevices[0].deviceId},
});
client.addAudioInputDevice(microphoneStream, 'mic1');

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

Всё почти готово к отправке медиапотоков на сервера AWS и началу трансляции. Осталось несколько штрихов.

Во-первых, напишем обработчика для кнопки Start Broadcast:

async function startBroadcast() {
    const streamKeyEl = document.getElementById("stream-key");
    const endpointEl = document.getElementById("ingest-endpoint");
    const start = document.getElementById("start");

    try {
        start.disabled = true;
        await window.client.startBroadcast(streamKeyEl.value, endpointEl.value);
    } catch (err) {
        start.disabled = false;
        setError(err.toString());
    }
}

Тут мы получаем ingest endpoint и stream key из input элементов на странице и вызываем метод startBroadcast() у клиента.

Во-вторых, сделаем остановку вещания через метод stopBroadcast:

async function stopBroadcast() {
    const start = document.getElementById("start");
    start.disabled = false;
    try {
        await window.client.stopBroadcast();
    } catch (err) {
        setError(err.toString());
    }
}

Итак, для вещания трансляции всё готово.

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

Перейдем к интеграции веб-плеера для проигрывания трансляции зрителям. Также, как и в примере с вещанием, создадим простую веб-страницу.

Включим ссылку на Amazon IVS Player на нашу страницу: