チュートリアル:Media Services v3 を使用してビデオをアップロード、エンコード、ストリーム配信するTutorial: Upload, encode, and stream videos with Media Services v3

Media Services ロゴ v3media services logo v3


注意

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

Azure Media Services を使うと、さまざまなブラウザーやデバイスで再生できる形式にメディア ファイルをエンコードできます。Azure Media Services lets you encode your media files into formats that play on a wide variety of browsers and devices. たとえば、Apple の HLS または MPEG DASH 形式のコンテンツをストリーム配信することが必要な場合があります。For example, you might want to stream your content in Apple's HLS or MPEG DASH formats. ストリーム配信する前に、高品質のデジタル メディア ファイルをエンコードする必要があります。Before streaming, you should encode your high-quality digital media file. エンコードの詳細については、エンコードの概念に関する記事を参照してください。For help with encoding, see Encoding concept. このチュートリアルでは、ローカルのビデオ ファイルをアップロードし、アップロードされたファイルをエンコードします。This tutorial uploads a local video file and encodes the uploaded file. HTTPS URL を使用してアクセスできるようにするコンテンツをエンコードすることもできます。You can also encode content that you make accessible via an HTTPS URL. 詳しくは、「HTTP URL からジョブの入力を作成する」をご覧ください。For more information, see Create a job input from an HTTP(s) URL.

Azure Media Player でビデオを再生する

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

  • このトピックで説明されているサンプル アプリをダウンロードする。Download the sample app described in the topic.
  • アップロード、エンコード、およびストリーム配信するコードを調べるExamine the code that uploads, encodes, and streams.
  • アプリケーションを実行します。Run the app.
  • ストリーミング URL をテストするTest the streaming URL.
  • リソースをクリーンアップする。Clean up resources.

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

前提条件Prerequisites

サンプルをダウンロードして設定するDownload and set up the sample

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

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

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

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

アップロード、エンコード、およびストリーム出力するコードを調べるExamine the code that uploads, encodes, and streams

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

サンプルは、次のアクションを実行します。The sample performs the following actions:

  1. 新しい変換を作成します (最初に、指定された変換が存在するかどうかを確認します)。Creates a new Transform (first, checks if the specified Transform exists).
  2. エンコード ジョブの出力として使用される出力アセットを作成します。Creates an output Asset that's used as the encoding Job's output.
  3. 入力アセットを作成し、指定されたローカル ビデオ ファイルをそこにアップロードします。Create an input Asset and uploads the specified local video file into it. アセットは、ジョブの入力として使用されます。The asset is used as the job's input.
  4. 作成された入力と出力を使用してエンコード ジョブを送信します。Submits the encoding job using the input and output that was created.
  5. ジョブの状態を確認します。Checks the job's status.
  6. ストリーミング ロケーターを作成します。Creates a Streaming Locator.
  7. ストリーミング URL を作成します。Builds streaming URLs.

.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 must 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 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 performs 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 Strorage 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 a job

出力アセットには、対象のエンコード ジョブの結果が格納されます。The output Asset stores the result of your encoding 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 encodes the uploaded file

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. 詳しくは、「Transform と Job」をご覧ください。For more information, see Transforms and Jobs. このチュートリアルで説明するサンプルでは、さまざまな iOS および Android デバイスにストリーム配信するために、ビデオをエンコードするレシピが定義されています。The sample described in this tutorial defines a recipe that encodes the video in order to stream it to a variety of iOS and Android devices.

変換Transform

新しい Transform インスタンスを作成するときは、出力として生成するものを指定する必要があります。When creating a new Transform instance, you need to specify what you want it to produce as an output. 必須のパラメーターは、下記のコードで示すように TransformOutput オブジェクトです。The required parameter is a TransformOutput object, as shown in the code below. TransformOutput には Preset が含まれます。Each TransformOutput contains a Preset. Preset では、目的の TransformOutput の生成に使用されるビデオやオーディオの処理操作の詳細な手順が記述されています。Preset describes the step-by-step instructions of video and/or audio processing operations that are to be used to generate the desired TransformOutput. この記事で説明されているサンプルでは、AdaptiveStreaming という名前の組み込みプリセットを使っています。The sample described in this article uses a built-in Preset called AdaptiveStreaming. プリセットは、入力ビデオを入力の解像度とビットレートに基づいて自動生成されるビットレート ラダー (ビットレートと解像度のペア) にエンコードし、ビットレートと解像度の各ペアに対応する、H.264 ビデオと AAC オーディオを含む ISO MP4 ファイルを生成します。The Preset encodes the input video into an auto-generated bitrate ladder (bitrate-resolution pairs) based on the input resolution and bitrate, and produces ISO MP4 files with H.264 video and AAC audio corresponding to each bitrate-resolution pair. このプリセットについては、ビットレート ラダーの自動生成に関するページをご覧ください。For information about this Preset, see auto-generating bitrate ladder.

組み込み EncoderNamedPreset またはカスタム プリセットを使用できます。You can use a built-in EncoderNamedPreset or use custom presets. 詳しくは、エンコーダー プリセットをカスタマイズする方法に関する記事をご覧ください。For more information, see How to customize encoder presets.

Transform を作成するときは、次のコードに示すように、最初に Get メソッドを使って変換が既に存在するかどうかを確認する必要があります。When creating a Transform, you should first check 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)
{
    // 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)
    {
        // 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;
}

ジョブ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.

この例では、入力ビデオはローカル コンピューターからアップロードされています。In this example, the input video has been uploaded from your local machine. HTTPS URL からのエンコード方法については、こちらの記事を参照してください。If you want to learn how to encode from an HTTPS URL, see this article.

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

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

ジョブの完了には時間がかかり、完了したら通知を受け取る必要があります。The job takes some time to complete and when it does you want to be notified. 次のコード例では、ジョブの状態をサービスに対してポーリングする方法を示します。The code sample below shows how to poll the service for the status of the Job. 待機時間が発生する可能性があるため、ポーリングは運用アプリに推奨されるベスト プラクティスではありません。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 エンドポイントへのイベントのルーティングに関するページをご覧ください。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 encountered an error, you get the Error state. ジョブがキャンセル処理中の場合は Canceling を受け取り、完了すると Canceled を受け取ります。If the job is in the process of being canceled, you get Canceling and 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.

ストリーミング ロケーターを取得するGet a Streaming Locator

エンコードが完了したら次に、出力アセット内のビデオを、クライアントが再生に使用できるようにします。After the encoding is complete, the next step is to make the video in the output Asset available to clients for playback. これを実現するには 2 つのステップがあります。最初にストリーミング ロケーターを作成し、次にクライアントが使用できるストリーミング URL を作成します。You can make it available in two steps: first, create a Streaming Locator, and second, build the streaming URLs that clients can use.

ストリーミング ロケーター を作成するプロセスは発行と呼ばれます。The process of creating a Streaming Locator is called publishing. 既定では、ストリーミング ロケーター は API 呼び出しを行うとすぐに有効になり、省略可能な開始時刻と終了時刻を構成しない限り、削除されるまで存続します。By default, the Streaming Locator is valid immediately after you make the API calls, and lasts until it's deleted, unless you configure the optional start and end times.

StreamingLocator を作成するときは、使用する StreamingPolicyName を指定する必要があります。When creating a StreamingLocator, you'll need to specify the desired StreamingPolicyName. この例では、クリアなコンテンツ (暗号化されていないコンテンツ) をストリーム配信するので、定義済みのクリア ストリーミング ポリシー PredefinedStreamingPolicy.ClearStreamingOnly が使用されます。In this example, you'll be streaming in-the-clear (or non-encrypted content) so the predefined clear streaming policy (PredefinedStreamingPolicy.ClearStreamingOnly) is used.

重要

カスタム ストリーミング ポリシーを使うときは、Media Service アカウントに対してこのようなポリシーの限られたセットを設計し、同じ暗号化オプションとプロトコルが必要なときは常に、お使いの StreamingLocator に対してそのセットを再利用する必要があります。When using a custom Streaming Policy, you should design a limited set of such policies for your Media Service account, and re-use them for your StreamingLocators whenever the same encryption options and protocols are needed. Media Service アカウントには、ストリーミング ポリシー エントリの数に対するクォータがあります。Your Media Service account has a quota for the number of Streaming Policy entries. ストリーミング ロケーターごとに新しいストリーミング ポリシーを作成しないでください。You shouldn't be creating a new Streaming Policy for each Streaming Locator.

次のコードでは、一意の locatorName で関数を呼び出しているものとします。The following code assumes that you're calling the function with a unique locatorName.

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

このトピックのサンプルではストリーム配信について説明していますが、同じ呼び出しを使って、プログレッシブ ダウンロードによるビデオ配信用のストリーミング ロケーターを作成できます。While the sample in this topic discusses streaming, you can use the same call to create a Streaming Locator for delivering video via progressive download.

ストリーミング URL を取得するGet streaming URLs

ストリーミング ロケーターが作成されたので、GetStreamingURLs で示されているように、ストリーミング URL を取得できます。Now that the Streaming Locator has been created, you can get the streaming URLs, as shown in GetStreamingURLs. URL を作成するには、ストリーミング エンドポイントのホスト名とストリーミング ロケーター パスを連結する必要があります。To build a URL, you need to concatenate the Streaming Endpoint host name and the Streaming Locator path. このサンプルでは、既定の ストリーミング エンドポイントを使っています。In this sample, the default Streaming Endpoint is used. 最初に Media Service アカウントを作成したとき、この既定の ストリーミング エンドポイントは停止状態になっているので、Start を呼び出す必要があります。When you first create a Media Service account, this default Streaming Endpoint will be in a stopped state, so you need to call Start.

注意

このメソッドでは、出力アセットのストリーミング ロケーターを作成するときに使った locatorName が必要です。In this method, you need the locatorName that was used when creating the Streaming Locator for the output Asset.

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 != null)
    {
        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;
}

Media Services アカウント内のリソースをクリーンアップするClean up resources 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 you'll persist StreamingLocators, etc.). 実験後にアカウントをクリーン アップする場合は、再利用する予定のないリソースを削除します。If you want 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, created assets and content key policy:

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

  1. Ctrl + F5 キーを押して、EncodeAndStreamFiles アプリを実行します。Press Ctrl+F5 to run the EncodeAndStreamFiles app.
  2. ストリーミング URL の 1 つをコンソールからコピーします。Copy one of the streaming URLs from the console.

この例では、別のプロトコルでビデオを再生するために使用できる URL が表示されます。This example displays URLs that can be used to play back the video using different protocols:

Media Services ストリーミング ビデオの URL を表示する出力例

ストリーミング URL をテストするTest the streaming URL

ストリーム配信をテストするため、この記事では Azure Media Player を使います。To test the stream, this article uses Azure Media Player.

注意

プレーヤーが HTTPS サイトでホストされている場合は、忘れずに URL を "https" に更新してください。If a player is hosted on an https site, make sure to update the URL to "https".

  1. Web ブラウザーを開いて、https://aka.ms/azuremediaplayer/ にアクセスします。Open a web browser and navigate to https://aka.ms/azuremediaplayer/.
  2. [URL:] ボックスに、アプリを実行したときに取得したストリーム配信 URL 値のいずれかを貼り付けます。In the URL: box, paste one of the streaming URL values you got when you ran the app.
  3. [Update Player](プレーヤーの更新) を選択します。Select Update Player.

Azure Media Player はテストには使用できますが、運用環境では使わないでください。Azure Media Player can be used for testing but shouldn't be used in a production environment.

リソースをクリーンアップする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 developing a multi-threaded app, you should generate and use 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

ビデオをアップロード、エンコード、ストリーム配信する方法がわかったので、次の記事を参照してください。Now that you know how to upload, encode, and stream your video, see the following article: