Экспорт (0) Печать
Развернуть все

Копирование имеющегося BLOB-объекта в ресурс служб Media Services

Обновлено: Февраль 2014 г.

В этом разделе описано, как копировать большие двоичные объекты из учетной записи хранения в новый ресурс Microsoft Azure Media Services.

Большие двоичные объекты могут существовать в учетной записи хранения, связанной с учетной записью Службы Media Services, или в учетной записи хранения, не связанной с учетной записью Службы Media Services. В этом разделе описывается следующее: Copy blobs from a storage account NOT associated with Media Services account into a Media Services asset. Обратите внимание, что также возможно копирование между центрами обработки данных. Тем не менее, это может потребовать определенных выплат. Дополнительные сведения о ценах см. в разделе Передача данных.

ImportantВажно!
Не стоит пытаться изменить содержимое контейнеров больших двоичных объектов, созданных службами мультимедиа, без помощи интерфейсов API службы мультимедиа.

Предварительные требования

  • Две учетные записи Службы Media Services в новой или существующей подписке Azure. См. раздел Создание учетной записи в службах Media Services.

  • Операционные системы: Windows 7, Windows 2008 R2 или Windows 8.

  • .NET Framework 4.5 или .NET Framework 4.

  • Visual Studio 2012 или Visual Studio 2010 с пакетом обновления 1 (SP1) (Professional, Premium, Ultimate или Express).

Настройка проекта

В этом разделе будет создан и настроен проект консольного приложения на C#.

  1. Воспользуйтесь средой Visual Studio 2012 или Visual Studio 2010 с пакетом обновления 1 (SP1) для создания нового решения, которое содержит проект Консольное приложение на языке C#. В поле Имя введите CopyExistingBlobsIntoAsset и нажмите кнопку ОК.

  2. Воспользуйтесь Nuget, чтобы добавить ссылки на DLL-библиотеки служб Media Services. В главном меню системы Visual Studio выберите пункты СРЕДСТВА - > Диспетчер пакетов библиотеки - > Консоль диспетчера пакетов. В окне консоли введите Install-Package windowsazure.mediaservices и нажмите клавишу ВВОД.

  3. Добавьте ссылки, необходимые для данного проекта: System.Configuration.

  4. Замените операторы using, добавленные в файл Programs.cs по умолчанию, следующими:

    using System;
    using System.Linq;
    using System.Configuration;
    using System.IO;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Collections.Generic;
    using Microsoft.WindowsAzure.Storage;
    using Microsoft.WindowsAzure.MediaServices.Client;
    using Microsoft.WindowsAzure;
    using System.Web;
    using Microsoft.WindowsAzure.Storage.Blob;
    using Microsoft.WindowsAzure.Storage.Auth;
    
  5. Добавьте раздел appSettings в файл .config и обновите значения в соответствии со значениями ключа и имени служб Media Services и хранилища.

    <appSettings>
      <add key="MediaServicesAccountName" value="Media-Services-Account-Name"/>
      <add key="MediaServicesAccountKey" value="Media-Services-Account-Key"/>
      <add key="MediaServicesStorageAccountName" value="Media-Services-Storage-Account-Name"/>
      <add key="MediaServicesStorageAccountKey" value="Media-Services-Storage-Account-Key"/>
      <add key="ExternalStorageAccountName" value="External-Storage-Account-Name"/>
      <add key="ExternalStorageAccountKey" value="External-Storage-Account-Key"/>
    </appSettings>
    

Копирование больших двоичных объектов из учетной записи хранения в ресурс служб мультимедиа

Пример кода, приведенный ниже, выполняет следующие задачи.

  1. Создает экземпляр CloudMediaContext.

  2. Создает экземпляры CloudStorageAccount: _sourceStorageAccount и _destinationStorageAccount.

  3. Передает файлы Smooth Streaming из локального каталога в контейнер больших двоичных объектов, расположенный в _sourceStorageAccount.

  4. Создает новый ресурс. Создаваемый для этого ресурса контейнер больших двоичных объектов расположен в _destinationStorageAccount.

  5. Использует SDK хранилища Windows Azure, чтобы скопировать заданные большие двоичные объекты в сопоставленный с ресурсом контейнер.

  6. Задает ISM-файл в качестве первичного файла.

  7. Создает URL-адрес потока Smooth Streaming для указателя OnDemandOrigin, сопоставленного с ресурсом.

class Program
{
    // Read values from the App.config file. 
    static string _accountName = ConfigurationManager.AppSettings["MediaServicesAccountName"];
    static string _accountKey = ConfigurationManager.AppSettings["MediaServicesAccountKey"];
    static string _storageAccountName = ConfigurationManager.AppSettings["MediaServicesStorageAccountName"];
    static string _storageAccountKey = ConfigurationManager.AppSettings["MediaServicesStorageAccountKey"];
    static string _externalStorageAccountName = ConfigurationManager.AppSettings["ExternalStorageAccountName"];
    static string _externalStorageAccountKey = ConfigurationManager.AppSettings["ExternalStorageAccountKey"];

    private static System.Object consoleWriteLock = new Object();

    private static MediaServicesCredentials _cachedCredentials = null;
    private static CloudMediaContext _context = null;

    private static CloudStorageAccount _sourceStorageAccount = null;
    private static CloudStorageAccount _destinationStorageAccount = null;

    static void Main(string[] args)
    {
        _cachedCredentials = new MediaServicesCredentials(
                        _accountName,
                        _accountKey);
        // Use the cached credentials to create CloudMediaContext.
        _context = new CloudMediaContext(_cachedCredentials);

        // In this example the storage account from which we copy blobs is not 
        // associated with the Media Services account into which we copy blobs.
        // But the same code will work for coping blobs from a storage account that is 
        // associated with the Media Services account.
        //
        // Get a reference to a storage account that is not associated with a Media Services account
        // (an external account).  
        StorageCredentials externalStorageCredentials =
            new StorageCredentials(_externalStorageAccountName, _externalStorageAccountKey);
        _sourceStorageAccount = new CloudStorageAccount(externalStorageCredentials, true);

        //Get a reference to the storage account that is associated with a Media Services account. 
        StorageCredentials mediaServicesStorageCredentials =
            new StorageCredentials(_storageAccountName, _storageAccountKey);
        _destinationStorageAccount = new CloudStorageAccount(mediaServicesStorageCredentials, false);

        // Upload Smooth Streaming files into a storage account.
        string localMediaDir = @"C:\supportFiles\streamingfiles";
        CloudBlobContainer blobContainer =
            UploadContentToStorageAccount(localMediaDir);

        // Create a new asset and copy the smooth streaming files into 
        // the container that is associated with the asset.
        IAsset asset = CreateAssetFromExistingBlobs(blobContainer);

        // Get the streaming URL for the smooth streaming files 
        // that were copied into the asset.   
        string urlForClientStreaming = CreateStreamingLocator(asset);
        Console.WriteLine("Smooth Streaming URL: " + urlForClientStreaming);

        Console.ReadLine();
    }

    /// <summary>
    /// Uploads content from a local directory into the specified storage account.
    /// In this example the storage account is not associated with the Media Services account.
    /// </summary>
    /// <param name="localPath">The path from which to upload the files.</param>
    /// <returns>The container that contains the uploaded files.</returns>
    static public CloudBlobContainer UploadContentToStorageAccount(string localPath)
    {
        CloudBlobClient externalCloudBlobClient = _sourceStorageAccount.CreateCloudBlobClient();
        CloudBlobContainer externalMediaBlobContainer =
            externalCloudBlobClient.GetContainerReference(externalCloudBlobClient.BaseUri + "streamingfiles");

        externalMediaBlobContainer.CreateIfNotExists();

        // Upload files to the blob container.  
        DirectoryInfo uploadDirectory = new DirectoryInfo(localPath);
        foreach (var file in uploadDirectory.EnumerateFiles())
        {
            CloudBlockBlob blob = externalMediaBlobContainer.GetBlockBlobReference(file.Name);

            blob.UploadFromFile(file.FullName, FileMode.Open);
        }

        return externalMediaBlobContainer;
    }

/// <summary>
/// Creates a new asset and copies blobs from the specifed storage account.
/// </summary>
/// <param name="mediaBlobContainer">The specified blob container.</param>
/// <returns>The new asset.</returns>
static public IAsset CreateAssetFromExistingBlobs(CloudBlobContainer mediaBlobContainer)
{
// Create a new asset. 
IAsset asset = _context.Assets.Create("NewAsset_" + Guid.NewGuid(), AssetCreationOptions.None);

IAccessPolicy writePolicy = _context.AccessPolicies.Create("writePolicy",
    TimeSpan.FromMinutes(120), AccessPermissions.Write);
ILocator destinationLocator = _context.Locators.CreateLocator(LocatorType.Sas, asset, writePolicy);

CloudBlobClient destBlobStorage = _destinationStorageAccount.CreateCloudBlobClient();

// Get the asset container URI and Blob copy from mediaContainer to assetContainer. 
string destinationContainerName = (new Uri(destinationLocator.Path)).Segments[1];

CloudBlobContainer assetContainer =
    destBlobStorage.GetContainerReference(destinationContainerName);

if (assetContainer.CreateIfNotExists())
{
    assetContainer.SetPermissions(new BlobContainerPermissions
    {
        PublicAccess = BlobContainerPublicAccessType.Blob
    });
}

var blobList = mediaBlobContainer.ListBlobs();
foreach (var sourceBlob in blobList)
{
    var assetFile = asset.AssetFiles.Create((sourceBlob as ICloudBlob).Name);
    CopyBlob(sourceBlob as ICloudBlob, assetContainer);
}

destinationLocator.Delete();
writePolicy.Delete();

// Since we copied a set of Smooth Streaming files, 
// set the .ism file to be the primary file. 
SetISMFileAsPrimary(asset);

return asset;
}

/// <summary>
/// Copies the specified blob into the specified container.
/// </summary>
/// <param name="sourceBlob">The source container.</param>
/// <param name="destinationContainer">The destination container.</param>
static private void CopyBlob(ICloudBlob sourceBlob, CloudBlobContainer destinationContainer)
{
var signature = sourceBlob.GetSharedAccessSignature(new SharedAccessBlobPolicy
{
    Permissions = SharedAccessBlobPermissions.Read,
    SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10)
});

ICloudBlob destinationBlob = destinationContainer.GetBlockBlobReference(sourceBlob.Name);

if (destinationBlob.Exists())
{
    Console.WriteLine(string.Format("Destination blob '{0}' already exists. Skipping.", destinationBlob.Uri));
}
else
{
    try
    {
        Console.WriteLine(string.Format("Copy blob '{0}' to '{1}'", sourceBlob.Uri, destinationBlob.Uri));
        destinationBlob.StartCopyFromBlob(new Uri(sourceBlob.Uri.AbsoluteUri + signature));
    }
    catch (Exception ex)
    {
        Console.WriteLine(string.Format("Error copying blob '{0}': {1}", sourceBlob.Name, ex.Message));
    }
}
}


    /// <summary>
    /// Creates the OnDemandOrigin locator in order to get the streaming URL.
    /// </summary>
    /// <param name="asset">The asset that contains the smooth streaming files.</param>
    /// <returns>The streaming URL.</returns>
    static public string CreateStreamingLocator(IAsset asset)
    {
        var ismAssetFile = asset.AssetFiles.ToList().
            Where(f => f.Name.EndsWith(".ism", StringComparison.OrdinalIgnoreCase)).First();

        // Create a 30-day readonly access policy. 
        IAccessPolicy policy = _context.AccessPolicies.Create("Streaming policy",
            TimeSpan.FromDays(30),
            AccessPermissions.Read);

        // Create a locator to the streaming content on an origin. 
        ILocator originLocator = _context.Locators.CreateLocator(LocatorType.OnDemandOrigin, asset,
            policy,
            DateTime.UtcNow.AddMinutes(-5));

        return originLocator.Path + ismAssetFile.Name + "/manifest";
    }



    /// <summary>
    /// Sets a file with the .ism extension as a primary file.
    /// </summary>
    /// <param name="asset">The asset that contains the smooth streaming files.</param>
    static private void SetISMFileAsPrimary(IAsset asset)
    {
        var ismAssetFiles = asset.AssetFiles.ToList().
            Where(f => f.Name.EndsWith(".ism", StringComparison.OrdinalIgnoreCase)).ToArray();

        if (ismAssetFiles.Count() != 1)
            throw new ArgumentException("The asset should have only one, .ism file");

        ismAssetFiles.First().IsPrimary = true;
        ismAssetFiles.First().Update();
    }
}


См. также

Основные понятия

Квоты и ограничения


Дата сборки:

2014-06-13

Добавления сообщества

ДОБАВИТЬ
Показ:
© 2014 Microsoft