0
votes

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". 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:

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);
    }
2

2 Answers

1
votes

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

Replace your configThumbnails with the newer JSON version of the Thumbnail preset.

Hope that helps!

-JD

0
votes

Thanks! It´s works! Really, we need only create one image. Thus, we have simplified 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>