Отправка и кодирование аудиофайла в Windows Azure Media Services

Везде в Интернете я могу найти некоторые объяснения, связанные с видеофайлами, загруженными в службы мультимедиа Azure.

На основе руководств я написал свой собственный код.

После запуска метода StoreAudio у меня есть:

  • Новый BLOB-объект в хранилище
  • Новый актив в медиа-сервисах
  • Новое задание в службах мультимедиа успешно завершено
  • Созданный актив не опубликован
  • Когда я пытаюсь получить из свойств convertAsset, таких как ID или URI, я получаю исключение

Почему ID и URI равны нулю? Почему контент «не опубликован»?

Код:

public string StoreAudio(int ID, byte[] file)
    {
        try
        {
            var blobContainerName = AudioBookContainer; //+ AudioChapterID % 1000?
            var fileName = ID + ".mp3";

            var mediaBlobContainer = blobClient.GetContainerReference(blobContainerName);
            mediaBlobContainer.CreateIfNotExists();

            using (MemoryStream ms = new MemoryStream(file))
            {
                var reference = mediaBlobContainer.GetBlockBlobReference(fileName);
                reference.UploadFromStream(ms);
            }

            IAsset asset = _context.Assets.Create(fileName, AssetCreationOptions.None);
            IAccessPolicy writePolicy = _context.AccessPolicies.Create("writePolicy", TimeSpan.FromMinutes(120), AccessPermissions.Write);
            ILocator destinationLocator = _context.Locators.CreateLocator(LocatorType.Sas, asset, writePolicy);
            Uri uploadUri = new Uri(destinationLocator.Path);
            string assetContainerName = uploadUri.Segments[1];
            CloudBlobContainer assetContainer = blobClient.GetContainerReference(assetContainerName);

            var sourceCloudBlob = mediaBlobContainer.GetBlockBlobReference(fileName);
            sourceCloudBlob.FetchAttributes();
            if (sourceCloudBlob.Properties.Length > 0)
            {
                IAssetFile assetFile = asset.AssetFiles.Create(fileName);
                var destinationBlob = assetContainer.GetBlockBlobReference(fileName);
                destinationBlob.DeleteIfExists();
                destinationBlob.StartCopyFromBlob(sourceCloudBlob);
                destinationBlob.FetchAttributes();
                if (sourceCloudBlob.Properties.Length != destinationBlob.Properties.Length)
                    throw new Exception("Error copying");
            }
            destinationLocator.Delete();
            writePolicy.Delete();

            asset = _context.Assets.Where(a => a.Id == asset.Id).FirstOrDefault();  //At this point, you can create a job using your asset. 
            var encodedAsset = EncodeToWMA(asset);
            return encodedAsset.Id;

            //var ismAssetFiles = encodedAsset.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();

            asset.Delete();

            return encodedAsset.Uri.AbsoluteUri;                
        }
        catch(Exception exx)
        {
            return exx.Message + exx.InnerException;
        }
    }


 private static IMediaProcessor GetLatestMediaProcessorByName(string mediaProcessorName)
    {
        var processor = _context.MediaProcessors.Where(p => p.Name == mediaProcessorName).ToList().OrderBy(p => new Version(p.Version)).LastOrDefault();
        if (processor == null)
            throw new ArgumentException(string.Format("Unknown media processor", mediaProcessorName));
        return processor;
    }

    public static IAsset EncodeToWMA(IAsset asset)
    {
        IJob job = _context.Jobs.Create("Convert MP3 to WMA");
        IMediaProcessor processor = GetLatestMediaProcessorByName("Windows Azure Media Encoder");
        ITask task = job.Tasks.AddNew("My encoding task", processor, "WMA High Quality Audio", TaskOptions.None);
        task.InputAssets.Add(asset);
        task.OutputAssets.AddNew(asset.Name.Replace(".mp3", ".wma"), AssetCreationOptions.None);
        job.Submit();
        Task progressJobTask = job.GetExecutionProgressTask(CancellationToken.None);
        progressJobTask.Wait();
        return task.OutputAssets.First();
    }

person Ziba Leah    schedule 30.04.2014    source источник


Ответы (2)


Добавление дополнительных объяснений:

Я предложил вам создать локатор SAS, потому что мы пока не поддерживаем потоковую передачу звука для файла WMA, поэтому получение локатора потоковой передачи Origin не сработает для вас.

Причина, по которой актив «не публикуется»: вы никогда не публикуете актив - получение локатора SAS или локатора происхождения - это способ опубликовать ваш актив.

person Mingfei Yan    schedule 19.05.2014
comment
Глядя на приведенный выше код, кажется, есть строка, в которой он создает локатор SAS: ILocator destinationLocator = _context.Locators.CreateLocator (LocatorType.Sas, asset, writePolicy) ;. Что следует изменить в этой строке, чтобы создать локатор SAS, как вы описываете? Приношу свои извинения, я новичок в службах мультимедиа. - person user1790300; 13.01.2015

Для аудиофайла вы можете запросить локатор SAS для доступа к файлу - локатор SAS используется для прогрессивной загрузки.

_context.Locators.Create (LocatorType.Sas, outputAsset, AccessPermissions.Read, TimeSpan.FromDays (30));

person Mingfei Yan    schedule 17.05.2014