Как автоматически записывать прямые трансляции Amazon IVS на Amazon s3
2 марта 2023 г.В последнее время в этом блоге мы много времени уделяли функциям, которые помогают нам создавать платформы пользовательского контента (UGC) с помощью Amazon Interactive Video Service (Amazon IVS). Такие функции, как модерация чата (как автоматизированная, так и manual), а создатели могут уведомлять подписчиков канала, когда их прямая трансляция онлайн.
Эти типы функций имеют большое значение для дифференциации между простым потоковым сайтом и привлекательной платформой, которая продвигает и поощряет взаимодействие между создателями и зрителями. Но есть еще одна функция, которую мы можем добавить в наше приложение UGC, чтобы развлекать и вовлекать зрителей, и это дает им возможность воспроизводить прошлые прямые трансляции.
В этом посте мы рассмотрим, как автоматически записывать прямые трансляции в корзину Amazon Simple Storage Service (Amazon S3) и воспроизводить их позже.
Конфигурации записи
Документация Amazon IVS содержит полный обзор автоматической записи в Amazon S3. а>. В этом посте мы сосредоточимся на создании конфигурации записи, связывании ее с каналом Amazon IVS и использовании Amazon CloudWatch SDK для извлечения событий записи, чтобы получить основной список воспроизведения для воспроизведения. Для начала нам нужно создать конфигурацию записи.
Использование консоли Amazon IVS для создания конфигурации записи
Чтобы начать, выберите Конфигурация записи на левой боковой панели консоли Amazon IVS.
На странице со списком Конфигурация записи выберите Создать конфигурацию записи.
Введите имя конфигурации записи и выберите, хотите ли вы, чтобы миниатюры генерировались из вашей записи. Если вы хотите, чтобы миниатюры генерировались (что является очень полезной функцией, позволяющей зрителям мельком увидеть записанный контент), введите частоту создания миниатюр.
Если вы хотите объединить прерванные потоки (IE: продолжать запись, когда вещатель отключается на короткое время из-за сетевых или других сбоев), включите Окно повторного подключения и укажите максимальный промежуток между потоками. считать их одной записью.
Затем введите имя сегмента S3, в котором будут храниться данные записи (или выберите существующий сегмент), а затем нажмите Создать конфигурацию записи.
Вы также можете создать новую конфигурацию записи непосредственно на странице Редактировать канал или при создании нового канала, нажав Создать конфигурацию записи.
n Использование AWS SDK для создания конфигурации записи
Как обычно, AWS SDK (документы Node.js ) можно использовать для создания конфигурации записи. Поскольку SDK, вероятно, является предпочтительным способом создания таких ресурсов в производственных приложениях, давайте кратко рассмотрим, как это делается.
import { IvsClient, CreateRecordingConfigurationCommand, RecordingMode } from "@aws-sdk/client-ivs";
const ivsClient = new IvsClient();
const createRecordingConfigInput = {
name: 'ivs-demo-recording-config-sdk',
thumbnailConfiguration: {
recordingMode: RecordingMode.Interval,
targetIntervalSeconds: 60,
},
recordingReconnectWindowSeconds: 30,
destinationConfiguration: {
s3: {
bucketName: 'ivs-demo-channel-stream-archive'
}
}
};
const createRecordingConfigRequest = new CreateRecordingConfigurationCommand(createRecordingConfigInput);
const createRecordingConfigResponse = await ivsClient.send(createRecordingConfigRequest);
console.log(createRecordingConfigResponse);
Приведенный выше код SDK даст результат, аналогичный следующему.
{
"$metadata": {
"httpStatusCode": 200,
"requestId": "[redacted]",
"cfId": "[redacted]",
"attempts": 1,
"totalRetryDelay": 0
},
"recordingConfiguration": {
"arn": "arn:aws:ivs:us-east-1:[redacted]:recording-configuration/[redacted]",
"destinationConfiguration": {
"s3": {
bucketName: 'ivs-demo-channel-stream-archive'
}
},
"name": "ivs-demo-recording-config-sdk",
"recordingReconnectWindowSeconds": 30,
"state": "CREATING",
"tags": {},
"thumbnailConfiguration": {
"recordingMode": "INTERVAL",
"targetIntervalSeconds": 60
}
}
}
Примечание. Корзина Amazon S3, используемая в приведенном выше примере SDK, должна уже существовать до создания конфигурации записи. При необходимости используйте AWS SDK для Amazon S3, чтобы создать корзину. сначала. Также обратите внимание: корзины Amazon S3 могут быть связаны с несколькими конфигурациями записи, и одной конфигурации может быть достаточно для связи с каждым созданным вами каналом. Нет необходимости иметь уникальную конфигурацию записи для каждого отдельного канала Amazon IVS!
Связывание конфигурации записи с существующим каналом Amazon IVS
Теперь, когда мы создали конфигурацию записи, нам нужно связать ее с каналом.
Выберите канал на странице со списком каналов Amazon IVS, нажмите Изменить, включите Автоматическую запись на S3 и выберите подходящую конфигурацию записи.
Чтобы связать конфигурацию записи с существующим каналом через AWS SDK для JavaScript, используйте команду UpdateChannelCommand
(docs) и передать arn
канала вместе с вновь созданным recordingConfigurationArn
. р>
import { IvsClient, UpdateChannelCommand } from "@aws-sdk/client-ivs";
const ivsClient = new IvsClient();
const updateChannelInput = {
arn: 'arn:aws:ivs:us-east-1:[redacted]:channel/[redacted]',
recordingConfigurationArn: 'arn:aws:ivs:us-east-1:[redacted]:recording-configuration/[redacted]',
};
const updateChannelRequest = new UpdateChannelCommand(updateChannelInput);
const updateChannelResponse = await ivsClient.send(updateChannelRequest);
console.log(updateChannelResponse);
Как только ваша конфигурация записи будет связана с каналом, все новые потоки на этом канале будут записываться на S3 по пути, соответствующему следующему формату:
/ivs/v1/<aws_account_id>/<channel_id>/<year>/<month>/<day>/<hours>/<minutes>/<recording_id>
Когда начинается запись, сегменты видео и файлы метаданных записываются в корзину Amazon S3, настроенную для канала. В уникальном пути для каждой записи будет папка /events
, содержащая файлы метаданных, соответствующие событию записи. Файлы метаданных JSON создаются, когда запись начинается, успешно завершается или завершается с ошибкой:
* события/запись-started.json * события/запись-завершен.json * события/сбой записи.json
Также будет папка /media
, содержащая все соответствующее мультимедийное содержимое в двух подпапках. Папка /hls
содержит все медиафайлы и файлы манифеста, созданные во время живого сеанса, и может воспроизводиться с помощью проигрывателя Amazon IVS.
Папка /thumbnails
будет содержать все уменьшенные изображения, созданные во время сеанса прямой трансляции.
Доступ к записанным потокам для воспроизведения
В целях безопасности все автоматически записанные прямые трансляции хранятся в частном сегменте. Из-за этого эти объекты нельзя воспроизвести с использованием прямого URL-адреса S3. Чтобы предоставить эти объекты для воспроизведения, нам потребуется создать дистрибутив Amazon CloudFront.
Откройте консоль Amazon CloudFront и нажмите Создать раздачу.
В исходном домене выберите корзину S3, связанную с конфигурацией записи. Оставьте поле Исходный путь пустым и примите Имя по умолчанию. Выберите Настройки контроля доступа Origin (рекомендуется).
Нажмите Создать параметр управления, введите Имя и Описание, затем нажмите Создать.
Согласно предупреждающему сообщению, нам нужно будет изменить политику корзины после создания дистрибутива.
При необходимости измените любые дополнительные настройки вашего дистрибутива.
После создания рассылки скопируйте политику, нажав Копировать политику.
Нажмите Перейти к разрешениям корзины S3 для обновления политики и вставьте новую политику.
С этого момента все объекты, хранящиеся в корзине S3, будут доступны через дистрибутив CloudFront. Чтобы получить к ним доступ, мы будем использовать базовый URL-адрес из нашего дистрибутива вместо стандартного базового URL-адреса S3.
Прослушивание записываемых событий
Выберите События AWS или партнерские мероприятия EventBridge.
В разделе Метод создания выберите Пользовательский шаблон (редактор JSON) и вставьте следующий шаблон. Обратите внимание, что вам нужно будет заменить YOUR_CHANNEL_NAME
существующим названием вашего канала. Если у вас нет созданного канала Amazon IVS, см. эту запись в блоге, чтобы начать.
{
"source": ["aws.ivs"],
"detail-type": ["IVS Recording State Change"],
"detail": {
"channel_name": ["YOUR_CHANNEL_NAME"],
"recording_status": ["Recording End"]
}
}
Примечание. Ваше правило моста событий может прослушивать события для всех каналов или использовать ARN канала вместо имени канала. Дополнительные сведения о создании правил EventBridge см. в документах.
Что должно выглядеть так:
На странице Цель выберите Тип цели для сервиса AWS, выберите группу журналов CloudWatch и введите имя для группы журналов.
n Введите нужные теги, подтвердите выбор и создайте правило.
Просмотр событий CloudWatch
После применения конфигурации и настройки правила моста событий все события будут регистрироваться в CloudWatch. После завершения трансляции перейдите в CloudWatch и найдите группу журналов, созданную выше. События записи вашего канала будут видны после завершения прямой трансляции, но имейте в виду, что может быть небольшая задержка между окончанием трансляции и публикацией событий записи.
{
"version": "0",
"id": "3c86196e-624f-9ccd-b89b-434414bd93b5",
"detail-type": "IVS Recording State Change",
"source": "aws.ivs",
"account": "[redacted]",
"time": "2022-12-12T20:07:16Z",
"region": "us-east-1",
"resources": [
"arn:aws:ivs:us-east-1:[redacted]:channel/[redacted]"
],
"detail": {
"recording_status": "Recording End",
"recording_status_reason": "",
"recording_s3_bucket_name": "ivs-demo-channel-stream-archive",
"recording_s3_key_prefix": "ivs/v1/[redacted]/x4aGUUxIp5Vw/2022/12/12/19/59/[redacted]",
"recording_duration_ms": 87000,
"channel_name": "demo-channel",
"stream_id": "st-[redacted]",
"recording_session_id": "[redacted]",
"recording_session_stream_ids": [
"st-[redacted]"
]
}
}
Получение зарегистрированных событий CloudWatch
Мы можем использовать AWS SDK для JavaScript версии 3, чтобы получать эти события на основе заданного времени начала/окончания.
import { CloudWatchLogsClient, FilterLogEventsCommand } from "@aws-sdk/client-cloudwatch-logs";
import util from 'node:util';
const cloudwatchClient = new CloudWatchLogsClient();
const filterLogEventsInput = {
logGroupName: '/aws/events/ivs-stream-recording-end-log-group',
startTime: 1670875080000,
endTime: 1670875200000,
};
const filterLogEventsRequest = new FilterLogEventsCommand(filterLogEventsInput);
const filterLogEventsResponse = await cloudwatchClient.send(filterLogEventsRequest);
const events = filterLogEventsResponse.events.map(e => JSON.parse(e.message));
Что дает массив событий, соответствующих критериям:
[
{
"version": "0",
"id": "8d2da908-bf44-f491-8b6e-784bdba37a1d",
"detail-type": "IVS Recording State Change",
"source": "aws.ivs",
"account": "[redacted]",
"time": "2022-12-12T19:58:27Z",
"region": "us-east-1",
"resources": [
"arn:aws:ivs:us-east-1:[redacted]:channel/[redacted]"
],
"detail": {
"recording_status": "Recording End",
"recording_status_reason": "",
"recording_s3_bucket_name": "ivs-demo-channel-stream-archive",
"recording_s3_key_prefix": "ivs/v1/[redacted]/[redacted]/2022/12/12/19/52/[redacted]",
"recording_duration_ms": 0,
"channel_name": "demo-channel",
"stream_id": "st-[redacted]",
"recording_session_id": "[redacted]",
"recording_session_stream_ids": [
"st-[redacted]"
]
}
},
{
"version": "0",
"id": "281586b5-f680-2ca6-f60a-cf5b327b15d3",
"detail-type": "IVS Recording State Change",
"source": "aws.ivs",
"account": "[redacted]",
"time": "2022-12-12T19:58:43Z",
"region": "us-east-1",
"resources": [
"arn:aws:ivs:us-east-1:[redacted]:channel/[redacted]"
],
"detail": {
"recording_status": "Recording End",
"recording_status_reason": "",
"recording_s3_bucket_name": "ivs-demo-channel-stream-archive",
"recording_s3_key_prefix": "ivs/v1/[redacted]/[redacted]/2022/12/12/19/52/[redacted]",
"recording_duration_ms": 10000,
"channel_name": "demo-channel",
"stream_id": "st-[redacted]",
"recording_session_id": "[redacted]",
"recording_session_stream_ids": [
"st-[redacted]"
]
}
}
]
Мы можем перебрать проанализированные events
и получить основной список воспроизведения для каждой записи, используя наш базовый URL-адрес CloudWatch:
events.forEach(async event => {
const playlistUrl = `https://[redacted].cloudfront.net/${event.detail.recording_s3_key_prefix}/media/hls/master.m3u8`;
console.log(playlistUrl);
});
На этом этапе мы можем подключить URL-адрес к проигрывателю IVS по адресу воспроизвести поток!
Обзор
В этом посте мы узнали, как создать конфигурацию записи для автоматической записи прямых трансляций Amazon IVS в Amazon S3. Мы также узнали, как открыть корзину Amazon S3 через раздачу CloudFront и создать URL-адрес для воспроизведения записанных потоков по требованию. В следующем посте мы узнаем о ведении журнала чата — новой функции, позволяющей регистрировать все сообщения чата из комнаты чата Amazon IVS. В следующем посте мы объединим автоматически записанные потоки с журналами чата, чтобы обеспечить полное воспроизведение по запросу.
Оригинал