Öğretici: .NET 7.0 kullanarak Media Services ile canlı akış

Media Services logosu v3


Uyarı

Azure Media Services 30 Haziran 2024'de kullanımdan kaldırılacak. Daha fazla bilgi için bkz. AMS Kullanımdan Kaldırma Kılavuzu.

Azure Media Services'te canlı etkinlikler canlı akış içeriğinin işlenmesinden sorumludur. Canlı etkinlik, canlı kodlayıcıya sağladığınız bir giriş uç noktası (alma URL'si) sağlar. Canlı etkinlik, RTMP/S veya Kesintisiz Akış protokollerini kullanarak canlı kodlayıcıdan giriş akışlarını alır ve bunları bir veya daha fazla akış uç noktası üzerinden akış için kullanılabilir hale getirir. Canlı etkinlikler ayrıca daha fazla işleme ve teslimden önce akışınızı önizlemek ve doğrulamak için kullandığınız bir önizleme uç noktası (önizleme URL'si) sağlar.

Bu öğreticide, doğrudan canlı etkinlik oluşturmak için .NET 7.0'ın nasıl kullanılacağı gösterilmektedir. Doğrudan canlı etkinlikler, şirket içinde çok bit hızlı, GOP ile hizalanmış kodlama özelliğine sahip bir kodlayıcınız olduğunda kullanışlıdır. Bulut maliyetlerini azaltmanın bir yolu olabilir. Bant genişliğini azaltmak ve çoklu bit hızı kodlaması için buluta tek bir bit hızı akışı göndermek istiyorsanız, 720P veya 1080P kodlama ön ayarlarıyla kod dönüştürme canlı olayı kullanabilirsiniz.

Bu öğreticide şunları yapacaksınız:

  • Örnek bir proje indirin.
  • Canlı akış gerçekleştiren kodu inceleyin.
  • Media Player tanıtım sitesinde Azure Media Player ile etkinliği izleyin.
  • Canlı etkinliği izlemek için Event Grid'i ayarlayın.
  • Kaynakları temizleyin.

Önkoşullar

Öğreticiyi tamamlamak için aşağıdaki öğelere ihtiyacınız vardır:

Canlı akış yazılımları için de şu öğelere ihtiyacınız vardır:

  • Olay yayınlamak için kullanılan bir kamera veya cihaz (dizüstü bilgisayar gibi).
  • Kamera akışınızı kodlayan ve Real-Time Mesajlaşma Protokolü (RTMP/S) aracılığıyla Media Services canlı akış hizmetine gönderen bir şirket içi yazılım kodlayıcı. Daha fazla bilgi için bkz. Önerilen şirket içi canlı kodlayıcılar. Akışın RTMP/S veya Kesintisiz Akış biçiminde olması gerekir. Bu örnekte RTMP/S'yi alma uç noktasına yayınlamak için Open Broadcaster Software (OBS) Studio kullanacağınız varsayılır. OBS Studio'yu yükleyin.
  • Alternatif olarak, önce Azure portal ile tüm işlemi test etmek için OBS Hızlı Başlangıcı'nı deneyebilirsiniz.

Event Grid ve Event Hubs kullanarak canlı etkinliği izlemek için şunları yapabilirsiniz: 1. Azure portal veya 1 kullanarak Event Grid ile Media Services olaylarını oluşturma ve izleme başlığı altındaki adımları izleyin. Bu makalenin Event Grid ve Event Hubs kullanarak Canlı Etkinlikleri İzleme bölümünde bu öğreticinin sonuna yakın olan adımları izleyin.

Örneği indirme ve yapılandırma

Aşağıdaki komutu kullanarak canlı akış .NET örneğini içeren GitHub deposunu makinenize kopyalayın:

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

Canlı akış örneği Live/LiveEventWithDVR klasöründedir.

İndirdiğiniz projede açın appsettings.json . Değerleri hesap adı, abonelik kimliği ve kaynak grubu adıyla değiştirin.

Önemli

Bu örnek, her kaynak için benzersiz bir sonek kullanır. Hata ayıklamayı iptal ederseniz veya uygulamayı çalıştırmadan sonlandırırsanız hesabınızda birden çok canlı etkinlik olur. Çalışan canlı etkinlikleri durdurmayı unutmayın. Aksi takdirde faturalandırılırsınız!

.NET SDK ile Media Services API'lerini kullanmaya başlama

Program.cs, media services hesap kaynağına bir başvuru oluşturur ve aşağıdaki appsettings.jsonseçenekleri kullanır:

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);

Canlı etkinlik oluşturma

Bu bölümde canlı olayın doğrudan geçiş türünün nasıl oluşturulacağı gösterilmektedir (LiveEventEncodingType, Yok olarak ayarlanmıştır). Kullanılabilir türler hakkında bilgi için bkz . Canlı etkinlik türleri. Genel alma bant genişliğinizi azaltmak istiyorsanız veya şirket içi çok bit hızlı bir transkodr'unuz yoksa, 720p veya 1080p bit hızı uyarlamalı bulut kodlaması için canlı kodlama dönüştürme olayı kullanabilirsiniz.

Canlı etkinliği oluştururken aşağıdaki öğeleri belirtmek isteyebilirsiniz:

  • Canlı etkinlik için alma protokolü. Şu anda RTMPS ve Kesintisiz Akış protokolleri desteklenmektedir. Canlı etkinlik çalışırken protokol seçeneğini değiştiremezsiniz. Farklı protokollere ihtiyacınız varsa, her akış protokolü için ayrı bir canlı etkinlik oluşturun.

  • Alma ve önizlemede IP kısıtlamaları. Bu canlı etkinliğe video alma izni olan IP adreslerini tanımlayabilirsiniz. İzin verilen IP adresleri şu seçeneklerden biri olarak belirtilebilir:

    • Tek bir IP adresi (örneğin, 10.0.0.1 veya 2001:db8::1)

    • IP adresi ve Sınıfsız Inter-Domain Yönlendirme (CIDR) alt ağ maskesi kullanan bir IP aralığı (örneğin, 10.0.0.1/22 veya 2001:db8::/48)

    • IP adresi ve noktalı ondalık alt ağ maskesi kullanan bir IP aralığı (örneğin, 10.0.0.1 255.255.252.0)

      Hiçbir IP adresi belirtilmezse ve kural tanımı yoksa, HIÇBIR IP adresine izin verilmez. Herhangi bir IP adresine izin vermek için bir kural oluşturun ve 0.0.0.0/0 ve ::/0 değerlerini ayarlayın. IP adreslerinin şu biçimlerden birinde olması gerekir: Dört sayı veya CIDR adres aralığına sahip IPv4 veya IPv6 adresleri. Daha fazla bilgi için bkz. IP izin verilenler listesini kullanarak DRM lisansına ve AES anahtar teslimine erişimi kısıtlama.

  • Bir olayı oluştururken otomatik olarak başlatın. Otomatik başlangıç true olarak ayarlandığında canlı etkinlik oluşturulduktan sonra başlar. Bu, canlı etkinlik çalışmaya başlar başlamaz faturalamanın başlayacağı anlamına gelir. Daha fazla faturalamayı durdurmak için canlı etkinlik kaynağını açıkça aramanız Stop gerekir. Daha fazla bilgi için bkz . Canlı etkinlik durumları ve faturalama.

    Bekleme modları, canlı etkinliği daha düşük maliyetli bir "ayrılmış" durumda başlatmak için kullanılabilir ve bu da çalışma durumuna geçmeyi hızlandırır. Kanalları hızlı bir şekilde yayıncılara dağıtmak zorunda olan sıcak havuzlar gibi durumlarda kullanışlıdır.

  • Statik bir ana bilgisayar adı ve benzersiz bir GUID. Alma URL'sinin tahmine dayalı olması ve donanım tabanlı canlı kodlayıcıda daha kolay korunması için özelliğini true olarak ayarlayın useStaticHostname . Ayrıntılı bilgi için bkz . Canlı etkinlik alma URL'leri.

    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);
    

Alma URL’leri alma

Canlı Etkinlik oluşturulduktan sonra canlı kodlayıcıya sağlayacağınız alma URL'lerini alabilirsiniz. Kodlayıcı bu URL'leri canlı akış girişi için kullanır.

// 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();

Önizleme URL'sini alma

Kodlayıcıdan gelen girişin alındığını önizlemek ve doğrulamak için kullanın previewEndpoint .

Önemli

Devam etmeden önce videonun önizleme URL'sine aktığından emin olun.

// 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();

Canlı etkinlikler ve canlı çıkışlar oluşturma ve yönetme

Şirket içi kodlayıcıdan canlı akış canlı etkinliğe aktarıldıktan sonra bir varlık, canlı çıkış ve akış bulucu oluşturarak canlı etkinliğe başlayabilirsiniz. Akış arşivlenmiş ve akış uç noktası üzerinden izleyicilerin kullanımına sunulmuştur.

Sonraki bölümde varlığın ve canlı çıkışın oluşturulmasına yol gösterilir.

Varlık oluşturma

Canlı çıkışın kullanması için bir varlık oluşturun.

// 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");

Canlı çıkış oluşturma

Canlı çıkışlar oluşturulduklarında başlar ve silindiklerinde durur. Canlı çıkışı sildiğinizde, varlıktaki çıkış varlığını veya içeriği silmezsiniz. Kaydı olan varlık, mevcut olduğu ve kendisiyle ilişkilendirilmiş bir akış bulucusu olduğu sürece isteğe bağlı akış için kullanılabilir.

// 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");

Akış bulucusu oluşturma

Not

Media Services hesabınız oluşturulduğunda, hesabınıza durdurulmuş durumda bir varsayılan akış uç noktası eklenir. İçeriğinizin akışını başlatmak ve dinamik paketleme ve dinamik şifrelemeden yararlanmak için, içerik akışı yapmak istediğiniz akış uç noktasının çalışır durumda olması gerekir.

Akış bulucu oluşturarak bir varlık yayımlarsınız. Canlı etkinlik (DVR pencere uzunluğuna kadar) akış bulucunun sona erme veya silme işlemine (hangisi önce gelirse) kadar görüntülenebilir. Videoyu izleyicilerinizin canlı ve isteğe bağlı olarak görebilmesi için bu şekilde kullanıma sunabilirsiniz. Canlı etkinlik tamamlandığında ve canlı çıkış silindiğinde canlı etkinliği, DVR penceresini veya isteğe bağlı varlığı watch için aynı URL kullanılabilir.

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

Olayı izleme

Kodu çalıştırın. Canlı etkinliğinizi watch için çıkış akış URL'lerini kullanın. Akış bulucu URL'sini kopyalayın. İstediğiniz bir medya oynatıcıyı kullanabilirsiniz. Akışınızı test etmek için Media Player tanıtım sitesini kullanabilirsiniz. URL alanına URL'yi girin ve Yürütücü'leri güncelleştir'i seçin.

Event Grid ve Event Hubs kullanarak Canlı Olayları İzleme

Örnek proje, Canlı Etkinliği izlemek için Event Grid ve Event Hubs kullanabilir. Event Grid'i ayarlamak ve kullanmak için aşağıdakileri kullanabilirsiniz

İzlemeyi etkinleştirmek için:

  1. Event Hubs Ad Alanı ve Event Hubs oluşturmak için Azure portal kullanma
    1. Azure portal en üstündeki metin kutusunu kullanarak "Event Hubs" araması yapın.
    2. Listeden Event Hub'ı seçin, ardından yönergeleri izleyerek event hubs ad alanı oluşturun.
    3. Event Hubs Ad Alanı kaynağına gidin.
    4. Portal menüsünün Varlıklar bölümünde Event Hubs'ı seçin.
    5. Event Hubs ad alanında bir Event Hubs oluşturun.
    6. Event Hubs kaynağına gidin.
    7. Erişim denetimi'ni, Ekle'yi ve ardından Rol ataması ekle'yi seçin.
    8. Azure Event Hubs Veri Alıcısı'nı seçin ve kendinize erişim verin.
    9. Erişim denetimi'ni, Ekle'yi ve ardından Rol ataması ekle'yi seçin.
    10. Azure Event Hubs Veri Göndereni'ni seçin ve media services hesabı için oluşturulan Yönetilen Kimliğe verin.
  2. Azure Depolama hesabı oluşturmak için Azure portal kullanın.
    1. Depolama hesabını oluşturduktan sonra Depolama Hesabı kaynağına gidin.
    2. Erişim denetimi'ni, Ekle'yi ve ardından Rol ataması ekle'yi seçin.
    3. Depolama Blob Verileri Katkıda Bulunanı'nı seçin ve kendinize bu erişimi verin.
  3. Olay Aboneliği Oluşturma
    1. Media Services hesabına gidin.
    2. Portal menüsünden Olaylar'ı seçin.
    3. + Olay Aboneliği'ni seçin.
    4. Abonelik adı ve sistem makalesi adı girin.
    5. Uç Nokta Türü'nü olarak Event Hubayarlayın.
    6. Event Hubs'ı daha önce oluşturulan Event Hubs olarak ayarlayın ve Yönetilen Kimliği daha önce Event Hubs'a Gönderen erişimi verilmiş olan kimliğe ayarlayın
  4. Dosyayı güncelleştirin appsetttings.json .
    1. EVENT_HUB_NAMESPACE ad alanının tam adı olarak ayarlayın. ile benzer myeventhub.servicebus.windows.netolmalıdır.
    2. EVENT_HUB_NAME ayarlayın.
    3. AZURE_STORAGE_ACCOUNT_NAME ayarlayın.

Örneği yeniden çalıştırın. Event Hubs tümleştirmesi etkinleştirildiğinde örnek, kodlayıcı canlı etkinlikle bağlantı kurduğunda ve bağlantısını kestiğinde olayları günlüğe kaydeder. Diğer çeşitli olaylar da günlüğe kaydedilir.

Örneği çalıştırdıktan sonra artık gerekli değilse Event Hubs ve depolama hesabını silin.

Media Services hesabınızdaki kaynakları temizleme

Olayları akışla aktarmayı bitirdiyseniz ve daha önce sağlanan kaynakları temizlemek istiyorsanız aşağıdaki yordamı kullanın:

  1. Kodlayıcıdan akışı durdurun.
  2. Canlı etkinliği durdurun. Canlı etkinlik durdurulduktan sonra herhangi bir ücret uygulanmaz. Yeniden başlatmanız gerektiğinde aynı alma URL'si kullanılabilir, böylece kodlayıcınızı yeniden yapılandırmanız gerekmez.
  3. Canlı etkinliğinizin arşivini isteğe bağlı akış olarak sağlamaya devam etmek istemiyorsanız akış uç noktasını durdurun. Canlı etkinlik durdurulmuş durumdaysa herhangi bir ücret uygulanmaz.
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");
}

Kalan kaynakları temizleme

Bu öğretici için oluşturduğunuz Media Services ve depolama hesaplarına artık ihtiyacınız yoksa, daha önce oluşturduğunuz kaynak grubunu silin.

Aşağıdaki CLI komutunu çalıştırın:


az group delete --name amsResourceGroup

Yardım ve destek alma

Sorularınız için Media Services ile iletişime geçebilir veya aşağıdaki yöntemlerden birini kullanarak güncelleştirmelerimizi izleyebilirsiniz: