Руководство. Потоковая трансляция с помощью Служб мультимедиа с помощью .NET 7.0

Логотип Служб мультимедиа версии 3


Предупреждение

Поддержка Служб мультимедиа Azure будет прекращена 30 июня 2024 г. Дополнительные сведения см. в руководстве по прекращению поддержки AMS.

В Службах мультимедиа Azure за обработку содержимого потоковой трансляции отвечают компоненты трансляций. Трансляция предоставляет входную конечную точку (URL-адрес приема), которую вы можете передать динамическому кодировщику. Трансляция получает входные потоки от динамического кодировщика с помощью протоколов RTMP/S или Smooth Streaming и делает их доступными для потоковой передачи через одну или несколько конечных точек потоковой передачи. Кроме того, трансляции предоставляют конечную точку предварительного просмотра (URL-адрес предварительного просмотра), которая позволяет просмотреть и проверить поток перед его обработкой и доставкой.

В этом руководстве показано, как использовать .NET 7.0 для создания сквозного трансляции. События сквозной трансляции полезны, если у вас есть кодировщик, способный локально кодирования с поддержкой нескольких скоростей и GOP. Это позволяет снизить затраты на облако. Если вы хотите уменьшить пропускную способность и отправить односкоростной поток в облако для кодирования с несколькими скоростями, можно использовать трансляцию перекодирования с предустановками кодирования 720P или 1080P.

Выполняя данное руководство, вы сделаете следующее:

  • Скачайте пример проекта.
  • Проверка кода, который выполняет потоковую трансляцию.
  • Просмотр события с помощью Проигрывателя мультимедиа Azure на демонстрационном сайте Проигрывателя мультимедиа.
  • Настройте Сетку событий для мониторинга трансляции.
  • Очистка ресурсов.

Предварительные требования

Для работы с этим учебником требуется следующее.

Вам также потребуются следующие элементы для программного обеспечения потоковой трансляции:

  • Веб-камера или другое устройство (например, ноутбук) для трансляции события.
  • Локальный программный кодировщик, который кодирует поток камеры и отправляет его в службу потоковой трансляции Служб мультимедиа через протокол Real-Time messaging Protocol (RTMP/S). Дополнительные сведения см. в статье о рекомендуемых локальных динамических кодировщиках. Поток должен быть в формате RTMP/S или Smooth Streaming. В этом примере предполагается, что вы будете использовать Open Broadcaster Software (OBS) Studio для трансляции RTMP/S в конечную точку приема. Установка OBS Studio.
  • Кроме того, вы можете попробовать краткое руководство по OBS, чтобы сначала протестировать весь процесс с помощью портал Azure.

Для мониторинга трансляции с помощью Сетки событий и Центров событий можно: 1. Выполните действия, описанные в статье Создание и мониторинг событий Служб мультимедиа с помощью Сетки событий с помощью портал Azure или 1. Выполните действия, описанные в конце этого руководства в разделе Мониторинг трансляций с помощью Сетки событий и Центров событий этой статьи.

Совет

Прежде чем продолжить работу, ознакомьтесь со статьей Потоковая трансляция в Службах мультимедиа Azure версии 3.

Скачивание и настройка примера

Клонируйте на свой компьютер репозиторий GitHub, содержащий пример для потоковой передачи данных .NET, с помощью следующей команды.

git clone https://github.com/Azure-Samples/media-services-v3-dotnet.git

Пример потоковой трансляции находится в папке Live/LiveEventWithDVR .

Откройте appsettings.json скачанный проект. Замените значения именем учетной записи, идентификатором подписки и именем группы ресурсов.

Важно!

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

Начало использования интерфейсов API Служб мультимедиа с пакетом SDK для .NET

Program.cs создает ссылку на ресурс учетной записи Служб мультимедиа, используя параметры из appsettings.json:

var mediaServicesResourceId = MediaServicesAccountResource.CreateResourceIdentifier(
    subscriptionId: options.AZURE_SUBSCRIPTION_ID.ToString(),
    resourceGroupName: options.AZURE_RESOURCE_GROUP,
    accountName: options.AZURE_MEDIA_SERVICES_ACCOUNT_NAME);
var credential = new DefaultAzureCredential(includeInteractiveCredentials: true);
var armClient = new ArmClient(credential);
var mediaServicesAccount = armClient.GetMediaServicesAccountResource(mediaServicesResourceId);

Создание события прямой трансляции

В этом разделе показано, как создать сквозной тип трансляции (Для LiveEventEncodingType задано значение None). Сведения о доступных типах см. в разделе Типы трансляций. Если вы хотите уменьшить общую пропускную способность приема или у вас нет локального транскодера с несколькими скоростями, можно использовать трансляцию перекодирования для облачного кодирования с адаптивной скоростью 720p или 1080p.

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

  • Протокол приема для трансляции. В настоящее время поддерживаются протоколы RTMPS и Smooth Streaming. Вы не можете изменить параметр протокола во время трансляции. Если требуются другие протоколы, создайте отдельную трансляцию для каждого протокола потоковой передачи.

  • Ограничения по IP-адресам для приема и предварительного просмотра Можно задать IP-адреса, с которых разрешено принимать видео в поток трансляции. Разрешенные IP-адреса можно указать следующим образом:

    • Один IP-адрес (например, 10.0.0.1 или 2001:db8::1);

    • Диапазон IP-адресов, использующий IP-адрес и маску подсети Inter-Domain CIDR (например, 10.0.0.1/22 или 2001:db8::/48)

    • Диапазон IP-адресов, использующий IP-адрес и маску десятичной подсети с точками (например, 10.0.0.1 255.255.252.0).

      Если IP-адреса не указаны и правила не заданы, ни один IP-адрес не разрешен. Чтобы разрешить любой IP-адрес, создайте правило и задайте значения 0.0.0.0/0 и ::/0. IP-адреса должны иметь один из следующих форматов: IPv4 или IPv6-адреса с четырьмя номерами или диапазон адресов CIDR. Дополнительные сведения см. в разделах Ограничение доступа к лицензии DRM и доставка ключей AES с помощью списков разрешенных IP-адресов.

  • Автозапуск события при его создании Если для автозапуска задано значение true, трансляция начнется после создания. Это означает, что плата начисляется сразу же после запуска события трансляции. Чтобы остановить начисление оплаты, нужно явно вызвать функцию Stop для ресурса трансляции. Дополнительные сведения см. в статье Состояния трансляции и выставление счетов.

    Существуют режимы ожидания для запуска трансляции в менее затратном состоянии "Выделено", что ускоряет переход в рабочее состояние. Это полезно в таких ситуациях, как горячие пулы, которые должны быстро раздавать каналы стримерам.

  • Статическое имя узла и уникальный идентификатор GUID Чтобы URL-адрес приема был прогнозируемым и простым в обслуживании в аппаратном динамическом кодировщике, задайте useStaticHostname для свойства значение true. Подробные сведения см. в разделе URL-адреса приема трансляции.

    var liveEvent = await mediaServicesAccount.GetMediaLiveEvents().CreateOrUpdateAsync(
        WaitUntil.Completed,
        liveEventName,
        new MediaLiveEventData(mediaServicesAccount.Get().Value.Data.Location)
        {
            Description = "Sample Live Event from the .NET SDK sample",
            UseStaticHostname = true,
            // 1) Set up the input settings for the Live event...
            Input = new LiveEventInput(streamingProtocol: LiveEventInputProtocol.Rtmp)
            {
                StreamingProtocol = LiveEventInputProtocol.Rtmp,
                AccessToken = "acf7b6ef-8a37-425f-b8fc-51c2d6a5a86a", // used to make the ingest URL unique
                KeyFrameIntervalDuration = TimeSpan.FromSeconds(2),
                IPAllowedIPs =
                {
                    new IPRange
                    {
                        Name = "AllowAllIpV4Addresses",
                        Address = IPAddress.Parse("0.0.0.0"),
                        SubnetPrefixLength = 0
                    },
                    new IPRange
                    {
                        Name = "AllowAllIpV6Addresses",
                        Address = IPAddress.Parse("0::"),
                        SubnetPrefixLength = 0
                    }
                }
            },
            // 2) Set the live event to use pass-through or cloud encoding modes...
            Encoding = new LiveEventEncoding()
            {
                EncodingType = LiveEventEncodingType.PassthroughBasic
            },
            // 3) Set up the Preview endpoint for monitoring
            Preview = new LiveEventPreview
            {
                IPAllowedIPs =
                {
                    new IPRange()
                    {
                        Name = "AllowAllIpV4Addresses",
                        Address = IPAddress.Parse("0.0.0.0"),
                        SubnetPrefixLength = 0
                    },
                    new IPRange()
                    {
                        Name = "AllowAllIpV6Addresses",
                        Address = IPAddress.Parse("0::"),
                        SubnetPrefixLength = 0
                    }
                }
            },
            // 4) Set up more advanced options on the live event. Low Latency is the most common one. Set
            //    this to Default or Low Latency. When using Low Latency mode, you must configure the Azure
            //    Media Player to use the quick start heuristic profile or you won't notice the change. In
            //    the AMP player client side JS options, set -  heuristicProfile: "Low Latency Heuristic
            //    Profile". To use low latency optimally, you should tune your encoder settings down to 1
            //    second GOP size instead of 2 seconds.
            StreamOptions =
            {
                StreamOptionsFlag.LowLatency
            },
            // 5) Optionally enable live transcriptions if desired. This is only supported on
            //    PassthroughStandard, and the transcoding live event types. It is not supported on Basic
            //    pass-through type.
            // WARNING: This is extra cost, so please check pricing before enabling.
            //Transcriptions =
            //{
            //    new LiveEventTranscription
            //    {
            //        // The value should be in BCP-47 format (e.g: 'en-US'). See https://go.microsoft.com/fwlink/?linkid=2133742
            //        Language = "en-us",
            //        TrackName = "English" // set the name you want to appear in the output manifest
            //    }
            //}
        },
        autoStart: false);
    

Получение URL-адресов приема

После создания трансляции можно получить URL-адреса приема, которые необходимо передать динамическому кодировщику. Он использует эти адреса для передачи динамического потока на вход.

// Get the RTMP ingest URL. The endpoints is a collection of RTMP primary and secondary,
// and RTMPS primary and secondary URLs.
Console.WriteLine($"The RTMP ingest URL to enter into OBS Studio is:");
Console.WriteLine(liveEvent.Data.Input.Endpoints.First(x => x.Uri.Scheme == "rtmps").Uri);
Console.WriteLine("Make sure to enter a Stream Key into the OBS Studio settings. It can be");
Console.WriteLine("any value or you can repeat the accessToken used in the ingest URL path.");
Console.WriteLine();

Получение URL-адреса предварительного просмотра

Используйте previewEndpoint для предварительного просмотра и проверки получения входных данных от кодировщика.

Важно!

Прежде чем продолжить, убедитесь, что видео правильно передается на URL-адрес предварительного просмотра.

// Use the previewEndpoint to preview and verify that the input from the encoder is actually
// being received The preview endpoint URL also support the addition of various format strings
// for HLS (format=m3u8-cmaf) and DASH (format=mpd-time-cmaf) for example. The default manifest
// is Smooth.
string previewEndpoint = liveEvent.Data.Preview.Endpoints.First().Uri.ToString();
Console.WriteLine($"The preview URL is:");
Console.WriteLine(previewEndpoint);
Console.WriteLine();
Console.WriteLine($"Open the live preview in your browser and use the Azure Media Player to monitor the preview playback:");
Console.WriteLine($"https://ampdemo.azureedge.net/?url={HttpUtility.UrlEncode(previewEndpoint)}&heuristicprofile=lowlatency");
Console.WriteLine();
Console.WriteLine("Start the live stream now, sending the input to the ingest URL and verify");
Console.WriteLine("that it is arriving with the preview URL.");
Console.WriteLine("IMPORTANT: Make sure that the video is flowing to the Preview URL before continuing!");
Console.WriteLine("Press enter to continue...");
Console.ReadLine();

Создание трансляций и их выходных данных, а также управление ими

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

В следующем разделе будет рассмотрено создание ресурса и выходных данных потоковой трансляции.

Создание ресурса

Создайте ресурс, который будет использоваться в выходных данных потоковой трансляции.

// Create an Asset for the Live Output to use. Think of this as the "tape" that will be recorded
// to. The asset entity points to a folder/container in your Azure Storage account
Console.Write($"Creating the output Asset '{assetName}'...".PadRight(60));
var asset = (await mediaServicesAccount.GetMediaAssets().CreateOrUpdateAsync(
    WaitUntil.Completed,
    assetName,
    new MediaAssetData
    {
        Description = "My video description"
    })).Value;
Console.WriteLine("Done");

Создание выходных данных потоковой трансляции

Выходные данные прямой трансляции запускаются при их создании и останавливаются при их удалении. При удалении выходных данных в реальном времени вы не удаляете выходной ресурс или содержимое в ресурсе. Ресурс с записью доступен для потоковой передачи по запросу, если он существует и с ним связан указатель потоковой передачи.

// Create the Live Output - think of this as the "tape recorder for the live event". Live
// outputs are optional, but are required if you want to archive the event to storage, use the
// asset for on-demand playback later, or if you want to enable cloud DVR time-shifting. We will
// use the asset created above for the "tape" to record to.
Console.Write($"Creating Live Output...".PadRight(60));
var liveOutput = (await liveEvent.GetMediaLiveOutputs().CreateOrUpdateAsync(
    WaitUntil.Completed,
    liveOutputName,
    new MediaLiveOutputData
    {
        AssetName = asset.Data.Name,
        // The HLS and DASH manifest file name. This is recommended to
        // set if you want a deterministic manifest path up front.
        // archive window can be set from 3 minutes to 25 hours.
        // Content that falls outside of ArchiveWindowLength is
        // continuously discarded from storage and is non-recoverable.
        // For a full event archive, set to the maximum, 25 hours.
        ManifestName = manifestName,
        ArchiveWindowLength = TimeSpan.FromHours(1)
    })).Value;
Console.WriteLine("Done");

Создание указателя потоковой передачи

Примечание

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

Вы публикуете ресурс путем создания указателя потоковой передачи. Трансляция (вплоть до длины окна DVR) доступна для просмотра до истечения срока действия или удаления указателя потоковой передачи, в зависимости от того, что наступит раньше. Именно так вы делаете видео доступным для просмотра аудитории, чтобы увидеть его в прямом эфире и по запросу. Этот же URL-адрес можно использовать для watch трансляции, окна DVR или ресурса по запросу при завершении трансляции и удалении выходных данных трансляции.

var streamingLocator = (await mediaServicesAccount.GetStreamingLocators().CreateOrUpdateAsync(
    WaitUntil.Completed,
    streamingLocatorName,
    new StreamingLocatorData
    {
        AssetName = asset.Data.Name,
        StreamingPolicyName = "Predefined_ClearStreamingOnly",
        Filters =
        {
            filter.Data.Name
        }
    })).Value;

Просмотр события

Выполните код. Используйте URL-адреса потоковой передачи выходных данных, чтобы watch трансляции. Скопируйте URL-адрес указателя потоковой передачи. Вы можете использовать проигрыватель мультимедиа по своему усмотрению. Для тестирования потока можно использовать демонстрационный сайт проигрывателя мультимедиа . Введите URL-адрес в поле URL-адрес и выберите Обновить проигрыватель.

Мониторинг трансляций с помощью Сетки событий и Центров событий

Пример проекта может использовать Сетку событий и Центры событий для мониторинга трансляции. Вы можете настроить и использовать Службу "Сетка событий" с помощью следующего:

Чтобы включить мониторинг, выполните приведенные далее действия.

  1. Использование портал Azure для создания пространства имен Центров событий и Центров событий
    1. Выполните поиск по запросу "Центры событий", используя текстовое поле в верхней части портал Azure.
    2. Выберите Концентратор событий в списке, а затем следуйте инструкциям, чтобы создать пространство имен Центров событий.
    3. Перейдите к ресурсу Пространства имен Центров событий.
    4. Выберите Центры событий в разделе Сущности в меню портала.
    5. Создайте Центры событий в пространстве имен Центров событий.
    6. Перейдите к ресурсу Центров событий.
    7. Выберите Управление доступом , а затем Добавить, а затем — Добавить назначение ролей.
    8. Выберите Центры событий Azure Приемник данных и предоставьте доступ себе.
    9. Выберите Управление доступом , а затем Добавить, а затем — Добавить назначение ролей.
    10. Выберите Центры событий Azure Отправителя данных и предоставьте его управляемому удостоверению, созданному для учетной записи Служб мультимедиа.
  2. Используйте портал Azure для создания учетной записи хранения Azure.
    1. После создания учетной записи хранения перейдите к ресурсу учетной записи хранения.
    2. Выберите Управление доступом , а затем Добавить, а затем — Добавить назначение ролей.
    3. Выберите участника данных BLOB-объектов хранилища и предоставьте этот доступ себе.
  3. Создание подписки на события
    1. Перейдите к учетной записи Служб мультимедиа.
    2. Выберите События в меню портала.
    3. Выберите + Event Subscription (+ Подписка на события).
    4. Введите имя подписки и имя системной статьи.
    5. Задайте для параметра Тип конечной точки значениеEvent Hub.
    6. Задайте для Центров событий ранее созданные Центры событий, а управляемое удостоверение — удостоверение, которому ранее был предоставлен доступ отправителя к Центрам событий.
  4. Обновите файл appsetttings.json.
    1. Задайте для EVENT_HUB_NAMESPACE полное имя пространства имен. Он должен быть похож на myeventhub.servicebus.windows.net.
    2. Задайте EVENT_HUB_NAME.
    3. Задайте AZURE_STORAGE_ACCOUNT_NAME.

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

После запуска примера удалите Центры событий и учетную запись хранения, если они больше не нужны.

Очистка ресурсов в учетной записи Служб мультимедиа

После завершения потоковой передачи вы можете удалить выделенные ранее ресурсы с помощью следующей процедуры.

  1. Остановите потоковую передачу из кодировщика.
  2. Остановите динамическое событие. Плата за остановленное событие потоковой трансляции не взимается. Если вам потребуется запустить его снова, можно использовать тот же URL-адрес приема, поэтому вам не придется перенастраивать кодировщик.
  3. Остановите конечную точку потоковой передачи, если вы не хотите продолжать предоставлять архив трансляции в виде потока по запросу. Если трансляция находится в остановленном состоянии, плата не взимается.
if (liveOutput != null)
{
    Console.Write("Deleting the Live Output...".PadRight(60));
    await liveOutput.DeleteAsync(WaitUntil.Completed);
    Console.WriteLine("Done");
}

if (liveEvent?.Data.ResourceState == LiveEventResourceState.Running)
{
    Console.Write("Stopping the Live Event...".PadRight(60));
    await liveEvent.StopAsync(WaitUntil.Completed, new LiveEventActionContent() { RemoveOutputsOnStop = true });
    Console.WriteLine("Done");
}

if (liveEvent != null)
{
    Console.Write("Deleting the Live Event...".PadRight(60));
    await liveEvent.DeleteAsync(WaitUntil.Completed);
    Console.WriteLine("Done");
}

if (streamingLocator != null)
{
    Console.Write("Deleting the Streaming Locator...".PadRight(60));
    await streamingLocator.DeleteAsync(WaitUntil.Completed);
    Console.WriteLine("Done");
}

if (asset != null)
{
    Console.Write("Deleting the Asset...".PadRight(60));
    await asset.DeleteAsync(WaitUntil.Completed);
    Console.WriteLine("Done");
}

Очистка оставшихся ресурсов

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

Выполните приведенную ниже команду интерфейса командной строки.


az group delete --name amsResourceGroup

Справка и поддержка

Вы можете обратиться к Службам мультимедиа с вопросами или следить за нашими обновлениями одним из следующих способов: