简体   繁体   English

从资产创建缩略图-Azure Media Services

[英]Create thumbnail from asset - Azure Media Services

Recently we have some problmes with news Media Services created. 最近,我们对新闻媒体服务创建产生了一些疑问。 We have seen that "Azure Media Encoder" is depreciated and now we use "Media Encoder Standard". 我们已经看到“ Azure Media Encoder”已贬值,现在我们使用“ Media Encoder Standard”。 Thus, we can upload videos again, but we can´t create thumbnails. 因此,我们可以再次上传视频,但不能创建缩略图。 Do you can help us? 你能帮我们吗? How we can get a thumbnail from a asset? 我们如何从资产中获取缩略图?

This is error that show in administration page of Azure: 这是在Azure管理页面中显示的错误:

An error has occurred. Stage: ParsePreset. Code: System.InvalidOperationException.`

Microsoft.Cloud.Media.Encoding.PresetException: The XML is invalid or malformed. --->
System.InvalidOperationException: There is an error in XML document (1, 2). --->
System.InvalidOperationException: <Thumbnail xmlns=''> was not expected.">An error has occurred. Stage: ParsePreset. Code: System.InvalidOperationException.

Microsoft.Cloud.Media.Encoding.PresetException: The XML is invalid or malformed. --->
System.InvalidOperationException: There is an error in XML document (1, 2). --->
System.InvalidOperationException: &lt;Thumbnail xmlns=''&gt; was not expected.

Our code: 我们的代码:

    public void CreateThumbnails(string idAssetVideo, int iSegundo, string sPath)
    {
        if (string.IsNullOrEmpty(idAssetVideo)) throw new Excepcion("El idAssetVideo no puede ser nulo. Póngase en contacto con soporte.");

        string sTime = Utilidades.GetDuracionLabelFromSegundos(iSegundo);

        IAsset asset = _context.Assets.Where(a => a.Id == idAssetVideo).SingleOrDefault();
        if (asset == null) throw new Excepcion("No existe ningún Asset con el Id indicado. Póngase en contacto con soporte.");

        // Declare a new job.
        IJob job = _context.Jobs.Create("My Thumbnail job");

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

        //Configuración para generar el Thumbnail
        string configThumbnails = @"<Thumbnail Size='50%,*' Type='Jpeg' Filename='{OriginalFilename}_{Size}_{ThumbnailTime}_{ThumbnailIndex}_{Date}_{Time}.{DefaultExtension}'>
                                            <Time Value='0:0:0' Step='" + sTime + "'/></Thumbnail>";
        //string configThumbnails = "<?xml version='1.0' encoding='UTF-8'?><Thumbnail Size='200,*' Type='Jpeg' JpegQuality='90' Filename='" + sTime + ".jpeg'><Time Value='" + sTime + "'/></Thumbnail>";

        ITask task = job.Tasks.AddNew("My thumbnail task",
            processor,
            configThumbnails,
            TaskOptions.ProtectedConfiguration);

        // Specify the input asset to be encoded.
        task.InputAssets.Add(asset);
        // Add an output asset to contain the results of the job.
        task.OutputAssets.AddNew("Output asset",
            AssetCreationOptions.None);

        // Use the following event handler to check job progress.  
        job.StateChanged += new
                EventHandler<JobStateChangedEventArgs>(UtilsAzure.StateChanged);

        // Launch the job.
        job.Submit();

        // Check job execution and wait for job to finish. 
        Task progressJobTask = job.GetExecutionProgressTask(CancellationToken.None);
        progressJobTask.Wait();

        // If job state is Error, the event handling 
        // method for job progress should log errors.  Here we check 
        // for error state and exit if needed.
        if (job.State == JobState.Error)
        {
            throw new Exception("Exiting method due to job error.");
        }

        List<IAssetFile> lAF = job.OutputMediaAssets[0].AssetFiles.ToList();

        //Valido
        if (lAF == null || !lAF.Any()) throw new Excepcion("El trabajo azure no devolvió resultados");
        if (lAF.Where(x => x.Name.EndsWith(".jpg")).FirstOrDefault() == null) throw new Excepcion("El trabajo azure no contiene ningún archivo con extensión JPG");
        if (!Directory.GetParent(sPath).Exists) throw new Excepcion("No existe la carpeta donde guardar el thumbnail de manera provisional");

        lAF.Where(x => x.Name.EndsWith(".jpg")).FirstOrDefault().Download(sPath);
    }

Looks to me like you are using the old deprecated Preset schema for Thumbnails. 在我看来,您在使用旧的不赞成使用的“预设”架构作为“缩略图”。 Please review the new Presets for Media Encoder Standard features in this article: https://docs.microsoft.com/en-us/azure/media-services/media-services-advanced-encoding-with-mes#a-idthumbnailsagenerate-thumbnails 请查看本文中新的媒体编码器标准预设功能: https : //docs.microsoft.com/zh-cn/azure/media-services/media-services-advanced-encoding-with-mes#a-idthumbnailsagenerate-缩图

Replace your configThumbnails with the newer JSON version of the Thumbnail preset. 用Thumbnail预设的更新JSON版本替换configThumbnails。

Hope that helps! 希望有帮助!

-JD -京东

Thanks! 谢谢! It´s works! 其作品! Really, we need only create one image. 确实,我们只需要创建一个图像。 Thus, we have simplified XML: 因此,我们简化了XML:

<?xml version='1.0' encoding='utf-16'?>
<Preset xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' Version='1.0' xmlns='http://www.windowsazure.com/media/encoding/Preset/2014/03'>
  <Encoding>
    <JpgImage Start='00:01:16' Step='00:00:01' Range='00:00:01'>
      <JpgLayers>
        <JpgLayer>
          <Width>640</Width>
          <Height>360</Height>
          <Quality>90</Quality>
        </JpgLayer>
      </JpgLayers>
    </JpgImage>
  </Encoding>
  <Outputs>
    <Output FileName='{Basename}_{Index}{Extension}'>
      <JpgFormat />
    </Output>
  </Outputs>
</Preset>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM