次の方法で共有


Windows Azure

Windows Azure Media Services を使ってビデオ コンテンツをだれでも利用できるようにする

Bruno Terkaly
Ricardo Villalobos

コード サンプルのダウンロード

今後数年で驚くべき成長を遂げると考えられる決定的な傾向の 1 つが、ビデオ コンテンツのストリーミングです。Cisco Visual Networking Index (VNI) 2011 によると、ビデオ コンテンツのストリーミングに関連するインターネット トラフィックは、2015 年までに 4 倍になるとされています。このような現象の背後には、ストレージ コストの低下、スケーラブルなクラウド コンピューティングとストレージ リソース、高帯域幅ネットワーク、タブレットやスマートフォン デバイスなどの多数のビデオ対応デバイスといった複数の要因があります。ビデオの作成、エンコード、配信はかつてないほど実用的になり、趣味でビデオを扱う個人ユーザーですら手が届くようになっています。

ビデオ コンテンツの配信方法と、著作権法による保護の方法に関して大きな論争が繰り広げられています。私たちの多くは、音楽業界が驚くべき変容を遂げ、その勢力が大手レコード会社からインターネット ベースのメディア会社に移行していく状況を目の当たりにしてきました。現在、大手通信事業者やケーブルテレビ業者は、ビデオ オンデマンドの急成長と、ビデオ配信用のインターネット チャネル (YouTube、Ustream、justin.tv など) の使用に関心を寄せています。

マイクロソフトは、このような状況を何もしないで傍観していたわけではありません。2012 年 5 月、マイクロソフトは Windows Azure の新たな機能として Media Services をリリースしました。この機能は、ビデオの作成、管理、およびユーザーへの配信をだれでも簡単に利用できるようにします。Windows Azure Media Services (以下「Media Services」) は、スマートフォンやタブレットから、ハイエンドのビデオ ワークステーションまで、さまざまな種類のデバイスをサポートします。この機能セット (コードネーム「Nimbus」) により、個人の開発者や企業は、メディア コンテンツの取り込み、処理、管理、および配信を行うクラウド ベースのメディア ソリューションを構築できます。

問題を解決する

Media Services のこれら新しい機能は、以下の 3 つの主要メリットを提供することにより、導入の障壁や複雑さを劇的に軽減する、自動化され標準化されたコスト効率が高いソリューションをメディア管理にもたらします。

  1. ユーザーのニーズに応じたオンデマンド容量の増加など、クラウド コンピューティングのメリットを活かした自動スケーラビリティ。
  2. 開発者がカスタム ワークフローを簡単に作成、管理、および保守できる Microsoft .NET Framework クライアント ライブラリと、RESTful API に基づく豊富なプログラミング可能なインターフェイス。
  3. 前述のワークフローの任意のステップにプラグインできるコンポーネントなど、多数のコンポーネントが複数企業から提供されるパートナー エコシステム。

このように包括的な Media Services により、コンテンツを作成、管理、および配信する企業にとって共通のさまざまな問題に対処するソリューションがもたらされます。こうした問題の 1 つがコストです。ビデオ対応のデータセンターを構築するのは高いコストが必要です。サーバー、エンコーダー、ネットワーク機器、関連ソフトウェアを準備する必要があり、参入するには高い障壁となります。Media Services が解決する 2 つ目の問題は、ワークフローのカスタマイズに関する業界全体の問題です。メディア業界の多くの企業は、独占権を持つビジネス契約を策定しています。そのため、複数のフォーマットやプロトコルを使用することになり、さまざまなベンダー間で関連サービスを連携させることを困難にしています。ビデオの処理方法を標準化すれば、コンテンツの作成や管理に複数の企業が関与しても、連携と生産性が向上します。

オープン標準

Media Services はオープン標準に基づいています。つまり、Java、PHP、Objective-C、jQuery など、ほぼすべてのクライアントから使用できます。この機能スイート全体は、一般的な RESTful API を通じて使用でき、Open Data Protocol (OData) を使用することでクエリ機能に柔軟性がもたらされます。また、RESTful API の上位に構築される .NET C# SDK もあり、この言語を使用する開発者がフレームワークにアクセスするのを容易かつ簡単にします (図 1 参照)。

図 1 Windows Azure Media Services をプログラムから使用する 2 つのアプローチ

REST/OData API

開発者は Representational State Transfer (REST) API 層を通じて Media Services コンポーネントにアクセスできます。REST は HTTP に基づいているため、さまざまな言語、アプリケーション、およびプラットフォームを使用して、事実上どこからでも利用できます。REST API は、Web 上の Media Services 層にアクセスするために、あらゆる状況に対応するパブリックなプログラム インターフェイスです。

REST は、オープン標準に基づくネットワーク接続型のクライアント サーバー アプリケーションを構築するためのアーキテクチャ戦略です。REST では、ネットワーク接続されたコンピューター間で情報を送信するための、ステートレスのキャッシュ可能な標準プロトコル (HTTP) を提供します。

.NET API

当然、.NET クライアント SDK もあります (これは、REST API の呼び出しをラップして、.NET ベースの Media Services クライアント アプリケーションを構築するプロセスを簡素化します)。

今回は、この .NET API に注目します。今後は、REST ベースのアプローチを取り上げる予定です。

Media Services API を利用する

Windows Azure の Media Services 機能のメリットをしっかりと理解するために、ここでは特定のシナリオに注目します。さまざまなモバイル デバイスを持っている家族や友人とホーム ビデオを共有するとします。図 2 に、ビデオ コンテンツをカスタム処理して世界に配信するために必要なワークフロー全体を示します。

Overall Workflow Required to Distribute Video Content
図 2 ビデオ コンテンツの配布に必要なワークフロー全体

前提条件

コンテンツのアップロードとエンコード

まず、ビデオ コンテンツを配信するための基本作業から説明します。図 3 のコードは、ビデオを扱う際に重要な 2 つの目標を実現します。1 つは、オリジナルのコンテンツをアップロードして処理できるようにすること、もう 1 つは、複数のデバイスから利用できるようにコンテンツを実際にエンコードすることです。ビデオには、MPEG、MPEG-2 (QuickTime)、RealMedia、H.264 (MP4) 、Windows Media など、さまざまな形式があります。YouTube にも独自のエンコード形式があります。それぞれのエンコード形式は同じではありません。エンコード形式の多くは、Web でのダウンロードとレンダリングを高速にするため、サイズが小さくなるよう設計されています。ただし、H.264 など、ビデオ サイズを考慮しないで品質を重視するエンコード形式もあります。

図 3 アップロードとエンコーディングの実行ジョブ

static void Main(string[] args)
{
  // Part 1 - Connect to Media Services
  //          Setup upload progress event
  //          Upload a video to encode
  CloudMediaContext mediaContext =
    new CloudMediaContext("[ ACCOUNT NAME ]","[ ACCOUNT KEY ]");
  mediaContext.Assets.OnUploadProgress += Assets_OnUploadProgress;
  var asset = mediaContext.Assets.Create(    
    @"C:\windows\Performance\WinSat\winsat.wmv");
  // Part 2 - Create a task, specify encoding details
  Console.Clear();
  IJob job = mediaContext.Jobs.CreateJob("Sample Job");
  var expressionEncoder = mediaContext.MediaProcessors.Where(
    mp => mp.Name == "Expression Encoder").Single();
  var task = job.Tasks.Add(
    mediaProcessor: expressionEncoder,
    configuration: "H.264 HD 720p VBR");
  task.Inputs.Add(asset);
  task.Outputs.Add("Sample Task Output Asset");
  // Part 3 - Submit the encoding job to begin processing
  while (job.State != JobState.Finished)
  {
    job = mediaContext.Jobs.Refresh(job.Id);
    Console.SetCursorPosition(0, 0);
    Console.WriteLine("Job Name: " + job.Name);
    Console.WriteLine("Job ID: " + job.Id);
    Console.WriteLine();
    Console.WriteLine("Job State: {0,-20}", job.State);
    Console.WriteLine("Task Progress: {0:0.00}%  ",
      job.Tasks.Single().Progress);
    Thread.Sleep(500);
  }
  Console.WriteLine();
  Console.WriteLine("Job Complete!");
  Console.ReadLine();
}
// Part 4 - Display completion progress (See Part 1, where the callback was set up)
static void Assets_OnUploadProgress(object sender, 
  UploadProgressEventArgs e)
{
  Console.WriteLine(e.Progress);
}

図 4 は、パート 1 からパート 4 というセクションに従って、図 3 のコードを説明しています。

図 4 図 3 のソース コードのコメント (パート 1 ~ 4)

パート 1

このコードは、次の 3 つの基本目標を実現します。

   1. CloudMediaContext オブジェクトを作成し、Media Services に対する認証のための資格情報を提供します。このコンテキストは、メディア アセットを管理および処理するために、残りのコードの至るところで使用します。

  2. Assets_OnUploadProgress というコールバック コードをセットアップします。これを使用して、アップロード プロセスの完了率をユーザーに報告します。

  3. オリジナルのビデオ ファイル (winsat.wmv) をアップロードして、処理できるようにします。

注: ここで使用する用語の "アセット" は、オリジナルのビデオを指します。

パート 2 このコードの目標は、メディア プロセッサ、構成、および入出力で構成されるタスクの作成です。エンコードは H.264 HD 720p VBR の構成設定で行います。ここでは、Microsoft Expression Encoder を使用します。メディア業界の新たなパートナーが Media Services の上位に付加価値を追加するときに、メディア プロセッサを追加できるようにします。
パート 3 実際の処理はここから始まります。ジョブは、一連のタスクを含むワークフローになると考えることができます。タスクを連鎖でき、並列実行できます。
パート 4 このコードは、ビデオのアップロード プロセス中に自動的に実行される単なるコールバックです。通常、アップロード プロセスの完了率を報告するために使用します。

コンテンツを管理する

ビデオ ベースのプロジェクトを管理する際の課題の 1 つは、すべてのアセット、ジョブ、およびタスクの経過を追跡することです。コンテンツを生成するときに、オリジナルのファイルが数十個関与し、エンコード後の出力としてさらに数百個のファイルが生成されことがよくあります。その後の処理のために特定のアイテムを追跡して発見できることは、気の遠くなるような操作になる可能性があります。標準インターフェイスを使用してこのプロセスを自動化すれば、状況が一変します。Media Services の管理インターフェイスは、主要関係者のコラボレーションを向上し、長期間にわたるワークフローを効率よく連携できるようにします。CloudMediaContext オブジェクトは、ワークフローに関連付けられたすべての要素を検索するための直感的なインターフェイスを提供し、LINQ などの共通ライブラリを使用してクエリできる、一連のコレクションとして編成されます。

図 5 のコードは、アセット全体をループ処理して、ビデオ ファイルと、他の種類のファイル (画像など) に関する情報を表示する機能を示します。コンテキスト オブジェクトに Assets のコレクションが含まれ、Asset オブジェクトに File オブジェクトのコレクションが含まれます。

図 5 アカウント内で関連付けられるさまざまなアセット

static void Main(string[] args)
{
  // Part 1 - Connect to Media Services
  //          Loop through assets, displaying file information
  CloudMediaContext mediaContext = 
    new CloudMediaContext("[ ACCOUNT NAME ]",
    "[ ACCOUNT KEY ]");
  Console.WriteLine("ASSET INFORMATION");
  foreach (IAsset asset in mediaContext.Assets)
  {
    // Display the collection of assets.
    Console.WriteLine("Asset ID: " + asset.Id);
    Console.WriteLine("Name: " + asset.Name);
    // Display the files associated with each asset.
    foreach (IFileInfo fileItem in asset.Files)
    {
      Console.WriteLine("File Name: " + fileItem.Name);
      Console.WriteLine("File Create Date: " + fileItem.Created);
      Console.WriteLine("File Size: " + fileItem.ContentFileSize);
    }
  }
}

図 6 のコードは、LINQ クエリを実行して、特定のアセットを検索する機能を示します。何千ものファイルを管理することがあるので、このような検索機能が大変役に立ちます。

図 6 名前または ID を使用してアセットを検索する場合に LINQ は驚くほど簡潔

// Returns an asset, given an asset name
static IAsset GetAssetNameFromContext(
  CloudMediaContext mediaContext, string assetName)
{
  IAsset asset = mediaContext.Assets.Where(a => a.Name ==
    assetName).FirstOrDefault();
  if (asset != null)
    return asset;
  else
    return null;
}
// Returns an asset, given an asset Id
static IAsset GetAssetIdFromContext(
  CloudMediaContext mediaContext, string assetId)
{
  IAsset asset = mediaContext.Assets.Where(a => a.Id ==
    assetId).FirstOrDefault();
  if (asset != null)
    return asset;
  else
    return null;
}

アクセス ポリシー

ユーザーが特定のアセットを表示してアクセスできるようにしているのは、Media Services のフレームワークの組み込み機能です。セキュリティ権限を制御するため、コンテンツの所有者がアクセス ポリシーをプログラムで指定できます。このポリシーでは、読み取り/書き込みなどのアクセス許可の詳細と、そのアクセス許可を使用できる期間を指定できます。他のビデオの主要関係者とワークフローを共有するという状況では、これらが強力な機能になります。

ここでは、アクセス ポリシーを指定して基本タスクの実行方法 (アクセス ポリシーの作成とアセットへの資産に割り当てなど) と、作成済みのアクセス ポリシーの一覧について説明します。図 7 のコードの目的は、"読み取り" ポリシーをセットアップして、30 分だけビデオにアクセスできるようにすることです。コードではまず、winsat.wmv をアップロードし、CanReadFor30Minutes という新しいアクセス ポリシーを作成します。このポリシーは、アップロード プロセスの間、30 分以内だけファイルを読み取れることを意味します。次に、アクセス ポリシーをアップロード済みのビデオ ファイルにリンクします。

図 7 ダウンロードのためにいくつかのビデオを一時的に公開する

static void Main(string[] args)
{
  // Part 1 - Specify an asset to upload
  //          Connect to Media Services
  string inputFilePath =
    @"C:\windows\Performance\WinSat\winsat.wmv";
  CloudMediaContext mediaContext =
    new CloudMediaContext("[ ACCOUNT NAME ]", "[ ACCOUNT KEY ]");
  // Part 2 - Upload an asset
  //          Create a policy for the asset
  //          Link access policy to asset
  IAsset asset = mediaContext.Assets.Create(inputFilePath);
  // Because this is a single-file asset, get the name of first file.
  string fileName = asset.Files[0].Name;
  IAccessPolicy readPolicy = mediaContext.AccessPolicies.Create(
    "CanReadFor30Minutes",
    TimeSpan.FromMinutes(30),
    AccessPermissions.Read);
  // Part 3 - Define a locator based on the read policy
  //          and expiration date
  //          Print the path for the locator you created
  //          Get the locator path Uri
  //          Build the full path to the file associated
  //          with the locator.
  ILocator locator = mediaContext.Locators.CreateSasLocator(
    asset, readPolicy);
  Console.WriteLine("Locator path: " + locator.Path);
  var uriBuilder = new UriBuilder(locator.Path);
  uriBuilder.Path += Path.AltDirectorySeparatorChar + fileName;
  Uri fullUrl = uriBuilder.Uri;
  // Part 4 - Print the full path to the file
  Console.WriteLine("Full URL to file: " + fullUrl);
}

ロケーターは、ポリシー ファイルの永続的なコピーの場所を URI で表すものです。このロケーターにより、ポリシーで指定された条件の下でアセットにアクセスできます。今回の場合、30 分の制限時間内だけアセット (アップロード済みのビデオ) にアクセスするために、完全な URL とロケーター ファイルを使用する必要があります。図 7 の fullUrl を参照してください。

処理済みのアセットをダウンロードする

最後に、図 8 のコードで、ビデオ コンテンツをローカル ストレージにダウンロードします。今回の場合は、winsat.mp4 ファイルが H.264 でエンコードされた出力で、winsat.wmv として格納されているオリジナルのビデオから生成されます。この関数は、次のように呼び出すことができます。

DownloadAsset("nb:cid:UUID:a0297fe4-7080-4393-b874-7ddf0f759c40", @"c:\temp");

図 8 Windows Azure Media Services からのアセットのダウンロード

static void DownloadAsset(string assetId, 
    string outputMediaFilesFolder)
{
  // Part 1 - Connect to Media Services
  //          Get an existing asset based on assetId passed in.
  CloudMediaContext mediaContext =
    new CloudMediaContext("[ ACCOUNT NAME ]","[ ACCOUNT KEY ]");
  IAsset asset = mediaContext.Assets.Where(a => a.Id ==
    assetId).SingleOrDefault();
  // Part 2 - If the asset exists, download the first file in the asset
  //          Download to outputMediaFilesFolder      
  if (asset != null)
  {
    Console.WriteLine("Asset name: " + asset.Name);
    IFileInfo theFile = asset.Files.FirstOrDefault();
    // You could iterate through the asset.Files collection with a
    // foreach statement, and download all files for assets that
    // have multiple files.
    // Example: foreach(IFileInfo file in asset.Files)
    // Download the file to the specified local folder.
    if (theFile != null)
      theFile.DownloadToFile(Path.GetFullPath(outputMediaFilesFolder +
        Path.DirectorySeparatorChar + theFile.Name));
    else
      Console.WriteLine("No files available for this asset.");
  }
  else
  {
    Console.WriteLine("Asset not available.");
  }
}

winsat.mp4 の assetId は nb:cid:UUID:a0297fe4-7080-4393-b874-7ddf0f759c40 です。これは、assetId 単位にダウンロード可能なリソースを要求し、ダウンロード先のフォルダーを指定するシンプルな方法です。

クラウド コンピューティングのメリット

Windows Azure の Media Services 機能は、さまざまな形式や解像度を必要とする複数のデバイスや Web チャネルに、ビデオ コンテンツをエンコードして配信するプロセスを簡略化します。コンピューティング リソースやストレージの需要の変化に応じたスケーラビリティなど、クラウド コンピューティングで提供されるメリットを活用することによって、このような簡略化を実現します。これに、豊富な REST ベースの API と .NET クライアント ライブラリを組み合わせて、ワークフローの作成、管理、および保守のプロセスを容易にし、さまざまなパートナー エコシステムで作成されたコンポーネントを使用してワークフローを強化できるようにします。

Media Services は、ビデオ コンテンツの製作、管理、および配信を飛躍的に前進させ、多彩なデジタル アセットを自動化してまとめ、それらを一元管理される場所や分散管理される場所に整理できるようにします。ビデオは今後数年の間に Web 上で驚くべき成長を遂げる勢いがあるため、Media Services は最適なタイミングで提供ました。

今後は、REST API を詳しく説明し、カスタム エンコーダーやハイエンドの機能のサード パーティ サポートをいくつか取り上げる予定です。

Bruno Terkaly は、マイクロソフトの開発者エバンジェリストです。彼の深い知識は、多数のプラットフォーム、言語、フレームワーク、SDK、ライブラリ、および API を使用してコードを記述してきた、この分野での何年にもわたる経験から培われています。普段は、コードの記述やブログ投稿のほか、(特に Windows Azure プラットフォームを使用して) クラウドベースのアプリケーションを作成することに関するライブ プレゼンテーションを行っています。

Ricardo Villalobos は、経験豊かなソフトウェア アーキテクトとして、サプライ チェーン管理業界の企業用アプリケーションを 15 年以上にわたって設計および作成しています。さまざまな技術認定資格の保持者であり、ダラス大学のサプライ チェーン管理の MBA を取得しています。彼はマイクロソフトの Windows Azure アーキテクト エバンジェリストとして活躍しています。

この記事のレビューに協力してくれた技術スタッフの John DeutscherSamuel Ng、および Tim Teebken に心より感謝いたします。