チュートリアル:Media Services によるライブ ストリーム配信Tutorial: Stream live with Media Services

注意

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

Azure Media Services では、ライブ イベントがライブ ストリーミング コンテンツの処理を受け持ちます。In Azure Media Services, Live Events are responsible for processing live streaming content. ライブ イベントは入力エンドポイントであり、その取り込み URL をライブ エンコーダーに対して指定します。A Live Event provides an input endpoint (ingest URL) that you then provide to a live encoder. ライブ イベントは、ライブ エンコーダーからライブ入力ストリームを受け取り、1 つまたは複数のストリーミング エンドポイントを介してストリーミングできる状態にします。The Live Event receives live input streams from the live encoder and makes it available for streaming through one or more Streaming Endpoints. また、ストリームはあらかじめプレビューし、確認したうえで処理、配信しますが、ライブ イベントはその際に使用するプレビュー エンドポイント (プレビュー URL) も提供します。Live Events also provide a preview endpoint (preview URL) that you use to preview and validate your stream before further processing and delivery. このチュートリアルでは、.NET Core を使用してライブ イベントのパススルー タイプを作成、管理する方法について説明します。This tutorial shows how to use .NET Core to create a pass-through type of a live event.

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

  • このトピックで説明されているサンプル アプリをダウンロードする。Download the sample app described in the topic.
  • ライブ ストリーミングを実行するコードを確認する。Examine the code that performs live streaming.
  • Azure Media Player (https://ampdemo.azureedge.net) でイベントを視聴する。Watch the event with Azure Media Player at https://ampdemo.azureedge.net.
  • リソースをクリーンアップする。Clean up resources.

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

前提条件Prerequisites

チュートリアルを完了するには以下が必要です。The following items are required to complete the tutorial:

  • Visual Studio Code または Visual Studio をインストールします。Install Visual Studio Code or Visual Studio.
  • Media Services アカウントを作成するCreate a Media Services account.
    リソース グループ名および Media Services アカウント名として使用した値を覚えておいてください。Make sure to remember the values you use for the resource group name and Media Services account name.
  • Azure CLI で Azure Media Services API にアクセスする」の手順に従い、資格情報を保存します。Follow the steps in Access Azure Media Services API with the Azure CLI and save the credentials. API にアクセスするために必要となります。You'll need to use them to access the API.
  • イベントのブロードキャストに使用するカメラまたはデバイス (ラップトップなど)。A camera or a device (like a laptop) that's used to broadcast an event.
  • カメラからの信号を Media Services ライブ ストリーミング サービスに送信されるストリームに変換するオンプレミスのライブ エンコーダー。詳細については、推奨されるオンプレミス ライブ エンコーダーに関するページをご覧ください。An on-premises live encoder that converts signals from the camera to streams that are sent to the Media Services live streaming service, see recommended on-premises live encoders. ストリームは RTMP または Smooth Streaming 形式である必要があります。The stream has to be in RTMP or Smooth Streaming format.

ヒント

先に進む前に、「Live streaming with Media Services v3」(Media Services v3 によるライブ ストリーミング) を確認してください。Make sure to review Live streaming with Media Services v3 before proceeding.

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

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

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

ライブ ストリーミングのサンプルは Live フォルダーにあります。The live streaming sample is located in the Live folder.

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

重要

このサンプルでは、各リソースに一意のサフィックスを使用します。This sample uses a unique suffix for each resource. デバッグをキャンセルした場合、または完全に実行せずにアプリを終了した場合、アカウントに複数のライブ イベントが作成されます。If you cancel the debugging or terminate the app without running it through, you'll end up with multiple Live Events in your account.
実行中のライブ イベントを必ず停止してください。Make sure to stop the running Live Events. そうしないと、料金が発生します。Otherwise, you'll be billed!

ライブ ストリーミングを実行するコードを確認するExamine the code that performs live streaming

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

サンプルをクリーンアップせずに複数回実行しても名前の競合が発生しないように、サンプルは各リソースに対して一意のサフィックスを作成します。The sample creates a unique suffix for each resource so that you don't have name collisions if you run the sample multiple times without cleaning up.

重要

このサンプルでは、各リソースに一意のサフィックスを使用します。This sample uses a unique suffix for each resource. デバッグをキャンセルした場合、または完全に実行せずにアプリを終了した場合、アカウントに複数のライブ イベントが作成されます。If you cancel the debugging or terminate the app without running it through, you'll end up with multiple Live Events in your account.
実行中のライブ イベントを必ず停止してください。Make sure to stop the running Live Events. そうしないと、料金が発生します。Otherwise, you'll be billed!

.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 a live event

このセクションは、パススルー タイプの (LiveEventEncodingType が None に設定されている) ライブ イベントを作成する方法を示します。This section shows how to create a pass-through type of Live Event (LiveEventEncodingType set to None). 使用可能なライブ イベントの種類について詳しくは、「ライブ イベントの種類」をご覧ください。For more information about the available types of Live Events, see Live Event types.

ライブ イベントを作成するときは、次のことを指定します。Some things that you might want to specify when creating the live event are:

  • Media Services の場所。Media Services location.
  • ライブ イベントのストリーミング プロトコル (現時点では、RTMP プロトコルと Smooth Streaming プロトコルがサポートされます)The streaming protocol for the Live Event (currently, the RTMP and Smooth Streaming protocols are supported).
    ライブ イベントや、それに関連付けられたライブ出力の実行中は、プロトコル オプションを変更できません。You can't change the protocol option while the Live Event or its associated Live Outputs are running. 別のプロトコルが必要な場合は、ストリーミング プロトコルごとに別のライブ イベントを作成する必要があります。If you require different protocols, create separate Live Event for each streaming protocol.
  • 取り込みやプレビューの IP 制限。IP restrictions on the ingest and preview. このライブ イベントへのビデオの取り込みが許可される IP アドレスを定義できます。You can define the IP addresses that are allowed to ingest a video to this Live Event. 許可される IP アドレスは、1 つの IP アドレス (例: '10.0.0.1')、IP アドレスと CIDR サブネット マスクを使用した IP 範囲 (例: '10.0.0.1/22')、IP アドレスとピリオドで区切られた 10 進数のサブネット マスクを使用した IP 範囲 (例: '10.0.0.1(255.255.252.0)') のいずれかの形で指定できます。Allowed IP addresses can be specified as either a single IP address (for example '10.0.0.1'), an IP range using an IP address and a CIDR subnet mask (for example, '10.0.0.1/22'), or an IP range using an IP address and a dotted decimal subnet mask (for example, '10.0.0.1(255.255.252.0)').
    IP アドレスが指定されておらず、規則の定義もない場合は、どの IP アドレスも許可されません。If no IP addresses are specified and there's no rule definition, then no IP address will be allowed. すべての IP アドレスを許可するには、規則を作成し、0.0.0.0/0 に設定します。To allow any IP address, create a rule and set 0.0.0.0/0.
    IP アドレスの形式は、4 つの数字を含む IpV4 アドレスか CIDR アドレス範囲にする必要があります。The IP addresses have to be in one of the following formats: IpV4 address with four numbers or CIDR address range.
  • イベントの作成時に、そのイベントを自動開始するように設定できます。When creating the event, you can specify to autostart it.
    自動開始が true に設定されている場合、ライブ イベントは作成された後に開始されます。When autostart is set to true, the Live Event will be started after creation. つまり、ライブ イベントの実行が開始されるとすぐに課金が開始されます。That means the billing starts as soon as the Live Event starts running. それ以上の課金を停止するには、ライブ イベント リソースの Stop を明示的に呼び出す必要があります。You must explicitly call Stop on the Live Event resource to halt further billing. 詳細については、ライブ イベントの状態と課金に関するページを参照してください。For more information, see Live Event states and billing.
  • 取り込み URL を予測的にするには、"バニティ" モードを設定します。For an ingest URL to be predictive, set the "vanity" mode. 詳細については、「ライブ イベントの取り込み URL」を参照してください。For detailed information, see Live Event ingest URLs.
Console.WriteLine($"Creating a live event named {liveEventName}");
Console.WriteLine();

// Note: When creating a LiveEvent, you can specify allowed IP addresses in one of the following formats:                 
//      IpV4 address with 4 numbers
//      CIDR address range

IPRange allAllowIPRange = new IPRange(
    name: "AllowAll",
    address: "0.0.0.0",
    subnetPrefixLength: 0
);

// Create the LiveEvent input IP access control.
LiveEventInputAccessControl liveEventInputAccess = new LiveEventInputAccessControl
{
    Ip = new IPAccessControl(
            allow: new IPRange[]
            {
                allAllowIPRange
            }
        )

};

// Create the LiveEvent Preview IP access control
LiveEventPreview liveEventPreview = new LiveEventPreview
{
    AccessControl = new LiveEventPreviewAccessControl(
        ip: new IPAccessControl(
            allow: new IPRange[]
            {
                allAllowIPRange
            }
        )
    )
};

// To get the same ingest URL for the same LiveEvent name:
// 1. Set vanityUrl to true so you have ingest like: 
//        rtmps://liveevent-hevc12-eventgridmediaservice-usw22.channel.media.azure.net:2935/live/522f9b27dd2d4b26aeb9ef8ab96c5c77           
// 2. Set accessToken to a desired GUID string (with or without hyphen)

LiveEvent liveEvent = new LiveEvent(
    location: mediaService.Location,
    description: "Sample LiveEvent for testing",
    vanityUrl: false,
    encoding: new LiveEventEncoding(
                // When encodingType is None, the service simply passes through the incoming video and audio layer(s) to the output
                // When the encodingType is set to Standard or Premium1080p, a live encoder is used to transcode the incoming stream
                // into multiple bit rates or layers. See https://go.microsoft.com/fwlink/?linkid=2095101 for more information
                encodingType: LiveEventEncodingType.None,
                presetName: null
            ),
    input: new LiveEventInput(LiveEventInputProtocol.RTMP, liveEventInputAccess),
    preview: liveEventPreview,
    streamOptions: new List<StreamOptionsFlag?>()
    {
        // Set this to Default or Low Latency
        // When using Low Latency mode, you must configure the Azure Media Player to use the 
        // quick start hueristic 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.
        StreamOptionsFlag.LowLatency
    }
);

Console.WriteLine($"Creating the LiveEvent, be patient this can take time...");

// When autostart is set to true, the Live Event will be started after creation. 
// That means, the billing starts as soon as the Live Event starts running. 
// You must explicitly call Stop on the Live Event resource to halt further billing.
// The following operation can sometimes take awhile. Be patient.
liveEvent = await client.LiveEvents.CreateAsync(config.ResourceGroup, config.AccountName, liveEventName, liveEvent, autoStart: true);

取り込み URL の取得Get ingest URLs

ライブ イベントが作成されると、ライブ エンコーダーに提供する取り込み URL を取得できます。Once the Live Event is created, you can get ingest URLs that you'll provide to the live encoder. エンコーダーは、これらの URL を使用して、ライブ ストリームを入力します。The encoder uses these URLs to input a live stream.

string ingestUrl = liveEvent.Input.Endpoints.First().Url;
Console.WriteLine($"The ingest url to configure the on premise encoder with is:");
Console.WriteLine($"\t{ingestUrl}");
Console.WriteLine();

プレビュー URL を取得するGet the preview URL

previewEndpoint を使用して、エンコーダーからの入力が実際に受信されていることをプレビューおよび確認します。Use the previewEndpoint to preview and verify that the input from the encoder is actually being received.

重要

続行する前に、ビデオがプレビュー URL に送信されていることを確認してください。Make sure that the video is flowing to the Preview URL before continuing.

string previewEndpoint = liveEvent.Preview.Endpoints.First().Url;
Console.WriteLine($"The preview url is:");
Console.WriteLine($"\t{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($"\thttps://ampdemo.azureedge.net/?url={previewEndpoint}&heuristicprofile=lowlatency");
Console.WriteLine();

ライブ イベントとライブ出力を作成して管理するCreate and manage Live Events and Live Outputs

ストリームがライブ イベントに流れ始めると、アセット、ライブ出力、ストリーミング ロケーターを作成することにより、ストリーミング イベントを開始できます。Once you have the stream flowing into the Live Event, you can begin the streaming event by creating an Asset, Live Output, and Streaming Locator. これにより、ストリームがアーカイブされ、ストリーミング エンドポイントを介して視聴者がストリームを使用できるようになります。This will archive the stream and make it available to viewers through the Streaming Endpoint.

アセットを作成するCreate an Asset

ライブ出力が使用するアセットを作成します。Create an Asset for the Live Output to use.

Console.WriteLine($"Creating an asset named {assetName}");
Console.WriteLine();
Asset asset = await client.Assets.CreateOrUpdateAsync(config.ResourceGroup, config.AccountName, assetName, new Asset());

ライブ出力を作成するCreate a Live Output

ライブ出力は作成すると開始され、削除されると停止します。Live Outputs start on creation and stop when deleted. ライブ出力を削除しても、基になるアセットとアセット内のコンテンツは削除されません。When you delete the Live Output, you're not deleting the underlying Asset and content in the asset.

string manifestName = "output";
Console.WriteLine($"Creating a live output named {liveOutputName}");
Console.WriteLine();

LiveOutput liveOutput = new LiveOutput(assetName: asset.Name, manifestName: manifestName, archiveWindowLength: TimeSpan.FromMinutes(10));
liveOutput = await client.LiveOutputs.CreateAsync(config.ResourceGroup, config.AccountName, liveEventName, liveOutputName, liveOutput);

ストリーミング ロケーターを作成するCreate a Streaming Locator

注意

Media Services アカウントの作成時に、既定のストリーミング エンドポイントが停止状態でアカウントに追加されます。When your Media Services account is created, a default streaming endpoint is added to your account in the Stopped state. コンテンツのストリーミングを開始し、ダイナミック パッケージと動的暗号化を活用するには、コンテンツのストリーミング元のストリーミング エンドポイントが実行中状態である必要があります。To start streaming your content and take advantage of dynamic packaging and dynamic encryption, the streaming endpoint from which you want to stream content has to be in the Running state.

ストリーミング ロケーターを使用してライブ出力アセットを発行した場合、ライブ イベント (DVR ウィンドウの長さまで) は、ストリーミング ロケーターの有効期限まで、または削除するまで、どちらか早い方のタイミングまで引き続き表示できます。When you publish the Live Output asset using a Streaming Locator, the Live Event (up to the DVR window length) will continue to be viewable until the Streaming Locator's expiry or deletion, whichever comes first.

Console.WriteLine($"Creating a streaming locator named {streamingLocatorName}");
Console.WriteLine();

StreamingLocator locator = new StreamingLocator(assetName: asset.Name, streamingPolicyName: PredefinedStreamingPolicy.ClearStreamingOnly);
locator = await client.StreamingLocators.CreateAsync(config.ResourceGroup, config.AccountName, streamingLocatorName, locator);

// Get the default Streaming Endpoint on the account
StreamingEndpoint streamingEndpoint = await client.StreamingEndpoints.GetAsync(config.ResourceGroup, config.AccountName, streamingEndpointName);

// If it's not running, Start it. 
if (streamingEndpoint.ResourceState != StreamingEndpointResourceState.Running)
{
    Console.WriteLine("Streaming Endpoint was Stopped, restarting now..");
    await client.StreamingEndpoints.StartAsync (config.ResourceGroup, config.AccountName, streamingEndpointName);
}

// Get the url to stream the output
ListPathsResponse paths = await client.StreamingLocators.ListPathsAsync(resourceGroupName, accountName, locatorName);

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

    uriBuilder.Path = path.Paths[0];
    // Get the URL from the uriBuilder: uriBuilder.ToString()
}

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

ストリーミング イベントが完了し、以前にプロビジョニングされたリソースをクリーンアップする場合は、次の手順に従います。If you're done streaming events and want to clean up the resources provisioned earlier, follow the following procedure:

  • エンコーダーからのストリームのプッシュを停止します。Stop pushing the stream from the encoder.
  • ライブ イベントを停止します。Stop the Live Event. ライブ イベントが停止した後は、いかなる課金も発生しません。Once the Live Event is stopped, it won't incur any charges. もう一度開始する必要がある場合、取り込み URL は同一になるため、エンコーダーを再構成する必要はありません。When you need to start it again, it will have the same ingest URL so you won't need to reconfigure your encoder.
  • ライブ イベントのアーカイブをオンデマンド ストリームとして提供し続けるのでない限り、ストリーミング エンドポイントを停止できます。You can stop your Streaming Endpoint, unless you want to continue to provide the archive of your live event as an on-demand stream. ライブ イベントが停止状態の場合は、料金は発生しません。If the Live Event is in a stopped state, it won't incur any charges.
private static async Task CleanupLiveEventAndOutputAsync(IAzureMediaServicesClient client, string resourceGroup, string accountName, string liveEventName)
{
    try
    {
        LiveEvent liveEvent = await client.LiveEvents.GetAsync(resourceGroup, accountName, liveEventName);

        if (liveEvent != null)
        {
            if (liveEvent.ResourceState == LiveEventResourceState.Running)
            {
                // If the LiveEvent is running, stop it and have it remove any LiveOutputs
                await client.LiveEvents.StopAsync(resourceGroup, accountName, liveEventName, removeOutputsOnStop: true);
            }

            // Delete the LiveEvent
            await client.LiveEvents.DeleteAsync(resourceGroup, accountName, liveEventName);
        }
    }
    catch (ApiErrorException e)
    {
        Console.WriteLine("CleanupLiveEventAndOutputAsync -- Hit ApiErrorException");
        Console.WriteLine($"\tCode: {e.Body.Error.Code}");
        Console.WriteLine($"\tCode: {e.Body.Error.Message}");
        Console.WriteLine();
    }
}
private static async Task CleanupLocatorandAssetAsync(IAzureMediaServicesClient client, string resourceGroup, string accountName, string streamingLocatorName, string assetName)
{
    try
    {
        // Delete the Streaming Locator
        await client.StreamingLocators.DeleteAsync(resourceGroup, accountName, streamingLocatorName);

        // Delete the Archive Asset
        await client.Assets.DeleteAsync(resourceGroup, accountName, assetName);
    }
    catch (ApiErrorException e)
    {
        Console.WriteLine("CleanupLocatorandAssetAsync -- Hit ApiErrorException");
        Console.WriteLine($"\tCode: {e.Body.Error.Code}");
        Console.WriteLine($"\tCode: {e.Body.Error.Message}");
        Console.WriteLine();
    }
}

イベントの視聴Watch the event

イベントを監視するには、「ストリーミング ロケーターを作成する」で説明されているコードを実行したときに表示されたストリーミング URL をコピーします。To watch the event, copy the streaming URL that you got when you ran code described in Create a Streaming Locator. 任意のメディア プレーヤーを使用できます。You can use a media player of your choice. Azure Media Player は、 https://ampdemo.azureedge.net でのストリームをテストするために使用できます。Azure Media Player is available to test your stream at https://ampdemo.azureedge.net.

ライブ イベントが停止すると、イベントがオンデマンド コンテンツに自動的に変換されます。Live Event automatically converts events to on-demand content when stopped. イベントを停止して削除した後でも、アセットを削除しない限り、ユーザーはアーカイブされたコンテンツをビデオ オン デマンドとしてストリーム配信できます。Even after you stop and delete the event, users can stream your archived content as a video on demand for as long as you don't delete the asset. イベントがアセットを使用している場合はアセットを削除できません。まずイベントを削除する必要があります。An asset can't be deleted if it's used by an event; the event must be deleted first.

リソースをクリーンアップする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

重要

ライブ イベントを実行したままにすると課金が発生します。Leaving the Live Event running incurs billing costs. プロジェクトやプログラムがクラッシュする、またはなんらかの理由で閉じられると、ライブ イベントが課金状態で実行されたままになるため、ご注意ください。Be aware, if the project/program crashes or is closed out for any reason, it could leave the Live Event running in a billing state.

質問、フィードバックの送信、最新情報の入手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

ファイルをストリーミングするStream files