エクスポート (0) 印刷
すべて展開

Media Services SDK for .NET による資産の取り込み

更新日: 2015年2月

このトピックでは、Media Services にコンテンツを取り込む (アップロードする) 方法について説明します。Media Services アプリケーションでは、資産、メディア ファイルなどのコンテンツをシステムにアップロードする作業を "取り込み" といいます。Media Services で最も基本となるコンテンツ オブジェクトは、IAsset という、一連のメディア ファイルに関するメタデータのコレクションです。IAsset にはそれぞれ、1 つまたは複数の IAssetFile オブジェクトが格納されます。Media Services の Asset の詳細については、「資産」を参照してください。

noteメモ
Media Services は、ストリーミング コンテンツの URL (http://{WAMSAccount}.origin.mediaservices.windows.net/{GUID}/{IAssetFile.Name}/streamingParameters など) を作成するときに、IAssetFile.Name プロパティの値を使用します。このため、パーセント エンコードは許可されません。Name プロパティの値は次のいずれのパーセント エンコード予約文字を持つこともできません。!*'();:@&=+$,/?%#[]"。また、ファイル名の拡張子に使用できる '.' は 1 つだけです。

Media Services には、いくつかの方法で資産を取り込むことができます。

  • Asset を作成し、その Asset に関連付ける AssetFiles を作成したうえで、AssetFiles を Microsoft Azure のメディア サービス にアップロードする。対象となるメディア ファイルの数が比較的少なく、特別なアップロード ソリューションが不要であるときは、この方法を使用します。このトピックで紹介する例はすべて、この方法を使用しています。

  • マニフェストを用意して一連のファイルを一括で取り込み、特別なアップロード ソリューションを使用して Microsoft Azure のメディア サービス にアップロードする。この方法の詳細については、「Media Services SDK for .NET による資産の一括取り込み」を参照してください。

Tipヒント
多数の資産をアップロードする際は、次の点に注意してください。

  • CloudMediaContext オブジェクトは、スレッドごとに作成してください。CloudMediaContext クラスはスレッド セーフではありません。

  • NumberOfConcurrentTransfers を既定値の 2 から増やします (5 など)。このプロパティの設定は、CloudMediaContext のすべてのインスタンスに反映されます。

  • ParallelTransferThreadCount は既定値の 10 のままとしてください。

このトピックでは、次に示す基本的なタスクのコード例を紹介しています。

noteメモ
Connect to Media Services Using the Media Services SDK」のトピックで説明されているように、資産を作成するにはまず、Media Services サーバー コンテキストを参照する必要があります。コンテキスト オブジェクトは、次のコード例のように、_context という名前の変数によって表現されます。

Media Services サーバーにファイルをアップロードする前に、Create メソッドまたは CreateAsync メソッドを使用して資産を作成する必要があります。どちらのメソッドも、資産名と暗号化方法をパラメーターとして受け取ります。

暗号化に関しては、資産を作成するときに 3 とおりのオプションを指定できます。

  • AssetCreationOptions.None: 暗号化されません。

  • AssetCreationOptions.CommonEncryptionProtected: Common Encryption (CENC) で保護されたファイル用です。たとえば、既に PlayReady で暗号化されている一連のファイルが該当します。

  • AssetCreationOptions.StorageEncrypted: ストレージ暗号化を行います。平文の入力ファイルは、Azure ストレージへのアップロード前に暗号化されます。

    noteメモ
    Media Services によって提供されるのは、DRM (デジタル著作権管理) のようにネットワーク経路上ではなく、ディスク上のストレージ暗号化のみです。

CreateEmptyAsset メソッドは、空の資産を作成する方法を示しています。

static private IAsset CreateEmptyAsset(string assetName, AssetCreationOptions assetCreationOptions)
{
    var asset = _context.Assets.Create(assetName, assetCreationOptions);

    Console.WriteLine("Asset name: " + asset.Name);
    Console.WriteLine("Time created: " + asset.Created.Date.ToString());

    return asset;
}

このセクションのコードは、次の処理を実行します。

  1. 前の手順で定義した CreateEmptyAsset メソッドを使用して、空の Asset を作成します。

  2. Asset に関連付ける AssetFile インスタンスを作成します。

  3. AssetFile に関連付けられたメディア ファイルを Media Services にアップロードします。

noteメモ
AssetFile インスタンスと実際のメディア ファイルは、2 つの異なるオブジェクトです。AssetFile インスタンスには、メディア ファイルに関するメタデータが格納されるのに対し、メディア ファイルには、実際のメディア コンテンツが格納されます。

static public IAsset CreateAssetAndUploadSingleFile( AssetCreationOptions assetCreationOptions, string singleFilePath)
{   
    var assetName = "UploadSingleFile_" + DateTime.UtcNow.ToString();
    var asset = CreateEmptyAsset(assetName, assetCreationOptions);
    var fileName = Path.GetFileName(singleFilePath);
    var assetFile = asset.AssetFiles.Create(fileName);

    Console.WriteLine("Created assetFile {0}", assetFile.Name);
    Console.WriteLine("Upload {0}", assetFile.Name);

    assetFile.Upload(singleFilePath);
    Console.WriteLine("Done uploading of {0}", assetFile.Name);

    return asset;

}

このセクションのコードは、次の処理を実行します。

  1. 前の手順で定義した CreateEmptyAsset メソッドを使用して、空の資産を作成します。

  2. 資産へのアクセス許可およびアクセス期間を定義する AccessPolicy インスタンスを作成します。

  3. 資産へのアクセスを提供する Locator インスタンスを作成します。

  4. BlobTransferClient のインスタンスを作成します。この型は、Azure BLOB 上で動作するクライアントを表します。この例では、このクライアントを使用して、アップロードの進行状況を監視します。

  5. 指定されたディレクトリ内のファイルを列挙し、各ファイルについて AssetFile インスタンスを作成します。

  6. UploadAsync メソッドを使用して、それらのファイルを Media Services にアップロードします。

    Tipヒント
    非ブロッキング操作としてメソッドを呼び出し、複数のファイルを並列的にアップロードできるようにするため、UploadAsync メソッドを使用します。

static public IAsset CreateAssetAndUploadMultipleFiles(AssetCreationOptions assetCreationOptions, string folderPath)
{
      var assetName = "UploadMultipleFiles_" + DateTime.UtcNow.ToString();
      var asset = CreateEmptyAsset(assetName, assetCreationOptions);
      var accessPolicy = _context.AccessPolicies.Create(assetName, TimeSpan.FromDays(30), AccessPermissions.Write | AccessPermissions.List);
      var locator = _context.Locators.CreateLocator(LocatorType.Sas, asset, accessPolicy);

      var blobTransferClient = new BlobTransferClient();
      blobTransferClient.NumberOfConcurrentTransfers = 20;
      blobTransferClient.ParallelTransferThreadCount = 20;
      blobTransferClient.TransferProgressChanged += blobTransferClient_TransferProgressChanged;

       var filePaths = Directory.EnumerateFiles(folderPath);

       Console.WriteLine("There are {0} files in {1}", filePaths.Count(), folderPath);

       if (!filePaths.Any())
       {
           throw new FileNotFoundException(String.Format("No files in directory, check folderPath: {0}", folderPath));
       }

       var uploadTasks = new List<Task>();
       foreach (var filePath in filePaths)
       {
            var assetFile = asset.AssetFiles.Create(Path.GetFileName(filePath));

            Console.WriteLine("Start uploading of {0}", assetFile.Name);
            uploadTasks.Add(assetFile.UploadAsync(filePath, blobTransferClient, locator, CancellationToken.None));
       }

      Task.WaitAll(uploadTasks.ToArray());
      Console.WriteLine("Done uploading the files");

      blobTransferClient.TransferProgressChanged -= blobTransferClient_TransferProgressChanged;
      locator.Delete();
      accessPolicy.Delete();

      return asset;

}

static void  blobTransferClient_TransferProgressChanged(object sender, BlobTransferProgressChangedEventArgs e)
{
    Console.WriteLine("{0}% upload competed for {1}.", e.ProgressPercentage, e.LocalFile);
}

次のトピックに進んでください。 Media Services SDK for .NET による資産の一括取り込み.

関連項目

表示:
© 2015 Microsoft