azure - 在 Windows Azure 媒体服务中上传和编码音频文件

标签 azure azure-storage azure-media-services

在网上,我可以找到一些与上传到 Azure 媒体服务的视频文件相关的说明。

根据教程,我编写了自己的代码。

运行 StoreAudio 方法后,我有:

  • 存储上的新 Blob
  • 媒体服务新 Assets
  • 成功完成媒体服务方面的新工作
  • 创建的 Assets 尚未发布
  • 当我尝试从 ID 或 URI 等 ConvertAsset 属性获取时,出现异常

为什么 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();
    }

最佳答案

添加更多说明:

我建议您创建 SAS 定位器,因为我们目前不支持 WMA 文件的音频流,因此,获取原始流定位器对您不起作用。

Assets “未发布”的原因:您从未发布 Assets - 获取 SAS 定位器或原点定位器是发布 Assets 的方法。

关于azure - 在 Windows Azure 媒体服务中上传和编码音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23389284/

相关文章:

c# - Azure 媒体服务定位器

git - “找不到所选帐户的有效 Azure DevOps 团队项目”Azure Synapse GIT 配置

swift - Realm - 在 Azure 上同步数据的最佳方式

c# - 如何使用 C# Runspace 从本地计算机读取 Azure VM 中存在的远程 yaml 文件

php - 减少在 Azure Web App 上运行的 PHP Wiki 站点的磁盘空间使用量

Azure Pipeline/AZ 复制未复制到存储 blob 中的根目录

azure - 用于访问 Azure 存储的 Com 互操作 DLL

mysql - 使用 SQL Server 迁移助手解析失败

Azure 媒体服务价格计算

rest - 通过 REST 的 Azure 编码作业失败