Tutorial: Mengunggah, mengodekan, dan melakukan streaming video dengan Media Services v3

logo layanan media v3


Sedang mencari dokumentasi Media Services v2?

Catatan

Meskipun tutorial ini menggunakan contoh .NET SDK, langkah-langkah umumnya sama untuk REST API, CLI, atau SDK lainnya yang didukung.

Azure Media Services memungkinkan Anda mengodekan file media ke dalam format yang diputar di berbagai browser dan perangkat. Misalnya, Anda mungkin ingin melakukan streaming konten dalam format HLS Apple atau MPEG DASH. Sebelum melakukan streaming, Anda harus mengodekan file media digital berkualitas tinggi. Untuk bantuan pengodean, lihat Konsep pengodean. Tutorial ini mengunggah file video lokal dan mengodekan file yang diunggah. Anda juga dapat mengodekan konten yang dapat diakses melalui URL HTTPS. Untuk informasi selengkapnya, lihat Membuat input pekerjaan dari URL HTTP.

Memutar video dengan Azure Media Player

Tutorial ini menunjukkan kepada Anda cara:

  • Unduh contoh aplikasi yang dijelaskan dalam topik ini.
  • Periksa kode yang mengunggah, mengodekan, dan melakukan streaming.
  • Menjalankan aplikasi.
  • Menguji URL streaming.
  • Membersihan sumber daya.

Jika Anda tidak memiliki langganan Azure, buatlah akun gratis sebelum Anda memulai.

Prasyarat

Mengunduh dan mengonfigurasi sampel

Mengkloning repositori GitHub yang memiliki sampel .NET streaming ke komputer Anda menggunakan perintah berikut:

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

Sampel terletak di folder UploadEncodeAndStreamFiles.

Buka appsettings.json di proyek yang Anda unduh. Ganti nilai dengan info masuk yang Anda dapatkan dari mengakses API.

Catatan

Anda juga dapat menggunakan format file .env di akar proyek untuk mengatur variabel lingkungan hanya sekali untuk semua proyek di repositori sampel .NET. Cukup salin file sample.env, lalu isi informasi yang Anda dapatkan dari halaman Akses API Media Services di portal Azure atau dari Azure CLI. Ganti nama file sample.env menjadi hanya .env untuk menggunakannya di semua proyek.

File .gitignore sudah dikonfigurasi untuk mencegah penerbitan file ini ke dalam repositori dengan fork Anda.

Periksa kode yang mengunggah, mengodekan, dan melakukan streaming

Bagian ini memeriksa fungsi yang ditentukan dalam file Program.cs dari proyek UploadEncodeAndStreamFiles.

Sampel melakukan tindakan berikut:

  1. Buat Transformasi baru (pertama, periksa apakah Transformasi yang ditentukan sudah ada).
  2. Buat Aset output yang digunakan sebagai output Pekerjaan pengodean.
  3. Buat Aset input, lalu unggah file video lokal yang ditentukan ke dalamnya. Aset digunakan sebagai pekerjaan input.
  4. Mengirimkan tugas pengodean menggunakan input dan output yang dibuat.
  5. Memeriksa status pekerjaan.
  6. Membuat Pencari Streaming.
  7. Membuat URL streaming.

Mulai menggunakan API Media Services dengan .NET SDK

Untuk mulai menggunakan API Media Services dengan .NET, Anda perlu membuat objek AzureMediaServicesClient. Untuk membuat objek, Anda perlu menyediakan info masuk bagi klien untuk tersambung ke Azure dengan menggunakan Azure Active Directory. Opsi lain adalah menggunakan autentikasi interaktif, yang diimplementasikan dalam GetCredentialsInteractiveAuthAsync.

public static async Task<IAzureMediaServicesClient> CreateMediaServicesClientAsync(ConfigWrapper config, bool interactive = false)
{
    ServiceClientCredentials credentials;
    if (interactive)
        credentials = await GetCredentialsInteractiveAuthAsync(config);
    else
        credentials = await GetCredentialsAsync(config);

    return new AzureMediaServicesClient(config.ArmEndpoint, credentials)
    {
        SubscriptionId = config.SubscriptionId,
    };
}

Dalam kode yang Anda kloning di awal artikel, fungsi GetCredentialsAsync membuat objek ServiceClientCredentials berdasarkan info masuk yang disediakan dalam file konfigurasi lokal (appsettings.json) atau melalui file variabel lingkungan .env di akar repositori.

private static async Task<ServiceClientCredentials> GetCredentialsAsync(ConfigWrapper config)
{
    // Use ConfidentialClientApplicationBuilder.AcquireTokenForClient to get a token using a service principal with symmetric key

    var scopes = new[] { config.ArmAadAudience + "/.default" };

    var app = ConfidentialClientApplicationBuilder.Create(config.AadClientId)
        .WithClientSecret(config.AadSecret)
        .WithAuthority(AzureCloudInstance.AzurePublic, config.AadTenantId)
        .Build();

    var authResult = await app.AcquireTokenForClient(scopes)
                                             .ExecuteAsync()
                                             .ConfigureAwait(false);

    return new TokenCredentials(authResult.AccessToken, TokenType);
}

Dalam kasus autentikasi interaktif, fungsi GetCredentialsInteractiveAuthAsync membuat objek ServiceClientCredentials berdasarkan autentikasi interaktif dan parameter koneksi yang disediakan dalam file konfigurasi lokal (appsettings.json) atau melalui file variabel lingkungan .env di akar repositori. Dalam hal ini, AADCLIENTID dan AADSECRET tidak diperlukan dalam file variabel konfigurasi atau lingkungan.

private static async Task<ServiceClientCredentials> GetCredentialsInteractiveAuthAsync(ConfigWrapper config)
{
    var scopes = new[] { config.ArmAadAudience + "/user_impersonation" };

    // client application of Az Cli
    string ClientApplicationId = "04b07795-8ddb-461a-bbee-02f9e1bf7b46";

    AuthenticationResult result = null;

    IPublicClientApplication app = PublicClientApplicationBuilder.Create(ClientApplicationId)
        .WithAuthority(AzureCloudInstance.AzurePublic, config.AadTenantId)
        .WithRedirectUri("http://localhost")
        .Build();

    var accounts = await app.GetAccountsAsync();

    try
    {
        result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault()).ExecuteAsync();
    }
    catch (MsalUiRequiredException ex)
    {
        try
        {
            result = await app.AcquireTokenInteractive(scopes).ExecuteAsync();
        }
        catch (MsalException maslException)
        {
            Console.Error.WriteLine($"ERROR: MSAL interactive authentication exception with code '{maslException.ErrorCode}' and message '{maslException.Message}'.");
        }
    }
    catch (MsalException maslException)
    {
        Console.Error.WriteLine($"ERROR: MSAL silent authentication exception with code '{maslException.ErrorCode}' and message '{maslException.Message}'.");
    }

    return new TokenCredentials(result.AccessToken, TokenType);
}

Membuat aset input dan mengunggah file lokal ke dalamnya

Fungsi CreateInputAsset membuat Aset input, dan mengunggah file video lokal yang ditentukan ke dalamnya. Aset ini digunakan sebagai masukan untuk pekerjaan pengodean Anda. Di Media Services v3, input ke Pekerjaan dapat berupa Aset atau konten yang Anda sediakan untuk akun Media Services Anda melalui URL HTTPS. Untuk mempelajari cara mengodekan dari URL HTTPS, lihat artikel ini.

Di Media Services v3, Anda menggunakan API Azure Storage untuk mengunggah file. Cuplikan .NET berikut ini memperlihatkan caranya.

Fungsi berikut melakukan tindakan ini:

  • Membuat Aset.

  • Mendapatkan URL SAS yang dapat ditulis ke aset kontainer dalam penyimpanan.

    Jika menggunakan fungsi aset ListContainerSas untuk mendapatkan URL SAS, perhatikan bahwa fungsi mengembalikan beberapa URL SAS karena ada dua kunci akun penyimpanan untuk setiap akun penyimpanan. Akun penyimpanan memiliki dua kunci karena memungkinkan rotasi kunci akun penyimpanan tanpa hambatan (misalnya, mengubahnya saat menggunakan yang lain kemudian mulai menggunakan kunci baru dan memutar kunci lainnya). URL SAS ke-1 mewakili kunci penyimpanan1 dan URL SAS kedua mewakili kunci penyimpanan2.

  • Mengunggah file ke dalam kontainer di penyimpanan menggunakan URL SAS.

private static async Task<Asset> CreateInputAssetAsync(
    IAzureMediaServicesClient client,
    string resourceGroupName,
    string accountName,
    string assetName,
    string fileToUpload)
{
    // In this example, we are assuming that the asset name is unique.
    //
    // If you already have an asset with the desired name, use the Assets.Get method
    // to get the existing asset. In Media Services v3, the Get method on entities returns null 
    // if the entity doesn't exist (a case-insensitive check on the name).

    // Call Media Services API to create an Asset.
    // This method creates a container in storage for the Asset.
    // The files (blobs) associated with the asset will be stored in this container.
    Asset asset = await client.Assets.CreateOrUpdateAsync(resourceGroupName, accountName, assetName, new Asset());

    // Use Media Services API to get back a response that contains
    // SAS URL for the Asset container into which to upload blobs.
    // That is where you would specify read-write permissions 
    // and the exparation time for the SAS URL.
    var response = await client.Assets.ListContainerSasAsync(
        resourceGroupName,
        accountName,
        assetName,
        permissions: AssetContainerPermission.ReadWrite,
        expiryTime: DateTime.UtcNow.AddHours(4).ToUniversalTime());

    var sasUri = new Uri(response.AssetContainerSasUrls.First());

    // Use Storage API to get a reference to the Asset container
    // that was created by calling Asset's CreateOrUpdate method.  
    BlobContainerClient container = new BlobContainerClient(sasUri);
    BlobClient blob = container.GetBlobClient(Path.GetFileName(fileToUpload));

    // Use Strorage API to upload the file into the container in storage.
    await blob.UploadAsync(fileToUpload);

    return asset;
}

Membuat aset output untuk menyimpan hasil pekerjaan

Aset output menyimpan hasil pekerjaan pengodean Anda. Proyek ini mendefinisikan fungsi DownloadResults yang mengunduh hasil dari aset output ini ke dalam folder "output", sehingga Anda dapat melihat apa yang Anda dapatkan.

private static async Task<Asset> CreateOutputAssetAsync(IAzureMediaServicesClient client, string resourceGroupName, string accountName, string assetName)
{
    bool existingAsset = true;
    Asset outputAsset;
    try
    {
        // Check if an Asset already exists
        outputAsset = await client.Assets.GetAsync(resourceGroupName, accountName, assetName);
    }
    catch (ErrorResponseException ex) when (ex.Response.StatusCode == System.Net.HttpStatusCode.NotFound)
    {
        existingAsset = false;
    }

    Asset asset = new Asset();
    string outputAssetName = assetName;

    if (existingAsset)
    {
        // Name collision! In order to get the sample to work, let's just go ahead and create a unique asset name
        // Note that the returned Asset can have a different name than the one specified as an input parameter.
        // You may want to update this part to throw an Exception instead, and handle name collisions differently.
        string uniqueness = $"-{Guid.NewGuid():N}";
        outputAssetName += uniqueness;

        Console.WriteLine("Warning – found an existing Asset with name = " + assetName);
        Console.WriteLine("Creating an Asset with this name instead: " + outputAssetName);
    }

    return await client.Assets.CreateOrUpdateAsync(resourceGroupName, accountName, outputAssetName, asset);
}

Membuat Transformasi dan Pekerjaan yang mengodekan file yang diunggah

Saat mengodekan atau memproses konten di Media Services, ini adalah pola umum untuk mengatur pengaturan pengodean sebagai resep. Anda lalu akan mengirimkan Pekerjaan untuk menerapkan resep tersebut ke video. Dengan mengirimkan pekerjaan baru untuk setiap video baru, Anda menerapkan resep tersebut ke semua video di pustaka Anda. Resep dalam Media Services disebut Transformasi. Untuk informasi selengkapnya, lihat Transformasi dan Pekerjaan. Contoh yang dijelaskan dalam tutorial ini mendefinisikan resep yang mengodekan video untuk streaming ke berbagai perangkat iOS dan Android.

Transformasi

Saat membuat instans Transformasi baru, Anda perlu menentukan apa yang Anda inginkan untuk diproduksi sebagai output. Parameter yang diperlukan adalah objek TransformOutput, seperti yang ditunjukkan pada kode di bawah ini. Setiap TransformOutput berisi Preset. Preset menjelaskan petunjuk langkah demi langkah dari operasi pemrosesan video dan/atau audio yang akan digunakan untuk membuat TransformOutput yang diinginkan. Sampel yang dijelaskan dalam artikel ini menggunakan Preset bawaan yang disebut AdaptiveStreaming. Preset mengodekan video input ke dalam tangga laju bit yang dibuat otomatis (pasangan resolusi laju bit) berdasarkan resolusi input dan laju bit, dan membuat file ISO MP4 dengan video H.264 dan audio AAC yang sesuai dengan setiap pasangan resolusi laju bit. Untuk mengetahui informasi tentang Preset ini, lihat membuat otomatis tangga laju bit.

Anda dapat menggunakan EncoderNamedPreset bawaan atau menggunakan preset kustom. Untuk informasi selengkapnya, lihat \Cara mengkustomisasi preset encoder.

Saat membuat Transformasi, Anda harus terlebih dahulu memeriksa apakah salah satu sudah ada menggunakan metode Dapatkan, seperti yang ditunjukkan dalam kode yang mengikuti. Di Media Services v3, metode Dapatkan pada entitas yang mengembalikan null jika entitas tidak ada (pemeriksaan tidak sensitif huruf kecil/besar pada nama).

private static async Task<Transform> GetOrCreateTransformAsync(
    IAzureMediaServicesClient client,
    string resourceGroupName,
    string accountName,
    string transformName)
{
    bool createTransform = false;
    Transform transform = null;
    try
    {
        // Does a transform already exist with the desired name? Assume that an existing Transform with the desired name
        // also uses the same recipe or Preset for processing content.
        transform = client.Transforms.Get(resourceGroupName, accountName, transformName);
    }
    catch (ErrorResponseException ex) when (ex.Response.StatusCode == System.Net.HttpStatusCode.NotFound)
    {
        createTransform = true;
    }

    if (createTransform)
    {
        // You need to specify what you want it to produce as an output
        TransformOutput[] output = new TransformOutput[]
        {
            new TransformOutput
            {
                // The preset for the Transform is set to one of Media Services built-in sample presets.
                // You can  customize the encoding settings by changing this to use "StandardEncoderPreset" class.
                Preset = new BuiltInStandardEncoderPreset()
                {
                    // This sample uses the built-in encoding preset for Adaptive Bitrate Streaming.
                    PresetName = EncoderNamedPreset.AdaptiveStreaming
                }
            }
        };

        // Create the Transform with the output defined above
        transform = await client.Transforms.CreateOrUpdateAsync(resourceGroupName, accountName, transformName, output);
    }

    return transform;
}

Tugas

Seperti disebutkan di atas, objek Transformasi adalah resep dan Pekerjaan adalah permintaan aktual ke Media Services untuk menerapkan Transformasi tersebut ke konten video atau audio input yang diberikan. Pekerjaan menentukan informasi seperti lokasi video input, dan lokasi untuk output.

Dalam contoh ini, video input telah diunggah dari komputer lokal Anda. Jika Anda ingin mempelajari cara mengodekan dari URL HTTPS, lihat artikel ini.

private static async Task<Job> SubmitJobAsync(IAzureMediaServicesClient client,
    string resourceGroupName,
    string accountName,
    string transformName,
    string jobName,
    string inputAssetName,
    string outputAssetName)
{
    // Use the name of the created input asset to create the job input.
    JobInput jobInput = new JobInputAsset(assetName: inputAssetName);

    JobOutput[] jobOutputs =
    {
        new JobOutputAsset(outputAssetName),
    };

    // In this example, we are assuming that the job name is unique.
    //
    // If you already have a job with the desired name, use the Jobs.Get method
    // to get the existing job. In Media Services v3, the Get method on entities returns null 
    // if the entity doesn't exist (a case-insensitive check on the name).
    Job job = await client.Jobs.CreateAsync(
        resourceGroupName,
        accountName,
        transformName,
        jobName,
        new Job
        {
            Input = jobInput,
            Outputs = jobOutputs,
        });

    return job;
}

Tunggu hingga pekerjaan selesai

Pekerjaan membutuhkan waktu untuk menyelesaikan dan kapan Anda ingin diberitahu. Contoh kode di bawah ini menunjukkan cara melakukan polling layanan untuk status Pekerjaan. Polling bukanlah praktik terbaik yang direkomendasikan untuk aplikasi produksi karena adanya potensi latensi. Polling dapat dibatasi jika terlalu banyak digunakan pada akun. Pengembang harus menggunakan Event Grid.

Event Grid dirancang untuk ketersediaan tinggi, performa yang konsisten, dan skala dinamis. Dengan Event Grid, aplikasi Anda dapat mendengarkan dan bereaksi terhadap peristiwa dari hampir semua layanan Azure, serta sumber kustom. Penanganan acara reaktif berbasis HTTP sederhana, membantu Anda membuat solusi yang efisien melalui pemfilteran cerdas dan perutean acara. Lihat Merutekan acara ke titik akhir web kustom.

Pekerjaan biasanya melalui status berikut: Terjadwal, Diantrekan, Pemrosesan, Selesai (status akhir). Jika pekerjaan mengalami kesalahan, Anda akan mendapatkan status Kesalahan. Jika pekerjaan sedang dalam proses dibatalkan, Anda mendapatkan Pembatalan dan Dibatalkan ketika selesai.

private static async Task<Job> WaitForJobToFinishAsync(IAzureMediaServicesClient client,
    string resourceGroupName,
    string accountName,
    string transformName,
    string jobName)
{
    const int SleepIntervalMs = 20 * 1000;

    Job job;
    do
    {
        job = await client.Jobs.GetAsync(resourceGroupName, accountName, transformName, jobName);

        Console.WriteLine($"Job is '{job.State}'.");
        for (int i = 0; i < job.Outputs.Count; i++)
        {
            JobOutput output = job.Outputs[i];
            Console.Write($"\tJobOutput[{i}] is '{output.State}'.");
            if (output.State == JobState.Processing)
            {
                Console.Write($"  Progress (%): '{output.Progress}'.");
            }

            Console.WriteLine();
        }

        if (job.State != JobState.Finished && job.State != JobState.Error && job.State != JobState.Canceled)
        {
            await Task.Delay(SleepIntervalMs);
        }
    }
    while (job.State != JobState.Finished && job.State != JobState.Error && job.State != JobState.Canceled);

    return job;
}

Kode galat pekerjaan

Lihat Kode galat.

Mendapatkan Pencari Streaming

Setelah pengodean selesai, langkah selanjutnya adalah membuat video dalam Aset output tersedia untuk klien untuk diputar. Anda dapat membuatnya tersedia dalam dua langkah: pertama, membuat Pencari Streaming, dan kedua, membuat URL streaming yang dapat digunakan klien.

Proses pembuatan Pencari Streaming disebut penerbitan. Secara default, Pencari Streaming valid segera setelah Anda melakukan panggilan API, dan berlangsung hingga dihapus, kecuali Anda mengonfigurasi waktu mulai dan berakhir opsional.

Saat membuat StreamingLocator, Anda harus menentukan StreamingPolicyName yang diinginkan. Dalam contoh ini, Anda akan melakukan streaming dalam konten yang jelas (atau tidak terenkripsi) sehingga kebijakan streaming yang jelas (PredefinedStreamingPolicy.ClearStreamingOnly) yang telah ditentukan digunakan.

Penting

Saat menggunakan Kebijakan Streaming kustom, Anda harus merancang sekumpulan kebijakan terbatas untuk akun Media Service Anda, dan menggunakannya kembali untuk StreamingLocator Anda setiap kali opsi dan protokol enkripsi yang sama diperlukan. Akun Media Service Anda memiliki kuota untuk jumlah entri Kebijakan Streaming. Anda seharusnya tidak membuat Kebijakan Streaming baru untuk setiap Pencari Streaming.

Kode berikut mengasumsikan bahwa Anda memanggil fungsi dengan locatorName yang unik.

private static async Task<StreamingLocator> CreateStreamingLocatorAsync(
    IAzureMediaServicesClient client,
    string resourceGroup,
    string accountName,
    string assetName,
    string locatorName)
{
    StreamingLocator locator = await client.StreamingLocators.CreateAsync(
        resourceGroup,
        accountName,
        locatorName,
        new StreamingLocator
        {
            AssetName = assetName,
            StreamingPolicyName = PredefinedStreamingPolicy.ClearStreamingOnly
        });

    return locator;
}

Sementara sampel dalam topik ini membahas streaming, Anda dapat menggunakan panggilan yang sama untuk membuat Pencari Streaming untuk mengirimkan video melalui unduhan progresif.

Mendapatkan URL streaming

Sekarang setelah Pencari Lokasi Streaming dibuat, Anda bisa mendapatkan URL streaming, seperti yang ditunjukkan di GetStreamingURLs. Untuk membangun URL, Anda perlu menggabungkan nama host Titik Akhir Streaming dan jalur Pencari Lokasi Streaming. Dalam sampel ini, Titik Akhir Streaming default digunakan. Ketika Anda pertama kali membuat akun Azure Media Service, Titik Akhir Streaming default ini akan berada dalam status berhenti, jadi Anda perlu memanggil Mulai.

Catatan

Dalam metode ini, Anda memerlukan locatorName yang digunakan saat membuat Pencari Streaming untuk aset output.

private static async Task<IList<string>> GetStreamingUrlsAsync(
    IAzureMediaServicesClient client,
    string resourceGroupName,
    string accountName,
    String locatorName)
{
    const string DefaultStreamingEndpointName = "default";

    IList<string> streamingUrls = new List<string>();

    StreamingEndpoint streamingEndpoint = await client.StreamingEndpoints.GetAsync(resourceGroupName, accountName, DefaultStreamingEndpointName);

    if (streamingEndpoint.ResourceState != StreamingEndpointResourceState.Running)
    {
        await client.StreamingEndpoints.StartAsync(resourceGroupName, accountName, DefaultStreamingEndpointName);
    }

    ListPathsResponse paths = await client.StreamingLocators.ListPathsAsync(resourceGroupName, accountName, locatorName);

    foreach (StreamingPath path in paths.StreamingPaths)
    {
        UriBuilder uriBuilder = new UriBuilder
        {
            Scheme = "https",
            Host = streamingEndpoint.HostName,

            Path = path.Paths[0]
        };
        streamingUrls.Add(uriBuilder.ToString());
    }
    return streamingUrls;
}

Membersihkan sumber daya di akun Media Services Anda

Umumnya, Anda harus membersihkan semuanya kecuali objek yang Anda rencanakan untuk digunakan kembali (biasanya, Anda akan menggunakan kembali Transformasi, dan Anda akan mempertahankan StreamingLocator, dll.). Jika Anda ingin akun Anda bersih setelah melakukan eksperimen, hapus sumber daya yang tidak berencana Anda gunakan kembali. Misalnya, kode berikut menghapus pekerjaan, aset yang dibuat, dan kebijakan kunci konten:

private static async Task CleanUpAsync(
   IAzureMediaServicesClient client,
   string resourceGroupName,
   string accountName,
   string transformName,
   string jobName,
   List<string> assetNames,
   string contentKeyPolicyName = null
   )
{
    await client.Jobs.DeleteAsync(resourceGroupName, accountName, transformName, jobName);

    foreach (var assetName in assetNames)
    {
        await client.Assets.DeleteAsync(resourceGroupName, accountName, assetName);
    }

    if (contentKeyPolicyName != null)
    {
        client.ContentKeyPolicies.Delete(resourceGroupName, accountName, contentKeyPolicyName);
    }
}

Menjalankan aplikasi sampel

  1. Tekan Ctrl+F5 untuk menjalankan aplikasi EncodeAndStreamFiles.
  2. Salin salah satu URL streaming dari konsol.

Contoh ini menampilkan URL yang dapat digunakan untuk memutar video menggunakan protokol yang berbeda:

Contoh output yang memperlihatkan URL untuk video streaming Media Services

Menguji URL streaming

Untuk menguji streaming, artikel ini menggunakan Azure Media Player.

Catatan

Jika pemutar dihosting di situs https, pastikan untuk memperbarui URL ke "https".

  1. Buka browser web dan navigasi ke https://aka.ms/azuremediaplayer/.
  2. Dalam kotak URL: tempelkan salah satu nilai URL streaming yang Anda dapatkan saat menjalankan aplikasi.
  3. Pilih Perbarui Pemutar.

Azure Media Player dapat digunakan untuk pengujian tetapi tidak boleh digunakan di lingkungan produksi.

Bersihkan sumber daya

Jika Anda tidak lagi memerlukan sumber daya apa pun di grup sumber daya, termasuk 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

Multi-alur

Azure Media Services v3 SDKs tidak aman untuk alur. Saat mengembangkan aplikasi multi-alur, Anda harus menghasilkan dan menggunakan objek AzureMediaServicesClient baru per alur.

Ajukan pertanyaan, berikan umpan balik, dapatkan pembaruan

Lihat artikel Komunitas Azure Media Services untuk melihat berbagai cara untuk dapat mengajukan pertanyaan, memberikan umpan balik, dan mendapatkan info terbaru tentang Media Services.

Langkah berikutnya

Setelah Anda mengetahui cara mengunggah, mengodekan, dan melakukan streaming video, lihat artikel berikut ini: