c# - 在提交作业之前从编码任务中获取 Asset.ID

标签 c# azure azure-media-services

我正在编写代码以使用 Azure 媒体服务对媒体进行批量编码。该过程运行良好,但在此过程中我还需要跟踪 SQL 数据库中的源和输出 Assets ,以便我可以引用原始媒体(存储在 blob 中)和新的输出 Assets ID。

当我摄取 blob 媒体项并对其进行编码时,编码器会为新编码的输出资源分配一个新的 IAsset.ID。然而,在将作业提交给编码器之前,这似乎不会分配给输出 Assets 。

在作业提交给编码器之前,如何获取输出 asset.id? 或者 如何以编程方式安全地获取编码 Assets 的 asset.id? (我知道如何将 Assets 从 Azure 中取出,但我需要绑定(bind)源媒体和输出媒体,因此确保获得正确的输出 Assets 非常重要)

我正在使用 WCF,如果它有什么作用的话。

下面的当前方法

/// <summary>
        /// Encodes the asset from media storge.
        /// </summary>
        /// <param name="encodeTaskListSubmit">The encode task list.</param>
        private List<List<EncodeInputTask>> ListofEncoderTasks;
        public void EncodeAssetFromMediaStorge(List<EncodeInputTask> encodeTaskListSubmit)
        {
            var encodeTaskList = encodeTaskListSubmit;
           //check list contents            
            int i = 0;
            foreach (var encodeTask in encodeTaskList)
            {
                var assetIdCheckAgainstAzureAssets = _context.Assets.Where(x => x.Id == encodeTask.Asset.Id).FirstOrDefault();

                if (assetIdCheckAgainstAzureAssets == null)
                {
                    encodeTaskList.RemoveAt(i);
                }
                i++;
            }

            var h264SmoothStreaming1080P =
                encodeTaskList.Where(
                    x => x.EncodePreset == MediaServices.EncodePresetsForSmoothStreaming.H264SmoothStreaming1080P)
                              .ToList();

            var h264SmoothStreaming720P =
                encodeTaskList.Where(
                    x => x.EncodePreset == MediaServices.EncodePresetsForSmoothStreaming.H264SmoothStreaming720P)
                              .ToList();

            var h264SmoothStreaming720Pfor3Gor4G =
                encodeTaskList.Where(
                    x => x.EncodePreset == MediaServices.EncodePresetsForSmoothStreaming.H264SmoothStreaming720Pfor3Gor4G)
                              .ToList();

            var h264SmoothStreamingSd16X9 =
                encodeTaskList.Where(
                    x => x.EncodePreset == MediaServices.EncodePresetsForSmoothStreaming.H264SmoothStreamingSd16X9)
                              .ToList();

            var h264SmoothStreamingSd4X3 =
                encodeTaskList.Where(
                    x => x.EncodePreset == MediaServices.EncodePresetsForSmoothStreaming.H264SmoothStreamingSd4X3)
                              .ToList();


            //create new encoder job reference
            IJob encoderJobs = _context.Jobs.Create("Job " + DateTime.Now + " " + Guid.NewGuid().ToString());

            var processor = GetLatestMediaProcessorByName("Windows Azure Media Encoder");

            ListofEncoderTasks = new List<List<EncodeInputTask>>
                {
                    h264SmoothStreaming1080P,
                    h264SmoothStreaming720P,
                    h264SmoothStreaming720Pfor3Gor4G,
                    h264SmoothStreamingSd16X9,
                    h264SmoothStreamingSd4X3
                };

            foreach (List<EncodeInputTask> encodeTasks in ListofEncoderTasks)
            {
                foreach (EncodeInputTask encodeTask in encodeTasks)
                {
                    var encodePreset = Global.Common.GetEnumDescription(encodeTask.EncodePreset);

                    ITask task = encoderJobs.Tasks.AddNew("Task " + DateTime.Now + Guid.NewGuid(), processor, encodePreset, TaskOptions.ProtectedConfiguration);

                    task.InputAssets.Add(encodeTask.Asset);

                    string outputAssetName = encodeTask.Asset.Name + " " + encodePreset;

                    task.OutputAssets.AddNew(outputAssetName + " " + encodePreset, AssetCreationOptions.None);

                    encodeTask.Asset.Name = outputAssetName;

                    DatabaseAction.UpdateMediaItemState(encodeTask.Asset.Id, true, MediaServices.InternalAssetState.Encoding);
                }
            }

            DatabaseAction.EncodeJobRegistry(encoderJobs.Name,true,ListofEncoderTasks);

            DatabaseAction.RegisterSourceAssetInEncodedTable(ListofEncoderTasks);

            encoderJobs.Submit();         

        }

最佳答案

编码的资源保留了其来源的链接,这是“父”属性。

我可以使用此方法在新的编码 Assets 与其父 Assets 之间建立链接。

关于c# - 在提交作业之前从编码任务中获取 Asset.ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16257288/

相关文章:

Azure APP Service.+ 私有(private)链接 + Azure 容器注册表

postgresql - 使用 Bicep 更改 Azure PostgreSQL 灵活服务器配置

c# - Azure 媒体服务 AAD token C#

c# - 在 Azure 中存储媒体、视频和图像的推荐方法是什么

c# DataGrid BindingListCollectionView 自定义过滤器抛出聚合函数的无效用法意味着

c# - 将 IOrderedEnumerable<KeyValuePair<string, int>> 转换为 Dictionary<string, int>

azure - 为什么创建 Azure AKS 集群时会自动创建 VM

html - 如何通过隐藏或屏蔽视频流 URL 来保护它?

c# - 如何访问以前添加到委托(delegate)的函数

c# - Stream 意外结束,内容可能已被另一个组件读取。 Microsoft.AspNetCore.WebUtilities.MultipartReaderStream