从Azure Media Services中的现有资产重新创建缩略图

时间:2018-09-20 11:04:51

标签: c# azure-functions azure-media-services

我正在使用Azure媒体服务和Azure功能为网站构建VOD元素。基本上,当上传源视频时,blob触发器从DurableOrchestration开始创建资产,然后对视频进行编码。它还使用默认的{最佳}帧生成3个不同尺寸的缩略图。到目前为止一切顺利。

我现在要做的是允许用户从编码视频中选择一个帧并将其选择为海报缩略图。

我有一个HttpTrigger,它带有资产ID和帧时间戳,并启动了另一个持久功能,该功能应在指定帧处重新创建缩略图。

但是它不起作用。

我最初在新资产中有3张空白图像,当我试图强制将它们放回原始资产中时,我什么也没得到。

这是我用来实现此目的的代码。它与创建原始资产的代码几乎相同。唯一真正的区别是json预设仅具有生成缩略图的指令,该资产中已包含6个编码视频,3个缩略图和相关的元文件,并且我没有将原始源视频文件传递给它(因为我删除了原始编码完成后,作为清理工作的一部分。

        PostData data = inputs.GetInput<PostData>();

        IJob job = null;
        ITask taskEncoding = null;
        IAsset outputEncoding = null;
        int OutputMES = -1;
        int taskindex = 0;
        bool useEncoderOutputForAnalytics = false;
        MediaServicesCredentials amsCredentials = new MediaServicesCredentials();
        try
        {
            AzureAdTokenCredentials tokenCredentials = new AzureAdTokenCredentials(amsCredentials.AmsAadTenantDomain,
                                                    new AzureAdClientSymmetricKey(amsCredentials.AmsClientId, amsCredentials.AmsClientSecret),
                                                    AzureEnvironments.AzureCloudEnvironment);

            AzureAdTokenProvider tokenProvider = new AzureAdTokenProvider(tokenCredentials);

            _context = new CloudMediaContext(amsCredentials.AmsRestApiEndpoint, tokenProvider);
            IAsset asset = _context.Assets.Where(a => a.Id == data.assetId).FirstOrDefault();

            // Declare a new encoding job with the Standard encoder
            int priority = 10;
            job = _context.Jobs.Create("CMS encoding job", priority);

            foreach (var af in asset.AssetFiles)
            {
                if (af.Name.Contains(".mp4)"))
                    af.IsPrimary = true;
                else
                    af.IsPrimary = false;
            }

            // Get a media processor reference, and pass to it the name of the 
            // processor to use for the specific task.
            IMediaProcessor processorMES = MediaServicesHelper.GetLatestMediaProcessorByName(_context, "Media Encoder Standard");

            string preset = null;

            preset = "MesThumbnails.json";  // the default preset

            string start = data.frame;

            if (preset.ToUpper().EndsWith(".JSON"))
            {
                // Build the folder path to the preset
                string presetPath = Path.Combine(System.IO.Directory.GetParent(data.execContext.FunctionDirectory).FullName, "presets", preset);
                log.Info("presetPath= " + presetPath);
                preset = File.ReadAllText(presetPath).Replace("{Best}", start);
            }

            taskEncoding = job.Tasks.AddNew("rebuild thumbnails task",
               processorMES,
               preset,
               TaskOptions.None);

            // Specify the input asset to be encoded.
            taskEncoding.InputAssets.Add(asset);
            OutputMES = taskindex++;

            string _storageAccountName = amsCredentials.StorageAccountName;
            outputEncoding = taskEncoding.OutputAssets.AddNew(asset.Name + " MES encoded", _storageAccountName, AssetCreationOptions.None);

            asset = useEncoderOutputForAnalytics ? outputEncoding : asset;

            job.Submit();
            await job.GetExecutionProgressTask(CancellationToken.None);

我的问题是我实际上想做的事是否可行,如果可以,我采用的方法有什么问题。

我在这个主题上进行了很多搜索,但是始终只能在编码视频时找到生成缩略图的参考,而在事件发生后再也不会从编码的视频生成缩略图。

1 个答案:

答案 0 :(得分:0)

  
    

我没有将原始源视频文件传递给它     这可能就是您遇到问题的原因。如您所见,自适应流作业的输出包含多个文件。还需要一些其他标志来告知缩略图生成作业仅关注一个文件(通常是最高比特率的文件)。下面的预设应该可以解决问题。

  
  1. 请注意预设如何以“视频流”部分开头,告诉编码器选择视频和音频的最高/最高比特率
  2. 请注意,“步进”设置为2,但范围是1,确保在输出中仅生成一幅图像

    {   “版本”:1.0,   “来源”:[     {       “信息流”:[         {           “ Type”:“ AudioStream”,           “值”:“ TopBitrate”         },         {           “ Type”:“ VideoStream”,           “值”:“ TopBitrate”         }       ]     }   ],   “编解码器”:[     {       “开始”:“ 00:00:03:00”,       “第2步”,       “范围”:“ 1”,       “ Type”:“ JpgImage”,       “ JpgLayers”:[         {           “质量”:90,           “ Type”:“ JpgLayer”,           “宽度”:“ 100%”,           “高度”:“ 100%”         }       ]     }   ],   “输出”:[     {       “ FileName”:“ {Basename} _ {Index} {Extension}”,       “格式”:{         “类型”:“ JpgFormat”       }     }   ] }