내보내기(0) 인쇄
모두 확장

Media Services SDK for .NET을 사용하여 자산 수집

업데이트 날짜: 2015년 2월

이 항목에서는 미디어 서비스로 콘텐츠를 수집(업로드)하는 방법을 보여 줍니다. 미디어 서비스 응용 프로그램에서 수집 작업은 시스템 콘텐츠(자산, 미디어 파일 등)를 업로드하는 프로세스입니다. 미디어 서비스에서 가장 기본적인 콘텐츠 개체는 IAsset으로, 미디어 파일 집합에 대한 메타데이터 컬렉션입니다. 각 IAsset에는 하나 이상의 IAssetFile 개체가 포함되어 있습니다. 미디어 서비스의 Asset이 무엇인지에 대한 자세한 설명은 자산을 참조하세요.

note참고
미디어 서비스에서는 스트리밍 콘텐츠의 URL 작성 시 IAssetFile.Name 속성의 값을 사용합니다(예: http://{WAMSAccount}.origin.mediaservices.windows.net/{GUID}/{IAssetFile.Name}/streamingParameters). 따라서 퍼센트 인코딩이 허용되지 않습니다. 이름 속성의 값에는 퍼센트 인코딩 예약 문자( !*'();:@ !*'();:@&=+$,/?%#[]")를 사용할 수 없으며, 파일 이름 확장명에 ‘.’를 하나만 사용할 수 있습니다.

미디어 서비스에 자산을 수집하는 방법은 여러 가지가 있습니다.

  • Asset을 만들고 Asset과 연결된 하나 이상의 AssetFiles를 만든 다음 AssetFiles를 Microsoft Azure 미디어 서비스에 업로드합니다. 별도의 업로드 솔루션을 사용할 때가 아니라 더 작은 미디어 파일 집합을 사용할 때 이 방법을 사용합니다. 이 항목의 모든 예제는 이 유형입니다.

  • 매니페스트를 준비하여 파일 집합을 대량 수집하고 별도의 업로드 솔루션을 사용하여 Microsoft Azure 미디어 서비스에 업로드합니다. 이 방법에 대한 자세한 내용은 Media Services SDK for .NET을 사용하여 자산 대량 수집을 참조하세요.

Tip
많은 자산을 업로드할 때는 다음 사항을 고려합니다.

  • 스레드당 새 CloudMediaContext 개체를 만듭니다. CloudMediaContext 클래스는 스레드로부터 안전하지 않습니다.

  • 기본값 2에서 5와 같이 더 높은 값으로 NumberOfConcurrentTransfers를 늘립니다. 이 속성 설정은 CloudMediaContext의 모든 인스턴스에 영향을 줍니다.

  • ParallelTransferThreadCount를 기본값 10으로 유지합니다.

이 항목의 코드에서는 다음과 같은 일반 작업을 수행하는 방법을 보여 줍니다.

note참고
자산을 만들려면 Connect to Media Services Using the Media Services SDK 항목의 설명대로 미디어 서비스 서버 컨텍스트에 대한 참조가 있어야 합니다. 컨텍스트 개체는 다음 코드 예제에서 _context라는 변수로 나타냅니다.

파일을 미디어 서비스 서버에 업로드하려면 먼저 Create 또는 CreateAsync 메서드를 사용하여 자산을 만들어야 합니다. 두 메서드 모두 자산 이름과 암호화 옵션을 매개 변수로 사용합니다.

자산을 만들 때 암호화에 세 가지 다른 옵션을 지정할 수 있습니다.

  • AssetCreationOptions.None: 암호화 없음

  • AssetCreationOptions.CommonEncryptionProtected: CENC(Common Encryption Protected) 파일의 경우. 예를 들면 PlayReady로 이미 암호화된 파일 집합이 있습니다.

  • AssetCreationOptions.StorageEncrypted: 저장소 암호화. 명확한 입력 파일을 Azure 저장소에 업로드하기 전에 암호화합니다.

    note참고
    미디어 서비스는 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과 연결된 미디어 파일을 미디어 서비스에 업로드합니다.

note참고
AssetFile 인스턴스와 실제 미디어 파일은 두 개의 다른 개체입니다. 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 메서드를 사용하여 파일을 미디어 서비스에 업로드합니다.

    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