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

Media Services SDK for .NET を使用して資産をインジェストする

更新日: 2014年8月

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

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

資産を Media Services にインジェストするためには、次のようにいくつかの方法があります。

  • Asset を作成し、Asset と関連付けられた AssetFiles を作成した後 (1 つまたは複数)、AssetFiles を Microsoft Azure のメディア サービス にアップロードします。この方法は、少数のメディア ファイルのセットを操作していて、別のアップロード ソリューションを使用しないときに使用します。このトピックの例はすべて、この種類です。

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

Tipヒント
大量の資産をアップロードするときは、次の操作を検討します。

  • スレッドごとに新しい CloudMediaContext オブジェクトを作成します。CloudMediaContext クラスはスレッド セーフではありません。

  • NumberOfConcurrentTransfers を、既定値の 2 から 5 などの高い値に増やします。このプロパティを設定すると、CloudMediaContext のすべてのインスタンスに影響があります。

  • ParallelTransferThreadCount を既定値の 10 のままにします。

このトピックのコードに、次の一般的なタスクを実行する方法を示します。

noteメモ
資産を作成するには、「Media Services SDK による Media Services への接続」で説明しているように、Media Services サーバー コンテキストへの参照が必要です。コンテキスト オブジェクトは、次のコード例では、_context という名前の変数で表されています。

ファイルを Media Services サーバーにアップロードできるようにするには、Create メソッドまたは CreateAsync メソッドを使用して資産を作成する必要があります。両方のメソッドでは、資産名と暗号化オプションをパラメーターとして使用します。

資産を作成するときに、資産の暗号化について 3 種類のオプションを指定できます。

  • AssetCreationOptions.None: 暗号化なし。

  • AssetCreationOptions.CommonEncryptionProtected: Common Encryption Protected (CENC) ファイル用。たとえば、既に PlayReady で暗号化されているファイルのセットなどです。

  • AssetCreationOptions.StorageEncrypted: ストレージ暗号化。クリア入力ファイルを Azure ストレージにアップロードする前に暗号化します。

    noteメモ
    Media Services では、Digital Rights Management (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 を使用して資産を一括インジェストする.

関連項目

表示:
© 2014 Microsoft