ライブ配信サーバーを1 Click、5分で立てる! (C#編)

Azure Media Servicesの最大の魅力は、API Platformであるという点です。これにより簡単なツールの作成から、大規模システムに必要な映像配信の既存のワークフローと統合できる点です。
VoDに関しては、別記事に概説がありますが、ここではPublic PreviewになったLive機能についても早速自動化するサンプルコードをご紹介します。Windows PCで動作するコンソールアプリケーションを作成しましょう! Azure 管理画面の無い世界です。
ちなみに、手元にWindowsが無い方は、無償でも使えるAzureの契約があればAzure上のWindows環境で同じ事が出来ます!

 

VoDのAPIご参考:

はじめての Windows Azure メディア サービス:
http://msdn.microsoft.com/ja-jp/windowsazure/dn133199

Developer Camp 2012 Japan Fall: マルチデバイスへの動画配信サービス – Windows Azure Media Services とは – :
http://channel9.msdn.com/Events/Windows-Azure-DevCamps/Developer-Camp-2012-Japan-Fall/Devcampjp_D2S2

キャッチアップ! Windows Azure メディアサービス:
http://gihyo.jp/dev/serial/01/azure_mediaservices

 

用意するもの

  • Azureの契約
    • こちらから、どうぞ: http://aka.ms/startazure
    • MSDNをお持ちの方は、Azure特典ご活用ください! 勿体ない…
  • Visual Studio 2010以上マルチデバイスへの動画配信サービス ~ Windows Azure Media Services とは ~マルチデバイスへの動画配信サービス ~ Windows Azure Media Services とは ~
    • やっぱり、最新のVisual Studio 2013 が欲しいですね!
    • Visual Studio 2013: http://www.visualstudio.com/
    • MSDN特典をお持ちの方はAzure利用特典があります。Azure上の仮想マシンギャラリーの中にVisual Studio 2013入りのイメージがあります。さくっとVisual Studioが使えますので、ご活用ください。

手順

  1. Visual Studio 2013を起動し、[Visual C#] – [コンソール アプリケーション] を選択し、プロジェクトを作成します。
  2. Azure Media Services .NET SDK ExtensionsのライブラリをNuGetから追加します。
    [依存関係] を見ていただきたいのですが、Azure Media Services .NET SDKのLive public previewの入っている3.0.0.7 以降を参照しています。
    ここからは、コードを書いていきます。

     

サンプルコード

利用する、クラスは主に以下の4つです。

クラス名 役割
Channel

取り込み先、およびPreviewを担っています。

Program

配信先情報を管理します。URLやアーカイブです。
単一のChannelで、アーカイブ時間の異なる複数のProgramを持てます。

Asset

アーカイブのためのBlobファイルになります。VoDのAPIと共通です。
Programと1:1で紐づきます。

Locator

配信URLになります。

 

Steaming Endpointも勿論作成したりできます。異なるドメイン名を作成できたりしますが、ここでは割愛します。

こちらがサンプルコード全文です。

コード

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Diagnostics;

using System.Net;

 

using Microsoft.WindowsAzure.MediaServices.Client;

 

namespace ConsoleApplication2

{

class Program

{

static string ChannelName = “dahatakeChannel”

+ DateTime.Now.ToShortDateString().Replace(“/”, “”)

+ DateTime.Now.ToShortTimeString().Replace(“:”, “”);

 

static void Main(string[] args)

{

// 処理時間の計測

var totalSw = new Stopwatch();

totalSw.Start();

var sw = new Stopwatch();

 

var con = new CloudMediaContext(“<Azure Media Services Account Name>“, “<Azure Media Services Account Key>“);

 

// 1. Channel 作成と開始

Console.WriteLine(“1. Channel 作成”);

 

sw.Start();

var channel = con.Channels.Create(

new ChannelCreationOptions(

ChannelName,

StreamingProtocol.RTMP, //RTMPで取り込み実施

new List<IPRange>

{

new IPRange

{

Name = “All OK”,

Address = IPAddress.Parse(“0.0.0.0”),

SubnetPrefixLength = 0

}

}

));

 

sw.Stop();

Console.WriteLine(” Channel 作成時間: {0}”, sw.Elapsed.ToString());

 

Console.WriteLine(“2. Channel 開始”);

sw.Reset();

sw.Start();

channel.Start();

sw.Stop();

Console.WriteLine(” Channel 開始完了時間: {0}”, sw.Elapsed.ToString());

 

WriteToFile(

ChannelName + “_取り込みURL.txt”,

channel.Input.Endpoints.FirstOrDefault().Url.ToString());

WriteToFile(

ChannelName + “_PreviewURL.txt”,

channel.Preview.Endpoints.FirstOrDefault().Url.ToString());

 

Console.WriteLine(“Azure上でのエンコーダーからの取り込みの準備が完了しました。”);

Console.WriteLine(” ***URL出力先 (デスクトップにあります)***”);

Console.WriteLine(” ” + ChannelName + “_取り込みURL.txt ファイル”);

Console.WriteLine(” ” + ChannelName + “_PreviewURL.txt ファイル”);

Console.WriteLine(“”);

Console.WriteLine(“[次の手順]”);

Console.WriteLine(“エンコーダーからAzureへの配信を開始して、Azureに上で映像を受信できているのを確認してください。”);

Console.WriteLine(“確認後、Entry Keyを押すことで、Azureからインターネットへ配信を開始します。”);

Console.ReadLine();

 

Console.WriteLine(“3. Program 作成”);

sw.Reset();

sw.Start();

 

// 2. アーカイブ および DVRWindow のための Asset 作成

var archiveData = con.Assets.Create(

ChannelName + “_Archive”,

AssetCreationOptions.None);

 

// 3. プログラム作成と開始

var program = channel.Programs.Create(

ChannelName + “Program”,

TimeSpan.FromMinutes(5), //アーカイブ時間

archiveData.Id);

sw.Stop();

Console.WriteLine(” Program 作成時間: {0}”, sw.Elapsed.ToString());

 

Console.WriteLine(“4. Program 開始”);

sw.Reset();

sw.Start();

program.Start();

sw.Stop();

Console.WriteLine(” Program 開始完了時間: {0}”, sw.Elapsed.ToString());

 

// 4. Locator作成

Console.WriteLine(“5. Locator 作成”);

sw.Reset();

sw.Start();

var locator = con.Locators.CreateLocator(

LocatorType.OnDemandOrigin,

archiveData,

con.AccessPolicies.Create(

“Live Streaming”,

TimeSpan.FromDays(3650), // コンテンツの公開期間: 10年

AccessPermissions.Read

));

 

sw.Stop();

Console.WriteLine(” Locator 作成時間: {0}”, sw.Elapsed.ToString());

 

WriteToFile(

ChannelName + “_発行URL(Smooth).txt”,

locator.GetSmoothStreamingUri().AbsoluteUri);

 

Console.WriteLine();

Console.WriteLine(“全ての処理が終了しました。発行URLがデスクトップに出力されていますので、ご確認ください。”);

Console.WriteLine(“総処理時間: {0}”, totalSw.Elapsed.ToString());

Console.WriteLine(“何かキーを押してください。”);

Console.ReadLine();

 

}

 

 

/// <summary>

/// Utility: 文字列のファイル出力

/// </summary>

/// outFileName”>

/// fileContent”>

static void WriteToFile(string outFileName, string fileContent)

{

 

System.IO.StreamWriter sr = System.IO.File.CreateText(

Environment.GetEnvironmentVariable(“USERPROFILE”) +

@”Desktop” +

outFileName);

sr.Write(fileContent);

sr.Flush();

sr.Close();

}

}

}

 

解説

  • 取り込みプロコルはRTMPの指定がされています。Smooth Streaming形式にも対応できますので、適時変更ください。
  • 取り込みURLのアクセス制御ですがIP Addressでできます。このサンプルコードは、どの場所からでもOKの状態です。Preview URLと合わせて、適時変更ください。
  • 各種URLをデスクトップ上のテキストファイルに出力しています。
    • エンコーダー (Expression Encoder, Wirecastなど) に設定する「取り込みURL」
    • エンコーダーからの映像/音声が、Azureに届いているのを確認する「PreviewURL」
    • 配信を開始した後の「発行URL」
  • ライブ配信時に「見逃し視聴時間」「アーカイブ時間」が出来ますが、それは「5分」のみになっています。Program作成時の第二引数で指定してください。「見逃し視聴時間」と「アーカイブ時間」を1つのProgramで別設定は出来ません。別の設定が必要な場合は、Programを複数作成してください。それぞれにアーカイブ先のAssetと配信URLであるLocatorが必要です。
  • 見逃し視聴時間を超えても配信はし続けます。その際アーカイブファイルは上書きされていきます。

実際のアプリケーションの動き

  1. exeファイルをクリックします。
    コンソールが起動して、処理経過を表示してくれます。
    Channelが作成開始されると、取り込み用のURLと、プレビュー確認用のURLがデスクトップに出力されています。
    テキストのファイルが出力されていますね。
  2. エンコーダーに取り込みURLを設定して、配信を開始
    Azure Media Servicesはエンコーダーからの配信を受け付ける準備が出来ています。ここでは、TeleStream社のWirecastを使って、エンコードを行います。
    手順のご参考: Azure Media Services Live streaming などがPublic Previewになりました
    ご注意: Wirecastのエンコード設定にご注意ください。
    ご参考Wirecastのエンコード設定: Using Telestream Wirecast Encoder with Media Servicesデスクトップには、Wirecastと取り込みURLの設定が並んでいます。

  3. Wirecastで[ストリーム]ボタンを押して、Azureに配信を開始します。
    映像がAzureに正しく送信できているかを、同じくデスクトップに出力されているPreview URLを使って確認します。
    ご注意点: Azure Media ServicesのLive Previewで、Preview URLについては、Dynamic Packagingの実装がされていません。Smooth StreamingのPlayerにて確認ください。

    Smooth Streaming確認用のPlayer: http://amsplayer.azurewebsites.net/
    ご注意点: 勿論Smooth Streamingが再生できればどこでも良いです。

  4. コンソールアプリケーションに戻って[Enter Key]を押して、配信を開始します。
    ProgramとAsset/Locatorの作成に処理が進みます。
    全て処理が完了すると、以下の様に表示されます。
    ご注意点: ここでは「総処理時間が7分11秒」と表示されていますが、この時間は、Blogを書きながら、Wirecastの設定もしながら、という私の「操作時間」も含めてのものです。API呼び出しの総合計時間ではありませんので。
    デスクトップには、ファイルが3つ。
    このうちの「xxx発行URL(Smooth).txt」を各種プレイヤーに渡して再生できるか確認をしてください。

    DASH-IF.Orgのリファレンスプレイヤー: http://dashif.org/reference/players/javascript/1.2.0/index.html
    しつこいですが、IE11で見ましょう(笑)。

    ご参考:
    デバイス毎のURL作成に: Dynamic Packaging: http://msdn.microsoft.com/ja-jp/library/jj889436.aspx
    シンプルなマルチデバイス対応のブラウザービデオプレイヤーの作成に: https://daiyuhatakeyama.wordpress.com/2014/09/17/browser%e3%83%99%e3%83%bc%e3%82%b9%e3%81%ae%e3%83%93%e3%83%87%e3%82%aa%e3%83%97%e3%83%ac%e3%82%a4%e3%83%a4%e3%83%bc-version-0-7-%e3%81%a8azure-media-services/

 

まとめ

Public Previewとはいえ、APIの威力を感じさせてくれるサービスです。ネイディブはRESTのAPIですので、PHP, Rubyなど、皆さんの馴染みの環境から呼び出して試してみてください。

 

参考:

Creating a Live Streaming Application with the Media Services SDK for .NET: http://msdn.microsoft.com/en-us/library/dn783465.aspx

Azure Media Services REST API Reference: http://msdn.microsoft.com/en-us/library/hh973617.aspx

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中