チュートリアル:Media Services v3 を使用してビデオを分析するTutorial: Analyze videos with Media Services v3

Media Services ロゴ v3media services logo v3


注意

このチュートリアルでは .NET SDK の例を使用していますが、全体的な手順は REST APICLI、またはその他のサポートされている SDK と同じです。Even though this tutorial uses the .NET SDK examples, the general steps are the same for REST API, CLI, or other supported SDKs.

このチュートリアルでは、Azure Media Services を使用したビデオの分析について説明します。This tutorial shows you how to analyze videos with Azure Media Services. 記録されたビデオまたはオーディオ コンテンツに関する詳細な分析情報を得る必要のある多くのシナリオがあります。There are many scenarios in which you might want to gain deep insights into recorded videos or audio content. たとえば、より高い顧客満足度を実現するため、組織は音声テキスト変換処理を実行して、カスタマー サポートの記録をインデックスとダッシュボードを含む検索可能なカタログに変換できます。For example, to achieve higher customer satisfaction, organizations can run speech-to-text processing to convert customer support recordings into a searchable catalog, with indexes and dashboards. その後、ビジネスの分析情報を取得することができます。Then, they can obtain insights into their business. そうした分析情報には、一連の一般的なクレームやそのソース、各種の有益な情報が含まれます。These insights include a list of common complaints, sources of such complaints, and other useful information.

このチュートリアルでは、次の操作方法について説明します。This tutorial shows you how to:

  • このトピックで説明されているサンプル アプリをダウンロードする。Download the sample app described in the topic.
  • 指定されたビデオを分析するコードを調べる。Examine the code that analyzes the specified video.
  • アプリケーションを実行します。Run the app.
  • 出力を調べる。Examine the output.
  • リソースをクリーンアップする。Clean up resources.

Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。If you don't have an Azure subscription, create a free account before you begin.

コンプライアンス、プライバシー、セキュリティCompliance, Privacy and Security

重要な注意事項として、Video Indexer の使用に適用されるすべての法律に従う必要があります。また、他の人の権利を犯したり、他の人に害を及ぼしたりする可能性のある方法で Video Indexer またはその他の Azure サービスを使用することはできません。As an important reminder, you must comply with all applicable laws in your use of Video Indexer, and you may not use Video Indexer or any other Azure service in a manner that violates the rights of others or may be harmful to others. 生体認証データなどのビデオを Video Indexer サービスにアップロードして処理と保管を行う前に、ビデオに写っている個人から適切なすべての同意を得ることを含め、適切な権限をすべて持っている必要があります。Before uploading any videos, including any biometric data, to the Video Indexer service for processing and storage, You must have all the proper rights, including all appropriate consents, from the individual(s) in the video. Video Indexer のコンプライアンス、プライバシー、セキュリティについては、Microsoft の Cognitive Services の条項に関するページを参照してください。To learn about compliance, privacy and security in Video Indexer, the Microsoft Cognitive Services Terms. Microsoft のプライバシー義務とデータの取り扱いについては、Microsoft のプライバシー ステートメントオンライン サービス条件 ("OST")、およびデータ処理の補遺 ("DPA") に関するページをご確認ください。For Microsoft’s privacy obligations and handling of your data, please review Microsoft’s Privacy Statement, the Online Services Terms (“OST”) and Data Processing Addendum (“DPA”). データの保持、削除、破棄などのその他のプライバシー情報は、OST およびこちらで確認できます。Additional privacy information, including on data retention, deletion/destruction, is available in the OST and here. Video Indexer を使用すると、Cognitive Services の条項、OST、DPA、およびプライバシー ステートメントに従うことに同意したものと見なされます。By using Video Indexer, you agree to be bound by the Cognitive Services Terms, the OST, DPA and the Privacy Statement.

前提条件Prerequisites

サンプルをダウンロードして構成するDownload and configure the sample

次のコマンドを使って、.NET サンプルが含まれる GitHub リポジトリを、お使いのコンピューターに複製します。Clone a GitHub repository that contains the .NET sample to your machine using the following command:

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

サンプルは AnalyzeVideos フォルダーにあります。The sample is located in the AnalyzeVideos folder.

ダウンロードしたプロジェクトに含まれる appsettings.json を開きます。Open appsettings.json in your downloaded project. API へのアクセスに関するページで取得した資格情報の値に置き換えます。Replace the values with the credentials you got from accessing APIs.

指定されたビデオを分析するコードを調べるExamine the code that analyzes the specified video

このセクションでは、AnalyzeVideos プロジェクトの Program.cs ファイルで定義されている関数を調べます。This section examines functions defined in the Program.cs file of the AnalyzeVideos project.

サンプルを実行すると、次のアクションが行われます。The sample completes the following actions:

  1. ビデオを分析する変換ジョブを作成します。Creates a Transform and a Job that analyzes your video.
  2. 入力アセットを作成し、そこにビデオをアップロードします。Creates an input Asset and uploads the video into it. アセットは、ジョブの入力として使用されます。The asset is used as the job's input.
  3. ジョブの出力を格納する出力アセットを作成します。Creates an output asset that stores the job's output.
  4. ジョブを送信します。Submits the job.
  5. ジョブの状態を確認します。Checks the job's status.
  6. ジョブの実行から生成されるファイルをダウンロードします。Downloads the files that resulted from running the job.

注意

ビデオ アナライザーまたはオーディオ アナライザーのプリセットを使用する場合は、Azure portal を使用して、10 個の S3 メディア占有ユニットを備えるようアカウントを設定します。When using a Video or Audio Analyzer presets, use the Azure portal to set your account to have 10 S3 Media Reserved Units. 詳細については、メディア処理のスケーリングに関するページを参照してください。For more information, see Scale media processing.

.NET SDK で Media Services API の使用を開始するStart using Media Services APIs with .NET SDK

.NET で Media Services API の使用を始めるには、AzureMediaServicesClient オブジェクトを作成する必要があります。To start using Media Services APIs with .NET, you need to create an AzureMediaServicesClient object. オブジェクトを作成するには、クライアントが Azure AD を使用して Azure に接続するために必要な資格情報を指定する必要があります。To create the object, you need to supply credentials needed for the client to connect to Azure using Azure AD. この記事の最初に複製したコード内で、ローカル構成ファイルで指定された資格情報に基づいて、GetCredentialsAsync 関数が ServiceClientCredentials オブジェクトを作成します。In the code you cloned at the beginning of the article, the GetCredentialsAsync function creates the ServiceClientCredentials object based on the credentials supplied in local configuration file.

private static async Task<IAzureMediaServicesClient> CreateMediaServicesClientAsync(ConfigWrapper config)
{
    var credentials = await GetCredentialsAsync(config);

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

入力アセットを作成し、ローカル ファイルをそれにアップロードするCreate an input asset and upload a local file into it

CreateInputAsset 関数は、新しい入力アセットを作成し、指定されたローカル ビデオ ファイルをそこにアップロードします。The CreateInputAsset function creates a new input Asset and uploads the specified local video file into it. このアセットは、エンコード ジョブへの入力として使われます。This Asset is used as the input to your encoding Job. Media Services v3 では、ジョブへの入力としては、アセットを使うか、または HTTPS URL 経由で Media Services アカウントから使用できるようにされたコンテンツを使うことができます。In Media Services v3, the input to a Job can either be an Asset, or it can be content that you make available to your Media Services account via HTTPS URLs. HTTPS URL からのエンコード方法については、こちらの記事を参照してください。To learn how to encode from an HTTPS URL, see this article.

Media Services v3 では、Azure Storage API を使ってファイルをアップロードします。In Media Services v3, you use Azure Storage APIs to upload files. 次の .NET スニペットはその方法を示したものです。The following .NET snippet shows how.

後で示す関数は、次の処理を実行します。The following function completes these actions:

  • アセットを作成する。Creates an Asset.

  • 書き込み可能な SAS URL を資産のストレージ内のコンテナーに取得する。Gets a writable SAS URL to the Asset’s container in storage.

    資産の ListContainerSas 関数を使用して SAS URL を取得する場合、複数の SAS URL が返されることに注意してください。これは、ストレージ アカウント キーがストレージ アカウントごとに 2 つ存在するためです。If using asset’s ListContainerSas function to get SAS URLs, note that the function returns multiple SAS URLs as there are two storage account keys for each storage account. ストレージ アカウントにキーが 2 つあるのは、ストレージ アカウント キーのシームレスなローテーションを可能にするためです (一方のキーを使用しながらもう一方のキーを変更した後、新しいキーの使用を開始し、その後もう一方のキーをローテーションするなど)。A storage account has two keys because it allows for seamless rotation of storage account keys (for example, change one while using the other then start using the new key and rotate the other key). 1 つ目の SAS URL はストレージ キー 1 を、2 つ目の SAS URL はストレージ キー 2 を表します。The 1st SAS URL represents storage key1 and second one storage key2.

  • SAS URL を使用してストレージ内のコンテナーにファイルをアップロードする。Uploads the file into the container in storage using the SAS URL.

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 Storage API to upload the file into the container in storage.
    await blob.UploadAsync(fileToUpload);

    return asset;
}

ジョブの結果を格納する出力アセットを作成するCreate an output asset to store the result of the job

出力アセットには、ジョブの結果が格納されます。The output Asset stores the result of your job. プロジェクトで定義されている DownloadResults 関数は、この出力アセットから "output" フォルダーに結果をダウンロードするので、取得したものを確認できます。The project defines the DownloadResults function that downloads the results from this output asset into the "output" folder, so you can see what you got.

private static async Task<Asset> CreateOutputAssetAsync(IAzureMediaServicesClient client, string resourceGroupName, string accountName, string assetName)
{
    // Check if an Asset already exists
    Asset outputAsset = await client.Assets.GetAsync(resourceGroupName, accountName, assetName);
    Asset asset = new Asset();
    string outputAssetName = assetName;

    if (outputAsset != null)
    {
        // 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);
}

ビデオを分析する変換とジョブを作成するCreate a transform and a job that analyzes videos

Media Services でコンテンツをエンコードまたは処理するときは、レシピとしてエンコード設定をセットアップするのが一般的なパターンです。When encoding or processing content in Media Services, it's a common pattern to set up the encoding settings as a recipe. その後、ジョブを送信してビデオにレシピを適用します。You would then submit a Job to apply that recipe to a video. 新しいビデオごとに新しいジョブを送信することで、ライブラリ内のすべてのビデオにレシピを適用します。By submitting new Jobs for each new video, you're applying that recipe to all the videos in your library. Media Services でのレシピは変換と呼ばれます。A recipe in Media Services is called a Transform. 詳しくは、「Transforms and jobs」(変換とジョブ) をご覧ください。For more information, see Transforms and jobs. このチュートリアルで説明されているサンプルでは、指定されたビデオを分析するレシピが定義されています。The sample described in this tutorial defines a recipe that analyzes the specified video.

変換Transform

新しい Transform インスタンスを作成するときは、出力として生成するものを指定する必要があります。When creating a new Transform instance, you need to specify what you want it to produce as an output. TransformOutput は必須パラメーターです。TransformOutput is a required parameter. TransformOutput には Preset が含まれます。Each TransformOutput contains a Preset. Preset では、目的の TransformOutput の生成に使用されるビデオやオーディオの処理操作の詳細な手順が記述されています。Preset describes step-by-step instructions of video and/or audio processing operations that are to be used to generate the desired TransformOutput. この例では、VideoAnalyzerPreset プリセットが使われていて、言語 ("en-US") がコンストラクター (new VideoAnalyzerPreset("en-US")) に渡されています。In this example, the VideoAnalyzerPreset preset is used and the language ("en-US") is passed to its constructor (new VideoAnalyzerPreset("en-US")). このプリセットを使用して、ビデオから複数の音声と画像の分析情報を抽出できます。This preset enables you to extract multiple audio and video insights from a video. 複数のオーディオ情報をビデオから抽出する必要がある場合は、AudioAnalyzerPreset プリセットを使用できます。You can use the AudioAnalyzerPreset preset if you need to extract multiple audio insights from a video.

Transform を作成するときは、次のコードに示すように、最初に Get メソッドを使って変換が既に存在するかどうかを確認します。When creating a Transform, check first if one already exists using the Get method, as shown in the code that follows. Media Services v3 では、エンティティが存在しない場合 (大文字と小文字の区別がない名前のチェック)、エンティティに対する Get メソッドは null を返します。In Media Services v3, Get methods on entities return null if the entity doesn’t exist (a case-insensitive check on the name).

private static async Task<Transform> GetOrCreateTransformAsync(IAzureMediaServicesClient client,
    string resourceGroupName,
    string accountName,
    string transformName,
    Preset preset)
{
    // 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 transform = await client.Transforms.GetAsync(resourceGroupName, accountName, transformName);

    if (transform == null)
    {
        // Start by defining the desired outputs.
        TransformOutput[] outputs = new TransformOutput[]
        {
            new TransformOutput(preset),
        };

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

    return transform;
}

ジョブJob

上で説明したように、Transform オブジェクトはレシピであり、JobTransform が特定の入力ビデオまたはオーディオ コンテンツに適用する Media Services への実際の要求です。As mentioned above, the Transform object is the recipe and a Job is the actual request to Media Services to apply that Transform to a given input video or audio content. Job は、入力ビデオの場所や出力先などの情報を指定します。The Job specifies information like the location of the input video and the location for the output. ビデオの場所は、HTTPS URL、SAS URL、または Media Service アカウント内のアセットを使用して指定できます。You can specify the location of your video using: HTTPS URLs, SAS URLs, or Assets that are in your Media Service account.

この例では、ジョブの入力はローカル ビデオです。In this example, the job input is a local video.

private static async Task<Job> SubmitJobAsync(IAzureMediaServicesClient client,
    string resourceGroupName,
    string accountName,
    string transformName,
    string jobName,
    JobInput jobInput,
    string outputAssetName)
{
    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, Get methods 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;
}

ジョブが完了するのを待つWait for the job to complete

ジョブが完了するまでに、一定の時間がかかります。The job takes some time to complete. 完了したら通知を受け取りたいでしょう。When it does, you want to be notified. ジョブ完了の通知の取得にはさまざまなオプションがあります。There are different options to get notified about the Job completion. 最も簡単なオプション (次に示すもの) は、ポーリングを使うものです。The simplest option (that's shown here) is to use polling.

待機時間が発生する可能性があるため、ポーリングは運用アプリに推奨されるベスト プラクティスではありません。Polling isn't a recommended best practice for production apps because of potential latency. アカウントで過剰に使った場合、ポーリングはスロットルされる可能性があります。Polling can be throttled if overused on an account. 開発者は、代わりに Event Grid を使う必要があります。Developers should instead use Event Grid.

Event Grid は、高可用性、一貫したパフォーマンス、および動的スケーリングを目的に設計されています。Event Grid is designed for high availability, consistent performance, and dynamic scale. Event Grid では、アプリはほぼすべての Azure サービスやカスタム ソースのイベントをリッスンし、対応できます。With Event Grid, your apps can listen for and react to events from virtually all Azure services, as well as custom sources. 単純な HTTP ベースのリアクティブ イベント ハンドリングでは、インテリジェントなイベント フィルタリングやイベント ルーティングを使用して、効率的なソリューションを構築できます。Simple, HTTP-based reactive event handling helps you build efficient solutions through intelligent filtering and routing of events. 詳細については、カスタム Web エンドポイントにイベントをルーティングする方法に関するページを参照してください。For more information, see Route events to a custom web endpoint.

Job には通常、ScheduledQueuedProcessingFinished (最終状態) という状態があります。The Job usually goes through the following states: Scheduled, Queued, Processing, Finished (the final state). ジョブでエラーが発生すると、Error 状態が返されます。If the job has come across an error, you get the Error state. ジョブがキャンセル処理中の場合は Canceling が、完了したときには Canceled が返されます。If the job is in the process of being canceled, you get Canceling and then Canceled when it's done.

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

ジョブ エラー コードJob error codes

エラー コードに関するページを参照してください。See Error codes.

ジョブの結果をダウンロードするDownload the result of the job

次の関数は出力アセットから "output" フォルダーに結果をダウンロードするので、ジョブの結果を調べることができます。The following function downloads the results from the output Asset into the "output" folder so you can examine the results of the job.

private static async Task DownloadOutputAssetAsync(
    IAzureMediaServicesClient client,
    string resourceGroup,
    string accountName,
    string assetName,
    string outputFolderName)
{
    if (!Directory.Exists(outputFolderName))
    {
        Directory.CreateDirectory(outputFolderName);
    }

    AssetContainerSas assetContainerSas = await client.Assets.ListContainerSasAsync(
        resourceGroup,
        accountName,
        assetName,
        permissions: AssetContainerPermission.Read,
        expiryTime: DateTime.UtcNow.AddHours(1).ToUniversalTime());

    Uri containerSasUrl = new Uri(assetContainerSas.AssetContainerSasUrls.FirstOrDefault());
    BlobContainerClient container = new BlobContainerClient(containerSasUrl);

    string directory = Path.Combine(outputFolderName, assetName);
    Directory.CreateDirectory(directory);

    Console.WriteLine($"Downloading output results to '{directory}'...");

    string continuationToken = null;
    IList<Task> downloadTasks = new List<Task>();

    do
    {
        var resultSegment = container.GetBlobs().AsPages(continuationToken);

        foreach (Azure.Page<BlobItem> blobPage in resultSegment)
        {
            foreach (BlobItem blobItem in blobPage.Values)
            {
                var blobClient = container.GetBlobClient(blobItem.Name);
                string filename = Path.Combine(directory, blobItem.Name);

                downloadTasks.Add(blobClient.DownloadToAsync(filename));
            }
            // Get the continuation token and loop until it is empty.
            continuationToken = blobPage.ContinuationToken;
        }


    } while (continuationToken != "");

    await Task.WhenAll(downloadTasks);

    Console.WriteLine("Download complete.");
}

Media Services アカウント内のリソースをクリーンアップするClean up resource in your Media Services account

一般に、再利用を計画しているオブジェクトを除くすべてのものをクリーンアップする必要があります (通常、Transform は再利用し、StreamingLocator は保持します)。Generally, you should clean up everything except objects that you're planning to reuse (typically, you'll reuse Transforms and persist StreamingLocators). 実験後にお使いのアカウントをクリーン アップする場合は、再利用する予定のないリソースを削除します。If you want for your account to be clean after experimenting, delete the resources that you don't plan to reuse. たとえば、次のコードでジョブと出力された資産を削除します。For example, the following code deletes the job and output asset:

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

サンプル アプリを実行するRun the sample app

Ctrl + F5 キーを押して、AnalyzeVideos アプリを実行します。Press Ctrl+F5 to run the AnalyzeVideos app.

プログラムを実行すると、ジョブはビデオで検出された各顔のサムネイルを生成します。When we run the program, the job produces thumbnails for each face that it finds in the video. insights.json ファイルも生成します。It also produces the insights.json file.

出力を調べるExamine the output

ビデオ分析の出力ファイルは、insights.json という名前です。The output file of analyzing videos is called insights.json. このファイルには、ビデオに関する分析情報が含まれています。This file contains insights about your video. json ファイルに含まれる要素の説明については、「Media intelligence」(メディア インテリジェンス) をご覧ください。You can find description of elements found in the json file in the Media intelligence article.

リソースをクリーンアップするClean up resources

このチュートリアルで作成した Media Services アカウントとストレージ アカウントも含め、リソース グループ内のどのリソースも必要なくなった場合は、前に作成したリソース グループを削除します。If you no longer need any of the resources in your resource group, including the Media Services and storage accounts you created for this tutorial, delete the resource group you created earlier.

次の CLI コマンドを実行します。Execute the following CLI command:

az group delete --name amsResourceGroup

マルチスレッドMultithreading

Azure Media Services v3 SDK は、スレッドセーフではありません。The Azure Media Services v3 SDKs aren't thread-safe. マルチスレッド アプリで使うときは、スレッドごとに新しい AzureMediaServicesClient オブジェクトを生成する必要があります。When working with a multi-threaded app, you should generate a new AzureMediaServicesClient object per thread.

質問、フィードバックの送信、最新情報の入手Ask questions, give feedback, get updates

Azure Media Services community (Azure Media Services コミュニティ)」を参照して、さまざまな質問の方法、フィードバックする方法、Media Services に関する最新情報の入手方法を確認してください。Check out the Azure Media Services community article to see different ways you can ask questions, give feedback, and get updates about Media Services.

次のステップNext steps