将文件从以前删除的Azure媒体服务传输到新媒体服务-有可能吗?

时间:2019-01-22 05:30:18

标签: azure azure-media-services

是否可以将文件从已accidentally删除的旧媒体服务帐户传输到新媒体服务帐户。

Microsoft技术支持没有帮助。 我可以将files复制到新的媒体服务帐户,但是当我测试是否可以在门户中发布资产之一时,它可以成功地进行流urls的流式传输,但是当我尝试访问这些文件时,出现网络错误

<serverError>
  <status>404</status>
  <subStatus>1000</subStatus>
  <hresult>MPE_STORAGE_RESOURCE_NOT_FOUND</hresult>
  <activityId>80028340-0004-F800-B63F-84710C7967BB</activityId>
  <serviceId>4A42CB8E-4542-0C18-2C0D-4B460D96B604</serviceId>
</serverError>

我认为它找不到清单文件。名为pc124m190o_AdaptiveStreaming_manifest.xml

元数据文件的名称也可能是潜在的问题

5f7e8f45-87e9-49ce-a2ae-7bb673bf0b0f_metadata.xml

有人成功做到了吗?

这是我用来复制文件的代码。也许错误在这里?

   class Program
{
    // Read values from the App.config file.
    private static readonly string _sourceStorageAccountName =
        ConfigurationManager.AppSettings["SourceStorageAccountName"];
    private static readonly string _sourceStorageAccountKey =
        ConfigurationManager.AppSettings["SourceStorageAccountKey"];
    private static readonly string _NameOfBlobContainerYouWantToCopy =
        ConfigurationManager.AppSettings["NameOfBlobContainerYouWantToCopy"];

    private static readonly string _AMSAADTenantDomain =
        ConfigurationManager.AppSettings["AMSAADTenantDomain"];
    private static readonly string _AMSRESTAPIEndpoint =
        ConfigurationManager.AppSettings["AMSRESTAPIEndpoint"];
    private static readonly string _AMSClientId =
        ConfigurationManager.AppSettings["AMSClientId"];
    private static readonly string _AMSClientSecret =
        ConfigurationManager.AppSettings["AMSClientSecret"];
    private static readonly string _AMSStorageAccountName =
        ConfigurationManager.AppSettings["AMSStorageAccountName"];
    private static readonly string _AMSStorageAccountKey =
        ConfigurationManager.AppSettings["AMSStorageAccountKey"];

    // Field for service context.
    private static CloudMediaContext _context = null;
    private static CloudStorageAccount _sourceStorageAccount = null;
    private static CloudStorageAccount _destinationStorageAccount = null;



    static void Main(string[] args)
    {
          AzureAdTokenCredentials tokenCredentials = new AzureAdTokenCredentials(_AMSAADTenantDomain,
             new AzureAdClientSymmetricKey(_AMSClientId, _AMSClientSecret),
             AzureEnvironments.AzureCloudEnvironment);

          var tokenProvider = new AzureAdTokenProvider(tokenCredentials);

          // Create the context for your source Media Services account.
          _context = new CloudMediaContext(new Uri(_AMSRESTAPIEndpoint), tokenProvider);

          _sourceStorageAccount =
              new CloudStorageAccount(new StorageCredentials(_sourceStorageAccountName,
                  _sourceStorageAccountKey), true);

          _destinationStorageAccount =
              new CloudStorageAccount(new StorageCredentials(_AMSStorageAccountName,
                  _AMSStorageAccountKey), true);

          CloudBlobClient sourceCloudBlobClient =
              _sourceStorageAccount.CreateCloudBlobClient();


         // CreateAssetFromExistingBlobs(sourceContainer);



        List<string> containers=GetAllContainerNames(sourceCloudBlobClient);

        foreach(string item in containers)
        {
            CloudBlobContainer sourceContainer =
             sourceCloudBlobClient.GetContainerReference(item);
            CreateAssetFromExistingBlobs(sourceContainer);
            Console.WriteLine("finished " + item);
        }


    }



static private IAsset CreateAssetFromExistingBlobs(CloudBlobContainer sourceBlobContainer)
    {
        CloudBlobClient destBlobStorage = _destinationStorageAccount.CreateCloudBlobClient();

        // Create a new asset. 
        IAsset asset = _context.Assets.Create("NewAsset_" + Guid.NewGuid(), AssetCreationOptions.None);

        IAccessPolicy writePolicy = _context.AccessPolicies.Create("writePolicy",
            TimeSpan.FromHours(24), AccessPermissions.Write);

        ILocator destinationLocator =
            _context.Locators.CreateLocator(LocatorType.Sas, asset, writePolicy);

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

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

        var blobList = sourceBlobContainer.ListBlobs();

        foreach (CloudBlockBlob sourceBlob in blobList)
        {
            var assetFile = asset.AssetFiles.Create((sourceBlob as ICloudBlob).Name);

            ICloudBlob destinationBlob = destAssetContainer.GetBlockBlobReference(assetFile.Name);

            CopyBlob(sourceBlob, destAssetContainer);

            sourceBlob.FetchAttributes();
            assetFile.ContentFileSize = (sourceBlob as ICloudBlob).Properties.Length;
            assetFile.Update();
            Console.WriteLine("File {0} is of {1} size", assetFile.Name, assetFile.ContentFileSize);
        }

        asset.Update();

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

        // Set the primary asset file.
        // If, for example, we copied a set of Smooth Streaming files, 
        // set the .ism file to be the primary file. 
        // If we, for example, copied an .mp4, then the mp4 would be the primary file. 
        var ismAssetFile = asset.AssetFiles.ToList().
            Where(f => f.Name.EndsWith(".ism", StringComparison.OrdinalIgnoreCase)).ToArray().FirstOrDefault();

        // The following code assigns the first .ism file as the primary file in the asset.
        // An asset should have one .ism file.  
        if (ismAssetFile != null)
        {
            ismAssetFile.IsPrimary = true;
            ismAssetFile.Update();
        }

        return asset;
    }

这是我的媒体存储窗口的外观 enter image description here

1 个答案:

答案 0 :(得分:0)

您提到的清单文件在技术上不是流式传输所必需的。缺少的是,当您将文件复制到新的Storage帐户时,新的Media Services帐户对它们一无所知。您必须创建新资产,然后将文件复制到新资产中,以便Media Services看到它们。我建议使用存储帐户中新帐户中的Azure Media Services Explorer进行导入。