Esporta (0) Stampa
Espandi tutto

Inserimento di asset con l'SDK di Servizi multimediali per .NET

Aggiornamento: febbraio 2015

In questo argomento viene illustrato come inserire (caricare) contenuto in Servizi multimediali. In un'applicazione di Servizi multimediali il processo di inserimento di attività consiste nel caricamento di contenuto, ad esempio asset, file multimediali e così via, nel sistema. L'oggetto contenuto più̀ importante in Servizi multimediali è IAsset, ovvero una raccolta di metadati relativi a un set di file multimediali. Ogni raccolta IAsset include uno o più oggetti IAssetFile. Per una spiegazione più dettagliata del ruolo di un'entità Asset in Servizi multimediali, vedere Asset.

noteNota
Servizi multimediali usa il valore della proprietà IAssetFile.Name durante la creazione di URL per i contenuti in streaming, ad esempio http://{AccountWAMS}.origin.mediaservices.windows.net/{GUID}/{IAssetFile.Name}/streamingParameters. Per questo motivo, la codifica percentuale non è consentita. Il valore della proprietà Name non può contenere alcuno dei seguenti caratteri riservati per la codifica percentuale: !*'();:@&=+$,/?%#[]". L'estensione del nome di file, inoltre, può essere preceduta da un solo '.' (punto).

Sono previsti diversi approcci per l'inserimento di asset in Servizi multimediali:

  • Creare un'entità Asset, creare una o più entità AssetFiles associate all'Asset, quindi caricare AssetFiles in Servizi multimediali di Microsoft Azure. Questo approccio è consigliato quando si usano set di file multimediali di dimensioni ridotte e quando non si adotta una soluzione di caricamento separata. Tutti gli esempi illustrati in questo argomento sono di questo tipo.

  • Eseguire l'inserimento in blocco di un set di file preparando un manifesto e caricarli in Servizi multimediali di Microsoft Azure usando una soluzione di caricamento separata. Per altre informazioni su questo approccio, vedere la sezione Inserimento di asset in blocco con l'SDK di Servizi multimediali per .NET.

TipSuggerimento
Quando si carica un numero elevato di asset, prendere in considerazione quanto segue.

  • Creare un nuovo oggetto CloudMediaContext per thread. La classe CloudMediaContextt non è di tipo thread-safe.

  • Aumentare il valore di NumberOfConcurrentTransfers sostituendo il valore 2 predefinito con uno maggiore, ad esempio 5. L'impostazione di questa proprietà ha effetto su tutte le istanze di CloudMediaContext.

  • Mantenere l'impostazione predefinita di ParallelTransferThreadCount su 10.

Nel codice contenuto in questo argomento viene illustrato come effettuare le seguenti attività comuni:

noteNota
Per creare qualsiasi asset, è necessario prima disporre di un riferimento al contesto del server di Servizi multimediali, come descritto nell'argomento Connect to Media Services Using the Media Services SDK. L'oggetto contesto è rappresentato dalla variabile con nome _context negli esempi di codice seguenti.

Per poter caricare un file nel server Servizi multimediali, è necessario innanzitutto creare un asset usando il metodo Create o CreateAsync. Entrambi questi metodi usano il nome dell'asset e l'opzione di crittografia come parametri.

Quando si creano asset, è possibile specificare tre diverse opzioni per la crittografia:

  • AssetCreationOptions.None: non applica alcuna crittografia.

  • AssetCreationOptions.CommonEncryptionProtected: consente di creare file CENC (Common Encryption Protected). Un esempio è un set di file già crittografati con PlayReady.

  • AssetCreationOptions.StorageEncrypted: applica la crittografia di archiviazione. Crittografa un file di input non crittografato prima che venga caricato nei servizi di archiviazione di Azure.

    noteNota
    Si noti che Servizi multimediali offre una crittografia di archiviazione su disco, non in rete come Digital Rights Management (DRM).

Viene illustrato come creare un asset vuoto con il metodo 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;
}

Il codice contenuto in questa sezione effettua le operazioni seguenti:

  1. Crea un'entità Asset vuota usando il metodo CreateEmptyAsset definito nel passaggio precedente.

  2. Crea un'istanza di AssetFile associata all'entità Asset.

  3. Carica il file multimediale associato all'istanza di AssetFile in Servizi multimediali.

noteNota
L'istanza di AssetFile e l'effettivo file multimediale sono due oggetti distinti. L'istanza di AssetFile contiene metadati relativi al file multimediale, mentre quest'ultimo contiene l'effettivo contenuto multimediale.

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;

}

Il codice contenuto in questa sezione effettua le operazioni seguenti:

  1. Crea un'entità Asset vuota usando il metodo CreateEmptyAsset definito nel passaggio precedente.

  2. Crea un'istanza di AccessPolicy che definisce le autorizzazioni e la durata dell'accesso all'asset.

  3. Crea un'istanza di Locator che consente l'accesso all'asset.

  4. Crea un'istanza di BlobTransferClient. Questo tipo rappresenta un client che agisce sugli oggetti BLOB di Azure. In questo esempio viene usato il client per monitorare lo stato del caricamento.

  5. Vengono enumerati i file della directory specificata e viene creata un'istanza di AssetFile per ogni file.

  6. Vengono caricati i file in Servizi multimediali usando il metodo UploadAsync.

    TipSuggerimento
    Usare il metodo UploadAsync in modo che non si verifichino blocchi delle chiamate e i file vengano caricati in parallelo.

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);
}

A questo punto è possibile passare all'argomento successivo: Inserimento di asset in blocco con l'SDK di Servizi multimediali per .NET.

Vedere anche

Mostra:
© 2015 Microsoft