Tutorial: Streaming langsung dengan Media Services dengan menggunakan .NET 7.0

Logo Azure Media Services v3


Peringatan

Azure Media Services akan dihentikan pada 30 Juni 2024. Untuk informasi selengkapnya, lihat Panduan Penghentian AMS.

Di Azure Media Services, acara langsung bertanggung jawab untuk memproses konten streaming langsung. Acara langsung memberikan titik akhir input (URL serapan) yang kemudian Anda berikan ke penyandi langsung. Acara langsung menerima aliran input dari encoder langsung menggunakan protokol RTMP/S atau Smooth Streaming dan membuatnya tersedia untuk streaming melalui satu atau beberapa titik akhir streaming. Acara langsung juga menyediakan titik akhir pratinjau (URL pratinjau) yang Anda gunakan untuk mempratinjau dan memvalidasi streaming sebelum pemrosesan dan pengiriman lebih lanjut.

Tutorial ini menunjukkan cara menggunakan .NET 7.0 untuk membuat acara langsung pass-through . Acara langsung pass-through berguna ketika Anda memiliki encoder yang mampu mengodekan multi-laju bit, GOP yang selaras secara lokal. Ini dapat menjadi cara untuk mengurangi biaya cloud. Jika Anda ingin mengurangi bandwidth dan mengirim aliran laju bit tunggal ke cloud untuk pengodean multi-laju bit, Anda dapat menggunakan acara langsung transkode dengan preset pengodean 720P atau 1080P.

Dalam tutorial ini, Anda akan:

  • Unduh proyek sampel.
  • Periksa kode yang melakukan streaming langsung.
  • Tonton acara dengan Azure Media Player di situs demo Media Player.
  • Siapkan Event Grid untuk memantau acara langsung.
  • Membersihan sumber daya.

Prasyarat

Anda memerlukan item berikut untuk menyelesaikan tutorial:

Anda juga memerlukan item ini untuk perangkat lunak streaming langsung:

  • Kamera atau perangkat (seperti laptop) yang digunakan untuk menyiarkan acara.
  • Encoder perangkat lunak lokal yang mengodekan aliran kamera Anda dan mengirimkannya ke layanan streaming langsung Media Services melalui Real-Time Messaging Protocol (RTMP/S). Untuk mengetahui informasi selengkapnya, lihat encoder langsung lokal yang disarankan. Aliran harus dalam format RTMP/S atau Smooth Streaming. Sampel ini mengasumsikan bahwa Anda akan menggunakan Open Broadcaster Software (OBS) Studio untuk menyiarkan RTMP/S ke titik akhir penyerapan. Pasang OBS Studio.
  • Atau, Anda dapat mencoba OBS Quickstart untuk menguji seluruh proses dengan portal Azure terlebih dahulu.

Untuk memantau acara langsung menggunakan Event Grid dan Azure Event Hubs, Anda dapat: 1. Ikuti langkah-langkah dalam Membuat dan memantau peristiwa Media Services dengan Event Grid menggunakan portal Azure atau, 1. Ikuti langkah-langkah di dekat akhir tutorial ini di bagian Memantau Acara Langsung menggunakan Event Grid dan Event Hubs di artikel ini.

Tip

Tinjau Streaming langsung dengan Azure Media Services v3 sebelum melanjutkan.

Mengunduh dan mengonfigurasi sampel

Kloning repositori GitHub yang berisi sampel .NET streaming langsung ke komputer Anda menggunakan perintah berikut:

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

Sampel streaming langsung ada di folder Live/LiveEventWithDVR .

Buka appsettings.json di proyek yang Anda unduh. Ganti nilai dengan nama akun, Id langganan, dan nama grup sumber daya.

Penting

Sampel ini menggunakan akhiran unik untuk setiap sumber daya. Jika Anda membatalkan penelusuran kesalahan atau menghentikan aplikasi tanpa menjalankan penelusuran kesalahan, Anda akan mendapatkan beberapa acara langsung di akun Anda. Pastikan untuk menghentikan acara langsung yang sedang berjalan. Jika tidak, Anda akan dikenakan biaya!

Mulai menggunakan API Media Services dengan .NET SDK

Program.cs membuat referensi ke sumber daya akun Media Services, menggunakan opsi dari 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);

Membuat acara langsung

Bagian ini memperlihatkan cara membuat jenis acara langsung pass-through (LiveEventEncodingType diatur ke Tidak Ada). Untuk mengetahui informasi tentang jenis yang tersedia, lihat Jenis acara langsung. Jika Anda ingin mengurangi bandwidth penyerapan secara keseluruhan, atau Anda tidak memiliki transcoder multi-laju bit lokal, Anda dapat menggunakan peristiwa transcoding langsung untuk pengodean cloud laju bit adaptif 720p atau 1080p.

Anda mungkin ingin menentukan hal-hal berikut saat membuat acara langsung:

  • Protokol penyerapan untuk acara langsung. Saat ini, protokol RTMPS, dan Smooth Streaming didukung. Anda tidak dapat mengubah opsi protokol saat acara langsung sedang berjalan. Jika Anda memerlukan protokol yang berbeda, buat acara langsung terpisah untuk setiap protokol streaming.

  • Pembatasan IP pada penyerapan dan pratinjau. Anda dapat menentukan alamat IP yang diizinkan untuk menyerap video ke acara langsung ini. Alamat IP yang diizinkan dapat ditentukan sebagai salah satu dari pilihan berikut:

    • Satu alamat IP (misalnya, 10.0.0.1 atau 2001:db8::1)

    • Rentang IP yang menggunakan alamat IP dan subnet mask Classless Inter-Domain Routing (CIDR) (misalnya, 10.0.0.1/22 atau 2001:db8::/48)

    • Rentang IP yang menggunakan alamat IP dan subnet mask desimal putus-putus (misalnya, 10.0.0.1 255.255.252.0)

      Jika tidak ada alamat IP yang ditentukan dan tidak ada definisi aturan, tidak ada alamat IP yang akan diizinkan. Untuk mengizinkan alamat IP apa pun, buat aturan dan atur 0.0.0.0/0 dan ::/0. Alamat IP harus dalam salah satu format berikut: alamat IPv4 atau IPv6 dengan empat angka atau rentang alamat CIDR. Untuk informasi selengkapnya, lihat Membatasi akses ke lisensi DRM dan pengiriman kunci AES menggunakan daftar ip yang diizinkan.

  • Mulai otomatis pada acara saat Anda membuatnya. Saat mulai otomatis diatur ke true, acara langsung akan dimulai setelah pembuatan. Itu berarti tagihan dimulai segera setelah acara langsung mulai berjalan. Anda harus secara eksplisit memanggil Stop pada sumber acara langsung untuk menghentikan tagihan lebih lanjut. Untuk informasi selengkapnya, lihat Status dan tagihan acara langsung.

    Mode siaga tersedia untuk memulai acara langsung dalam status "dialokasikan" berbiaya lebih rendah yang membuatnya lebih cepat untuk berpindah ke status berjalan. Ini berguna untuk situasi seperti kolam panas yang perlu membagikan saluran dengan cepat ke streamer.

  • Nama host statik dan GUID unik. Agar URL penyerapan menjadi prediktif dan lebih mudah dipertahankan dalam penyandi useStaticHostname langsung berbasis perangkat keras, atur properti ke true. Untuk mengetahui informasi selengkapnya, lihat URL penyerapan acara langsung.

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

Mendapatkan URL penyerapan

Setelah Acara Langsung dibuat, Anda bisa mendapatkan URL penyerapan yang akan Anda sediakan ke encoder langsung lokal. Encoder menggunakan URL ini untuk memasukkan streaming langsung.

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

Mendapatkan URL pratinjau

Gunakan previewEndpoint untuk mempratinjau dan memverifikasi bahwa input dari penyandi telah diterima.

Penting

Pastikan video mengalir ke URL pratinjau sebelum Anda melanjutkan.

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

Membuat dan mengelola acara langsung dan output langsung

Setelah streaming langsung dari encoder lokal di-streaming ke acara langsung, Anda dapat memulai acara langsung dengan membuat aset, output langsung, dan pencari streaming. Aliran diarsipkan dan tersedia untuk penonton melalui titik akhir streaming.

Bagian berikutnya akan berjalan melalui pembuatan aset dan output langsung.

Membuat aset

Buat aset untuk output langsung yang akan digunakan.

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

Membuat output langsung

Output langsung dimulai saat dibuat dan berhenti saat dihapus. Saat menghapus output langsung, Anda tidak menghapus aset output atau konten dalam aset. Aset dengan rekaman tersedia untuk streaming sesuai permintaan selama ada dan ada pencari streaming yang terkait dengannya.

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

Membuat pencari lokasi streaming

Catatan

Saat akun Azure Media Services Anda dibuat, titik akhir streaming default ditambahkan ke akun Anda dalam status berhenti. Untuk mulai mengalirkan konten Anda dan memanfaatkan paket dinamis dan enkripsi dinamis, titik akhir streaming dari mana Anda ingin mengalirkan konten harus dalam status berjalan.

Anda menerbitkan aset dengan membuat pencari streaming. Acara langsung (hingga panjang jendela DVR) dapat dilihat hingga kedaluwarsa atau penghapusan pencari streaming, mana saja yang lebih dulu. Ini adalah cara Anda membuat video tersedia bagi penonton yang menonton untuk melihat langsung dan sesuai permintaan. URL yang sama dapat digunakan untuk watch acara langsung, jendela DVR, atau aset sesuai permintaan saat acara langsung selesai dan output langsung dihapus.

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

Menonton acara

Jalankan kodenya. Gunakan URL streaming output untuk watch acara langsung Anda. Salin URL pencari lokasi streaming. Anda dapat menggunakan pemutar media pilihan Anda. Anda dapat menggunakan situs demo Media Player untuk menguji aliran Anda. Masukkan URL ke bidang URL dan pilih Perbarui pemutar.

Memantau Acara Langsung menggunakan Event Grid dan Azure Event Hubs

Proyek sampel dapat menggunakan Event Grid dan Azure Event Hubs untuk memantau Acara Langsung. Anda dapat menyiapkan dan menggunakan Event Grid menggunakan yang berikut ini

Untuk mengaktifkan pemantauan:

  1. Menggunakan portal Azure untuk membuat Namespace Layanan Azure Event Hubs dan Azure Event Hubs
    1. Cari "Azure Event Hubs" menggunakan kotak teks di bagian atas portal Azure.
    2. Pilih Pusat Aktivitas dari daftar, lalu ikuti instruksi untuk membuat Namespace Layanan Azure Event Hubs.
    3. Navigasikan ke sumber daya Namespace Layanan Pusat Aktivitas.
    4. Pilih Azure Event Hubs dari bagian Entitas di menu portal.
    5. Buat Azure Event Hubs di namespace layanan Azure Event Hubs.
    6. Navigasikan ke sumber daya Azure Event Hubs.
    7. Pilih Kontrol akses lalu Tambahkan, lalu Tambahkan penetapan peran.
    8. Pilih Azure Event Hubs Data Receiver lalu berikan akses ke diri Anda sendiri.
    9. Pilih Kontrol akses lalu Tambahkan, lalu Tambahkan penetapan peran.
    10. Pilih Azure Event Hubs Pengirim Data lalu berikan ke Identitas Terkelola yang dibuat untuk akun Media Services.
  2. Gunakan portal Azure untuk membuat akun Azure Storage.
    1. Setelah membuat akun penyimpanan, navigasikan ke sumber daya Akun Penyimpanan.
    2. Pilih Kontrol akses lalu Tambahkan, lalu Tambahkan penetapan peran.
    3. Pilih Kontributor Data Blob Penyimpanan lalu berikan akses ini ke diri Anda sendiri.
  3. Membuat Langganan Peristiwa
    1. Navigasi ke akun Media Services.
    2. Pilih Peristiwa dari menu portal.
    3. Pilih + Langganan Peristiwa.
    4. Masukkan nama langganan dan nama artikel sistem.
    5. Atur Jenis Titik Akhir ke Event Hub.
    6. Atur Azure Event Hubs ke Azure Event Hubs yang dibuat sebelumnya dan atur Identitas Terkelola ke identitas yang sebelumnya diberikan akses Pengirim ke Azure Event Hubs
  4. Perbarui file appsetttings.json.
    1. Atur EVENT_HUB_NAMESPACE ke nama lengkap namespace. Ini harus mirip myeventhub.servicebus.windows.netdengan .
    2. Atur EVENT_HUB_NAME.
    3. Atur AZURE_STORAGE_ACCOUNT_NAME.

Jalankan sampel lagi. Dengan integrasi Azure Event Hubs diaktifkan, sampel mencatat peristiwa saat encoder terhubung dan terputus dari Acara Langsung. Berbagai peristiwa lain juga dicatat.

Setelah menjalankan sampel, hapus Azure Event Hubs dan akun penyimpanan jika tidak lagi diperlukan.

Membersihkan sumber daya di akun Media Services

Jika Anda sudah selesai melakukan streaming acara dan ingin membersihkan sumber daya yang diprovisikan sebelumnya, gunakan prosedur berikut:

  1. Hentikan streaming dari encoder.
  2. Hentikan acara langsung. Setelah acara langsung dihentikan, acara tidak akan dikenakan biaya apa pun. Ketika Anda perlu memulainya lagi, URL penyerapan yang sama dapat digunakan sehingga Anda tidak perlu mengonfigurasi ulang encoder Anda.
  3. Hentikan titik akhir streaming, kecuali Anda ingin terus menyediakan arsip acara langsung Anda sebagai streaming sesuai permintaan. Jika acara langsung dalam keadaan dihentikan, acara tersebut tidak akan dikenakan biaya apa pun.
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");
}

Membersihkan sisa sumber daya

Jika Anda tidak lagi memerlukan Media Services dan akun penyimpanan yang Anda buat untuk tutorial ini, hapus grup sumber daya yang Anda buat sebelumnya.

Jalankan perintah CLI berikut:


az group delete --name amsResourceGroup

Mendapatkan bantuan dan dukungan

Anda dapat menghubungi Media Services dengan pertanyaan atau mengikuti pembaruan kami dengan salah satu metode berikut: