チュートリアル: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.
    API アクセスの詳細情報 (JSON 形式) をコピーするか、Media Services アカウントに接続するうえで必要な値をこのサンプルで使用する .env ファイルの書式に保存しておくようにしてください。Make sure to copy the API Access details in JSON format or store the values needed to connect to the Media Services account in the .env file format used in this sample.
  • Azure CLI で Azure Media Services API にアクセスする」の手順に従い、資格情報を保存します。Follow the steps in Access Azure Media Services API with the Azure CLI and save the credentials. これらは、このサンプルの API にアクセスする際や、 env ファイルの書式に入力する際に必要になります。You'll need to use them to access the API in this sample, or enter them into the .env file format.
  • イベントのブロードキャストに使用するカメラまたはデバイス (ラップトップなど)。A camera or a device (like a laptop) that's used to broadcast an event.
  • カメラ ストリームをエンコードし、RTMP プロトコルを使って Media Services のライブ ストリーミング サービスに送信するオンプレミスのソフトウェア エンコーダー (お勧めのオンプレミスのライブ エンコーダーに関するページを参照してください)。An on-premises software encoder that encodes your camera stream and sends it to the Media Services live streaming service using the RTMP protocol, see recommended on-premises live encoders. ストリームは RTMP または Smooth Streaming 形式である必要があります。The stream has to be in RTMP or Smooth Streaming format.
  • このサンプルには、シンプルに作業を開始するという観点から、最初は無料の Open Broadcaster Software OBS Studio のようなソフトウェア エンコーダーを使用することをお勧めします。For this sample, it is recommended to start with a software encoder like the free Open Broadcast Software OBS Studio to make it simple to get started.

ヒント

先に進む前に、「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 the following Git Hub repository that contains the live streaming .NET sample to your machine using the following command:

git clone https://github.com/Azure-Samples/media-services-v3-dotnet.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.

このほか、プロジェクトのルートにある .env ファイルの書式を使用して、.NET サンプルのリポジトリにある全プロジェクトに一括で環境変数を設定することもできます。Note that you can also use the .env file format at the root of the project to set your environment variables only once for all projects in the .NET samples repository. sample.env ファイルをコピーし、Azure portal の Media Services API アクセス ページまたは Azure CLI から入手した情報を入力します。Just copy the sample.env file, fill out the information that you obtain from the Azure portal Media Services API Access page, or from the Azure CLI. sample.env は、あらゆるプロジェクトで利用できるようにするために、ファイル名を ".env" に変更します。Rename the sample.env file to just ".env" to use it across all projects. .gitignore ファイルについては、フォークしたリポジトリにファイルの内容を公開しないようにする構成が済んでいます。The .gitignore file is already configured to avoid publishing the contents of this file to your forked repository.

重要

このサンプルでは、各リソースに一意のサフィックスを使用します。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

このセクションでは、LiveEventWithDVR プロジェクトの Program.cs ファイルに定義されている関数を調べます。This section examines functions defined in the Program.cs file of the LiveEventWithDVR 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.

.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 関数により、ローカルの構成ファイル (appsettings.json) またはリポジトリのルートにある .env 環境変数ファイルの中で指定されている資格情報に基づいて 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 (appsettings.json) or through the .env environment variables file located at the root of the repository.

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

    return new AzureMediaServicesClient(config.ArmEndpoint, credentials)
    {
        SubscriptionId = config.SubscriptionId,
        // Set to poll long running operations every 2 seconds. Default is 30. 
        // This helps speed up all code when creating Live Events and Live Outputs.
        LongRunningOperationRetryTimeout = 2
    };
}

ライブ イベントを作成する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 other available types of Live Events, see Live Event types. パススルーのほかには、720p または 1080p のアダプティブ ビットレート クラウド エンコードのためのライブ コード変換ライブ イベントを使用できます。In addition to pass-through, you can use a live transcoding Live Event for 720P or 1080P adaptive bitrate cloud encoding.

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

  • ライブ イベントの取り込みプロトコル (現時点では、RTMP(S) プロトコルと Smooth Streaming プロトコルがサポートされます)。The ingest protocol for the Live Event (currently, the RTMP(S) 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. このほか、各種のスタンバイ モードも利用できます。スタンバイ モードを使うと、"実行中" 状態にすばやく移行できる低コストの "割り当て済み" 状態でライブ イベントを開始できます。There are also standby modes available to start the Live Event in a lower cost 'allocated' state that makes it faster to move to a 'Running' state. これは、ホットプールのようにストリーマーにすばやくチャンネルを渡す必要がある局面で便利です。This is useful for situations like hotpools that need to hand out channels quickly to streamers.
  • ハードウェアベースのライブ エンコーダーで取り込み URL の予測やメンテナンスをしやすくする場合には、"useStaticHostname" プロパティを true に設定します。For an ingest URL to be predictive and easier to maintain in a hardware based live encoder, set the "useStaticHostname" property to true. 詳細については、「ライブ イベントの取り込み URL」を参照してください。For detailed information, see Live Event ingest URLs.
Console.WriteLine($"Creating a live event named {liveEventName}");
Console.WriteLine();

// Creating the LiveEvent - the primary object for live streaming in AMS. 
// See the overview - https://docs.microsoft.com/azure/media-services/latest/live-streaming-overview

// Create the LiveEvent

// Understand the concepts of what a live event and a live output is in AMS first!
// Read the following - https://docs.microsoft.com/azure/media-services/latest/live-events-outputs-concept
// 1) Understand the billing implications for the various states
// 2) Understand the different live event types, pass-through and encoding
// 3) Understand how to use long-running async operations 
// 4) Understand the available Standby mode and how it differs from the Running Mode. 
// 5) Understand the differences between a LiveOutput and the Asset that it records to.  They are two different concepts.
//    A live output can be considered as the "tape recorder" and the Asset is the tape that is inserted into it for recording.
// 6) Understand the advanced options such as low latency, and live transcription/captioning support. 
//    Live Transcription - https://docs.microsoft.com/en-us/azure/media-services/latest/live-transcription
//    Low Latency - https://docs.microsoft.com/en-us/azure/media-services/latest/live-event-latency

// When broadcasting to a live event, please use one of the verified on-premises live streaming encoders.
// While operating this tutorial, it is recommended to start out using OBS Studio before moving to another encoder. 

// 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 object
// this will control the IP that the encoder is running on and restrict access to only that encoder IP range.
LiveEventInputAccessControl liveEventInputAccess = new LiveEventInputAccessControl
{
    Ip = new IPAccessControl(
            allow: new IPRange[]
            {
                // re-use the same range here for the sample, but in production you can lock this
                // down to the ip range for your on-premises live encoder, laptop, or device that is sending
                // the live stream
                allAllowIPRange
            }
        )

};

// Create the LiveEvent Preview IP access control object. 
// This will restrict which clients can view the preview endpoint
LiveEventPreview liveEventPreview = new LiveEventPreview
{
    AccessControl = new LiveEventPreviewAccessControl(
        ip: new IPAccessControl(
            allow: new IPRange[]
            {
                 // re-use the same range here for the sample, but in production you can lock this to the IPs of your 
                // devices that would be monitoring the live preview. 
                allAllowIPRange
            }
        )
    )
};

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

// See REST API documentation for details on each setting value
// https://docs.microsoft.com/rest/api/media/liveevents/create 

LiveEvent liveEvent = new LiveEvent(
    location: mediaService.Location,
    description: "Sample LiveEvent from .NET SDK sample",
    // Set useStaticHostname to true to make the ingest and preview URL host name the same. 
    // This can slow things down a bit. 
    useStaticHostname: true,

    // 1) Set up the input settings for the Live event...
    input: new LiveEventInput(
        streamingProtocol: LiveEventInputProtocol.RTMP,  // options are RTMP or Smooth Streaming ingest format.
                                                         // This sets a static access token for use on the ingest path. 
                                                         // Combining this with useStaticHostname:true will give you the same ingest URL on every creation.
                                                         // This is helpful when you only want to enter the URL into a single encoder one time for this Live Event name
        accessToken: "acf7b6ef-8a37-425f-b8fc-51c2d6a5a86a",  // Use this value when you want to make sure the ingest URL is static and always the same. If omitted, the service will generate a random GUID value.
        accessControl: liveEventInputAccess, // controls the IP restriction for the source encoder.
        keyFrameIntervalDuration: "PT2S" // Set this to match the ingest encoder's settings
    ),
    // 2) Set the live event to use pass-through or cloud encoding modes...
    encoding: new LiveEventEncoding(
        // Set this to Standard or Premium1080P to use the cloud live encoder.
        // See https://go.microsoft.com/fwlink/?linkid=2095101 for more information
        // Otherwise, leave as "None" to use pass-through mode
        encodingType: LiveEventEncodingType.None // also known as pass-through mode.
                                                 // OPTIONAL settings when using live cloud encoding type:
                                                 // keyFrameInterval: "PT2S", //If this value is not set for an encoding live event, the fragment duration defaults to 2 seconds. The value cannot be set for pass-through live events.
                                                 // presetName: null, // only used for custom defined presets. 
                                                 //stretchMode: "None" // can be used to determine stretch on encoder mode
    ),
    // 3) Set up the Preview endpoint for monitoring based on the settings above we already set.
    preview: liveEventPreview,
    // 4) Set up more advanced options on the live event. Low Latency is the most common one.
    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 heuristic profile or you won't notice the change. 
        // In the AMP player client side JS options, set -  heuristicProfile: "Low Latency Heuristic Profile". 
        // To use low latency optimally, you should tune your encoder settings down to 1 second GOP size instead of 2 seconds.
        StreamOptionsFlag.LowLatency
    }
//,
// 5) Optionally enable live transcriptions if desired. 
// WARNING : This is extra cost ($$$), so please check pricing before enabling.
/*transcriptions:new List<LiveEventTranscription>(){
    new LiveEventTranscription(
        // The value should be in BCP-47 format (e.g: 'en-US'). See https://go.microsoft.com/fwlink/?linkid=2133742
        language: "en-us",
        outputTranscriptionTrack : new LiveEventOutputTranscriptionTrack(
            trackName: "English" // set the name you want to appear in the output manifest
        )
    )
}*/
);

// Start monitoring LiveEvent events using Event Grid and Event Hub
try
{
    // Please refer README for Event Hub and storage settings.
    Console.WriteLine("Starting monitoring LiveEvent events...");
    string StorageConnectionString = string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}",
        config.StorageAccountName, config.StorageAccountKey);

    // Create a new host to process events from an Event Hub.
    Console.WriteLine("Creating a new host to process events from an Event Hub...");
    eventProcessorHost = new EventProcessorHost(config.EventHubName,
        PartitionReceiver.DefaultConsumerGroupName, config.EventHubConnectionString,
        StorageConnectionString, config.StorageContainerName);

    // Registers the Event Processor Host and starts receiving messages.
    await eventProcessorHost.RegisterEventProcessorFactoryAsync(new MediaServicesEventProcessorFactory(liveEventName),
        EventProcessorOptions.DefaultOptions);
}
catch (Exception e)
{
    Console.WriteLine("Failed to connect to Event Hub, please refer README for Event Hub and storage settings. Skipping event monitoring...");
    Console.WriteLine(e.Message);
}

Console.WriteLine("Creating the LiveEvent, please be patient as this can take time to complete async.");
Console.WriteLine("Live Event creation is an async operation in Azure and timing can depend on resources available.");

// 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.
// On optional workflow is to first call allocate() instead of create. 
// https://docs.microsoft.com/en-us/rest/api/media/liveevents/allocate 
// This allows you to allocate the resources and place the live event into a "Standby" mode until 
// you are ready to transition to "Running". This is useful when you want to pool resources in a warm "Standby" state at a reduced cost.
// The transition from Standby to "Running" is much faster than cold creation to "Running" using the autostart property.
// Returns a long running operation polling object that can be used to poll until completion.

Stopwatch watch = Stopwatch.StartNew();
liveEvent = await client.LiveEvents.CreateAsync(
    config.ResourceGroup,
    config.AccountName,
    liveEventName,
    liveEvent,
    // When autostart is set to true, you should "await" this method operation to complete. 
    // The Live Event will be started after creation. 
    // You may choose not to do this, but create the object, and then start it using the standby state to 
    // keep the resources "warm" and billing at a lower cost until you are ready to go live. 
    // That increases the speed of startup when you are ready to go live. 
    autoStart: false);
watch.Stop();
string elapsedTime = String.Format(":{0:00}.{1:00}", watch.Elapsed.Seconds, watch.Elapsed.Milliseconds / 10);
Console.WriteLine($"Create Live Event run time : {elapsedTime}");

取り込み 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.

// Get the RTMP ingest URL to configure in OBS Studio. 
// The endpoints is a collection of RTMP primary and secondary, and RTMPS primary and secondary URLs. 
// to get the primary secure RTMPS, it is usually going to be index 3, but you could add a loop here to confirm...
string ingestUrl = liveEvent.Input.Endpoints.First().Url;
Console.WriteLine($"The RTMP ingest URL to enter into OBS Studio is:");
Console.WriteLine($"\t{ingestUrl}");
Console.WriteLine("Make sure to enter a Stream Key into the OBS studio settings. It can be any value or you can repeat the accessToken used in the ingest URL path.");
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.

// Use the previewEndpoint to preview and verify
// that the input from the encoder is actually being received
// The preview endpoint URL also support the addition of various format strings for HLS (format=m3u8-cmaf) and DASH (format=mpd-time-cmaf) for example.
// The default manifest is Smooth. 
string previewEndpoint = liveEvent.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.

ここに挙げた概念を学ぶにあたっては、"アセット" オブジェクトというものを、かつてビデオ テープ レコーダーに挿入していたテープにたとえて考えてみるのが良いでしょう。When learning these concepts, it is best to think of the "Asset" object as the tape that you would insert into a video tape recorder in the old days. "ライブ出力" は、テープ レコーダー マシンに相当します。The "Live Output" is the tape recorder machine. "ライブ イベント" は、マシンの背面に届くビデオ信号です。The "Live Event" is just the video signal coming into the back of the machine.

まずは、信号となる "ライブ イベント" を作成します。You first create the signal by creating the "Live Event". この信号は、ライブ イベントを開始し、エンコーダーを入力に接続するまで流れることはありません。The signal is not flowing until you start that Live Event and connect your encoder to the input.

テープの作成は、いつでも問題ありません。The tape can be created at any time. これは、ライブ出力オブジェクト (この比喩で言うならテープ レコーダー) に渡す空の "アセット" でしかありません。It is just an empty "Asset" that you will hand to the Live Output object, the tape recorder in this analogy.

テープ レコーダーを作成する時期も、いつでもかまいません。The tape recorder can be created at any time. つまり、ライブ出力の作成は、信号を流し始める前でも、後でも問題ありません。Meaning you can create a Live Output before starting the signal flow, or after. 物事を早く進める必要がある場合には、信号を流し始める前に作成しておくと良いでしょう。If you need to speed things up, it is sometimes helpful to create it before you start the signal flow.

テープ レコーダーを停止するときは、ライブ出力を対象とした delete を呼び出します。To stop the tape recorder, you call delete on the LiveOutput. これによりテープ、つまり "アセット" の中身が削除されることはありません。This does not delete the contents on the tape "Asset". アセットは、明示的にそのアセット自体を対象とした delete を呼び出さないかぎり、その中に保存されているビデオ コンテンツともども、そのまま保持されます。The Asset is always kept with the archived video content until you call delete explicitly on the Asset itself.

次のセクションでは、アセット ("テープ") とライブ出力 ("テープ レコーダー") の作成手順を説明します。The next section will walk through the creation of the Asset ("tape") and the Live Output ("tape recorder").

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

ライブ出力が使用するアセットを作成します。Create an Asset for the Live Output to use. これは、上の比喩で言うと、ライブ ビデオの信号を記録するテープに相当します。In the analogy above, this will be our tape that we record the live video signal onto. 視聴者は、この仮想のテープからコンテンツをライブまたはオンデマンドで見ることができます。Viewers will be able to see the contents live or on-demand from this virtual tape.

// Create an Asset for the LiveOutput to use. Think of this as the "tape" that will be recorded to. 
// The asset entity points to a folder/container in your Azure Storage account. 
Console.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. これは、イベントの "テープ レコーダー" になります。This is going to be the "tape recorder" for our event. ライブ出力を削除しても、基になるアセットやアセット内のコンテンツが削除されることはありません。When you delete the Live Output, you're not deleting the underlying Asset or content in the asset. テープを取り出しているようなものと考えてください。Think of it as ejecting the tape. アセットとそこに記録されている内容は、好きな期間だけ残しておくことができます。アセットを取り出すと (つまり、ライブ出力を削除すると)、そのアセットはすぐに、オンデマンドで視聴できる状態になります。The Asset with the recording will last as long as you like, and when it is ejected (meaning, when the Live Output is deleted) it will be available for on-demand viewing immediately.

// Create the Live Output - think of this as the "tape recorder for the live event". 
// Live outputs are optional, but are required if you want to archive the event to storage,
// use the asset for on-demand playback later, or if you want to enable cloud DVR time-shifting.
// We will use the asset created above for the "tape" to record to. 
string manifestName = "output";
Console.WriteLine($"Creating a live output named {liveOutputName}");
Console.WriteLine();

watch = Stopwatch.StartNew();
// See the REST API for details on each of the settings on Live Output
// https://docs.microsoft.com/rest/api/media/liveoutputs/create
LiveOutput liveOutput = new LiveOutput(
    assetName: asset.Name,
    manifestName: manifestName, // The HLS and DASH manifest file name. This is recommended to set if you want a deterministic manifest path up front.
                                // archive window can be set from 3 minutes to 25 hours. Content that falls outside of ArchiveWindowLength
                                // is continuously discarded from storage and is non-recoverable. For a full event archive, set to the maximum, 25 hours.
    archiveWindowLength: TimeSpan.FromHours(1)
);
liveOutput = await client.LiveOutputs.CreateAsync(
    config.ResourceGroup,
    config.AccountName,
    liveEventName,
    liveOutputName,
    liveOutput);
elapsedTime = String.Format(":{0:00}.{1:00}", watch.Elapsed.Seconds, watch.Elapsed.Milliseconds / 10);
Console.WriteLine($"Create Live Output run time : {elapsedTime}");
Console.WriteLine();

ストリーミング ロケーターを作成する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 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. このようにして、視聴者が仮想の "テープ" レコーディングをライブまたはオンデマンドで視聴できるようにします。This is how you make the virtual "tape" recording available for your viewing audience to see live and on-demand. ライブ イベント、DVR ウィンドウ、またはレコーディングが完了した (ライブ出力が削除された) 場合のオンデマンド アセットの視聴には、同じ URL を使用できます。The same URL can be used to watch the live event, DVR window, or the on-demand asset when the recording is complete (when the Live Output is deleted.)

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

IList<string> filters = new List<string>();
filters.Add(drvAssetFilterName);
StreamingLocator locator = await client.StreamingLocators.CreateAsync(config.ResourceGroup,
    config.AccountName,
    drvStreamingLocatorName,
    new StreamingLocator
    {
        AssetName = assetName,
        StreamingPolicyName = PredefinedStreamingPolicy.ClearStreamingOnly,
        Filters = filters   // Associate the dvr filter with StreamingLocator.
    });

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

    // Since we started the endpoint, we should stop it in cleanup.
    stopEndpoint = true;
}

// 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, string liveOutputName)
{
    try
    {
        LiveEvent liveEvent = await client.LiveEvents.GetAsync(resourceGroup, accountName, liveEventName);

        Console.WriteLine("Deleting Live Output");
        Stopwatch watch = Stopwatch.StartNew();

        await client.LiveOutputs.DeleteAsync(resourceGroup, accountName, liveEventName, liveOutputName);

        String elapsedTime = String.Format(":{0:00}.{1:00}", watch.Elapsed.Seconds, watch.Elapsed.Milliseconds / 10);
        Console.WriteLine($"Delete Live Output run time : {elapsedTime}");

        if (liveEvent != null)
        {
            if (liveEvent.ResourceState == LiveEventResourceState.Running)
            {
                watch = Stopwatch.StartNew();
                // If the LiveEvent is running, stop it and have it remove any LiveOutputs
                await client.LiveEvents.StopAsync(resourceGroup, accountName, liveEventName, removeOutputsOnStop: false);
                elapsedTime = String.Format(":{0:00}.{1:00}", watch.Elapsed.Seconds, watch.Elapsed.Milliseconds / 10);
                Console.WriteLine($"Stop Live Event run time : {elapsedTime}");
            }

            // 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