Cómo generar vistas en miniatura mediante el Codificador multimedia estándar con .NETHow to generate thumbnails using Media Encoder Standard with .NET

Logotipo de Media Servicesmedia services logo


Puede utilizar Media Encoder Standard para generar una o varias vistas en miniatura de la entrada de vídeo en formatos de archivo de imagen JPEG, PNG, o BMP.You can use Media Encoder Standard to generate one or more thumbnails from your input video in JPEG, PNG, or BMP image file formats. Puede enviar tareas que producen solo las imágenes o puede combinar la generación de miniaturas con la codificación.You can submit Tasks that produce only images, or you can combine thumbnail generation with encoding. Este artículo proporciona algunos ejemplos de valores preestablecidos de miniaturas en código XML y JSON para estos escenarios.This article provides a few sample XML and JSON thumbnail presets for such scenarios. Al final del artículo, hay un código de ejemplo que muestra cómo utilizar el SDK de .NET de Media Services para realizar la tarea de codificación.At the end of the article, there is a sample code that shows how to use the Media Services .NET SDK to accomplish the encoding task.

Para más detalles sobre los elementos que se usan en los valores preestablecidos de ejemplo, consulte Esquema de Media Encoder Standard.For more details on the elements that are used in sample presets, you should review Media Encoder Standard schema.

Asegúrese de revisar la sección Consideraciones .Make sure to review the Considerations section.

Ejemplo de un valor preestablecido de archivo PNG únicoExample of a "single PNG file" preset

El siguiente valor preestablecido en código JSON y XML puede usarse para generar un único archivo PNG de salida fuera de los primeros segundos de la entrada de vídeo, donde el codificador realiza un intento de mejor esfuerzo para buscar un fotograma "interesante".The following JSON and XML preset can be used to produce a single output PNG file from the first few seconds of the input video, where the encoder makes a best-effort attempt at finding an “interesting” frame. Tenga en cuenta que las dimensiones de la imagen de salida se han establecido en 100 %, lo que significa que se corresponderán con las dimensiones de la entrada de vídeo.Note that the output image dimensions have been set to 100%, meaning these match the dimensions of the input video. Tenga en cuenta también que es necesaria la configuración de "Format" en "Outputs" para que coincida con el uso de "PngLayers" en la sección "Codecs".Note also how the “Format” setting in "Outputs" is required to match the use of "PngLayers" in the “Codecs” section.

Valor preestablecido JSONJSON preset

    {
      "Version": 1.0,
      "Codecs": [
        {
          "PngLayers": [
            {
              "Type": "PngLayer",
              "Width": "100%",
              "Height": "100%"
            }
          ],
          "Start": "{Best}",
          "Type": "PngImage"
        }
      ],
      "Outputs": [
        {
          "FileName": "{Basename}_{Index}{Extension}",
          "Format": {
            "Type": "PngFormat"
          }
        }
      ]
    }

Valor preestablecido XMLXML preset

    <?xml version="1.0" encoding="utf-16"?>
    <Preset xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" Version="1.0" xmlns="https://www.windowsazure.com/media/encoding/Preset/2014/03">
      <Encoding>
        <PngImage Start="{Best}">
          <PngLayers>
            <PngLayer>
              <Width>100%</Width>
              <Height>100%</Height>
            </PngLayer>
          </PngLayers>
        </PngImage>
      </Encoding>
      <Outputs>
        <Output FileName="{Basename}_{Index}{Extension}">
          <PngFormat />
        </Output>
      </Outputs>
    </Preset>

Ejemplo de un valor preestablecido de una serie de imágenes JPEGExample of a "series of JPEG images" preset

El siguiente valor preestablecido en código JSON y XML puede usarse para generar un conjunto de 10 imágenes en marcas de tiempo de 5%, 15%,..., el 95% de la escala de tiempo de entrada y donde se especifica que el tamaño de la imagen sea un cuarto del tamaño de la entrada de vídeo.The following JSON and XML preset can be used to produce a set of 10 images at timestamps of 5%, 15%, …, 95% of the input timeline, where the image size is specified to be one quarter that of the input video.

Valor preestablecido JSONJSON preset

    {
      "Version": 1.0,
      "Codecs": [
        {
          "JpgLayers": [
            {
              "Quality": 90,
              "Type": "JpgLayer",
              "Width": "25%",
              "Height": "25%"
            }
          ],
          "Start": "5%",
          "Step": "10%",
          "Range": "96%",
          "Type": "JpgImage"
        }
      ],
      "Outputs": [
        {
          "FileName": "{Basename}_{Index}{Extension}",
          "Format": {
            "Type": "JpgFormat"
          }
        }
      ]
    }

Valor preestablecido XMLXML preset

    <?xml version="1.0" encoding="utf-16"?>
    <Preset xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" Version="1.0" xmlns="https://www.windowsazure.com/media/encoding/Preset/2014/03">
      <Encoding>
        <JpgImage Start="5%" Step="10%" Range="96%">
          <JpgLayers>
            <JpgLayer>
              <Width>25%</Width>
              <Height>25%</Height>
              <Quality>90</Quality>
            </JpgLayer>
          </JpgLayers>
        </JpgImage>
      </Encoding>
      <Outputs>
        <Output FileName="{Basename}_{Index}{Extension}">
          <JpgFormat />
        </Output>
      </Outputs>
    </Preset>

Ejemplo de un valor preestablecido de una imagen en una marca de tiempo específicaExample of a "one image at a specific timestamp" preset

El siguiente valor preestablecido en código JSON y XML puede usarse para generar una única imagen JPEG en la marca de 30 segundos de la entrada de vídeo.The following JSON and XML preset can be used to produce a single JPEG image at the 30-second mark of the input video. Este valor preestablecido espera que el vídeo de entrada sea de más de 30 segundos de duración (de lo contrario, el trabajo producirá un error).This preset expects the input video to be more than 30 seconds in duration (else the job fails).

Valor preestablecido JSONJSON preset

    {
      "Version": 1.0,
      "Codecs": [
        {
          "JpgLayers": [
            {
              "Quality": 90,
              "Type": "JpgLayer",
              "Width": "25%",
              "Height": "25%"
            }
          ],
          "Start": "00:00:30",
          "Step": "1",
          "Range": "1",
          "Type": "JpgImage"
        }
      ],
      "Outputs": [
        {
          "FileName": "{Basename}_{Index}{Extension}",
          "Format": {
            "Type": "JpgFormat"
          }
        }
      ]
    }

Valor preestablecido XMLXML preset

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

Ejemplo de un valor preestablecido de miniaturas con distintas resolucionesExample of a "thumbnails at different resolutions" preset

El siguiente valor preestablecido puede utilizarse para generar miniaturas con diferentes resoluciones en una tarea.The following preset can be used to generate thumbnails at different resolutions in one task. En el ejemplo, en las posiciones 5 %, 15 %, …, 95 % de la escala de tiempo de entrada, el codificador genera dos imágenes: una en la posición 100 % de la resolución del vídeo de entrada y otro en la posición 50 %.In the example, at positions 5%, 15%, …, 95% of the input timeline, the encoder generates two images – one at 100% of the input video resolution and the other at 50%.

Tenga en cuenta el uso de macro {Resolution} en el nombre de archivo. Indica al codificador que utilice el ancho y alto que especificó en la sección de codificación del valor preestablecido al generar el nombre de archivo de las imágenes de salida.Note the use of {Resolution} macro in the FileName; it indicates to the encoder to use the width and height that you specified in the Encoding section of the preset while generating the file name of the output images. Esto también ayuda a distinguir fácilmente entre las distintas imágenes.This also helps you distinguish between the different images easily

Valor preestablecido JSONJSON preset

    {
      "Version": 1.0,
      "Codecs": [
        {
          "JpgLayers": [
        {
          "Quality": 90,
          "Type": "JpgLayer",
          "Width": "100%",
          "Height": "100%"
        },
        {
          "Quality": 90,
          "Type": "JpgLayer",
          "Width": "50%",
          "Height": "50%"
        }

          ],
          "Start": "5%",
          "Step": "10%",
          "Range": "96%",
          "Type": "JpgImage"
        }
      ],
      "Outputs": [
        {
          "FileName": "{Basename}_{Resolution}_{Index}{Extension}",
          "Format": {
        "Type": "JpgFormat"
          }
        }
      ]
    }

Valor preestablecido XMLXML preset

    <?xml version="1.0" encoding="utf-8"?>
    <Preset xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" Version="1.0" xmlns="https://www.windowsazure.com/media/encoding/Preset/2014/03">
    <Encoding>
    <JpgImage Start="5%" Step="10%" Range="96%"><JpgImage Start="00:00:01" Step="00:00:15">
      <JpgLayers>
       <JpgLayer>
        <Width>100%</Width>
        <Height>100%</Height>
        <Quality>90</Quality>
       </JpgLayer>
       <JpgLayer>
        <Width>50%</Width>
        <Height>50%</Height>
        <Quality>90</Quality>
       </JpgLayer>
      </JpgLayers>
    </JpgImage>
    </Encoding>
    <Outputs>
      <Output FileName="{Basename}_{Resolution}_{Index}{Extension}">
        <JpgFormat/>
      </Output>
    </Outputs>
    </Preset>

Ejemplo de cómo generar una miniatura durante la codificaciónExample of generating a thumbnail while encoding

Aunque todos los ejemplos anteriores han explicado cómo enviar una tarea de codificación que solo generará imágenes, también puede combinar la codificación de audio y vídeo con generación de miniaturas.While all of the above examples have discussed how you can submit an encoding task that only produces images, you can also combine video/audio encoding with thumbnail generation. El siguiente valor preestablecido JSON y XML indica a Media Encoder Standard que genere una miniatura durante la codificación.The following JSON and XML preset tell Media Encoder Standard to generate a thumbnail during encoding.

Valor preestablecido JSONJSON preset

Para obtener información sobre el esquema, consulte este artículo.For information about schema, see this article.

    {
      "Version": 1.0,
      "Codecs": [
        {
          "KeyFrameInterval": "00:00:02",
          "SceneChangeDetection": "true",
          "H264Layers": [
            {
              "Profile": "Auto",
              "Level": "auto",
              "Bitrate": 4500,
              "MaxBitrate": 4500,
              "BufferWindow": "00:00:05",
              "Width": 1280,
              "Height": 720,
              "ReferenceFrames": 3,
              "EntropyMode": "Cabac",
              "AdaptiveBFrame": true,
              "Type": "H264Layer",
              "FrameRate": "0/1"
    
            }
          ],
          "Type": "H264Video"
        },
        {
          "JpgLayers": [
            {
              "Quality": 90,
              "Type": "JpgLayer",
              "Width": "100%",
              "Height": "100%"
            }
          ],
          "Start": "{Best}",
          "Type": "JpgImage"
        },
        {
          "Channels": 2,
          "SamplingRate": 48000,
          "Bitrate": 128,
          "Type": "AACAudio"
        }
      ],
      "Outputs": [
        {
          "FileName": "{Basename}_{Index}{Extension}",
          "Format": {
            "Type": "JpgFormat"
          }
        },
        {
          "FileName": "{Basename}_{Resolution}_{VideoBitrate}.mp4",
          "Format": {
            "Type": "MP4Format"
          }
        }
      ]
    }

Valor preestablecido XMLXML preset

Para obtener información sobre el esquema, consulte este artículo.For information about schema, see this article.

    <?xml version="1.0" encoding="utf-16"?>
    <Preset xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" Version="1.0" xmlns="https://www.windowsazure.com/media/encoding/Preset/2014/03">
      <Encoding>
        <H264Video>
          <KeyFrameInterval>00:00:02</KeyFrameInterval>
          <SceneChangeDetection>true</SceneChangeDetection>
          <H264Layers>
            <H264Layer>
              <Bitrate>4500</Bitrate>
              <Width>1280</Width>
              <Height>720</Height>
              <FrameRate>0/1</FrameRate>
              <Profile>Auto</Profile>
              <Level>auto</Level>
              <BFrames>3</BFrames>
              <ReferenceFrames>3</ReferenceFrames>
              <Slices>0</Slices>
              <AdaptiveBFrame>true</AdaptiveBFrame>
              <EntropyMode>Cabac</EntropyMode>
              <BufferWindow>00:00:05</BufferWindow>
              <MaxBitrate>4500</MaxBitrate>
            </H264Layer>
          </H264Layers>
        </H264Video>
        <AACAudio>
          <Profile>AACLC</Profile>
          <Channels>2</Channels>
          <SamplingRate>48000</SamplingRate>
          <Bitrate>128</Bitrate>
        </AACAudio>
        <JpgImage Start="{Best}">
          <JpgLayers>
            <JpgLayer>
              <Width>100%</Width>
              <Height>100%/Height>
              <Quality>90</Quality>
            </JpgLayer>
          </JpgLayers>
        </JpgImage>
      </Encoding>
      <Outputs>
        <Output FileName="{Basename}_{Resolution}_{VideoBitrate}.mp4">
          <MP4Format />
        </Output>
        <Output FileName="{Basename}_{Index}{Extension}">
          <JpgFormat />
        </Output>
      </Outputs>
    </Preset>   

Codificación de vídeo y generación de miniaturas con .NETEncode video and generate thumbnail with .NET

En el ejemplo de código siguiente se usa el último SDK para .NET de Media Services para realizar las siguientes tareas:The following code example uses Media Services .NET SDK to perform the following tasks:

  • Crear un trabajo de codificación.Create an encoding job.

  • Obtener una referencia al codificador Codificador multimedia estándar.Get a reference to the Media Encoder Standard encoder.

  • Cargue el valor preestablecido XML o JSON que contiene los valores preestablecidos de codificación, así como la información necesaria para generar vistas en miniatura.Load the preset XML or JSON that contain the encoding preset as well as information needed to generate thumbnails. Puede guardar este XML o JSON en un archivo y usar el siguiente código para cargar el archivo.You can save this XML or JSON in a file and use the following code to load the file.

    // Load the XML (or JSON) from the local file.
    string configuration = File.ReadAllText(fileName);  
    
  • Agregar una única tarea de codificación al trabajo.Add a single encoding task to the job.

  • Especificar el recurso de entrada que se va a codificar.Specify the input asset to be encoded.

  • Crear un recurso de salida que contendrá el recurso codificado.Create an output asset that contains the encoded asset.

  • Agregar un controlador de eventos para comprobar el progreso del trabajo.Add an event handler to check the job progress.

  • Envíe el trabajo.Submit the job.

Consulte el artículo Desarrollo en Media Services con .NET para obtener instrucciones acerca de cómo configurar el entorno de desarrollo.See the Media Services development with .NET article for directions on how to set up your dev environment.

using System;
using System.Configuration;
using System.IO;
using System.Linq;
using Microsoft.WindowsAzure.MediaServices.Client;
using System.Threading;

namespace EncodeAndGenerateThumbnails
{
    class Program
    {
        // Read values from the App.config file.
        private static readonly string _AADTenantDomain =
        ConfigurationManager.AppSettings["AMSAADTenantDomain"];
        private static readonly string _RESTAPIEndpoint =
        ConfigurationManager.AppSettings["AMSRESTAPIEndpoint"];
        private static readonly string _AMSClientId =
        ConfigurationManager.AppSettings["AMSClientId"];
        private static readonly string _AMSClientSecret =
        ConfigurationManager.AppSettings["AMSClientSecret"];

        private static CloudMediaContext _context = null;

        private static readonly string _mediaFiles =
        Path.GetFullPath(@"../..\Media");

        private static readonly string _singleMP4File =
            Path.Combine(_mediaFiles, @"BigBuckBunny.mp4");

        static void Main(string[] args)
        {
            AzureAdTokenCredentials tokenCredentials =
                new AzureAdTokenCredentials(_AADTenantDomain,
                    new AzureAdClientSymmetricKey(_AMSClientId, _AMSClientSecret),
                    AzureEnvironments.AzureCloudEnvironment);

            var tokenProvider = new AzureAdTokenProvider(tokenCredentials);

            _context = new CloudMediaContext(new Uri(_RESTAPIEndpoint), tokenProvider);

            // Get an uploaded asset.
            var asset = _context.Assets.FirstOrDefault();

            // Encode and generate the thumbnails.
            EncodeToAdaptiveBitrateMP4Set(asset);

            Console.ReadLine();
        }

        static public IAsset EncodeToAdaptiveBitrateMP4Set(IAsset asset)
        {
            // Declare a new job.
            IJob job = _context.Jobs.Create("Media Encoder Standard Thumbnail Job");
            // Get a media processor reference, and pass to it the name of the 
            // processor to use for the specific task.
            IMediaProcessor processor = GetLatestMediaProcessorByName("Media Encoder Standard");

            // Load the XML (or JSON) from the local file.
            string configuration = File.ReadAllText("ThumbnailPreset_JSON.json");

            // Create a task
            ITask task = job.Tasks.AddNew("Media Encoder Standard Thumbnail task",
                    processor,
                    configuration,
                    TaskOptions.None);

            // Specify the input asset to be encoded.
            task.InputAssets.Add(asset);
            // Add an output asset to contain the results of the job. 
            // This output is specified as AssetCreationOptions.None, which 
            // means the output asset is not encrypted. 
            task.OutputAssets.AddNew("Output asset",
                    AssetCreationOptions.None);

            job.StateChanged += new EventHandler<JobStateChangedEventArgs>(JobStateChanged);
            job.Submit();
            job.GetExecutionProgressTask(CancellationToken.None).Wait();

            return job.OutputMediaAssets[0];
        }

        private static void JobStateChanged(object sender, JobStateChangedEventArgs e)
        {
            Console.WriteLine("Job state changed event:");
            Console.WriteLine("  Previous state: " + e.PreviousState);
            Console.WriteLine("  Current state: " + e.CurrentState);
            switch (e.CurrentState)
            {
                case JobState.Finished:
                    Console.WriteLine();
                    Console.WriteLine("Job is finished. Please wait while local tasks or downloads complete...");
                    break;
                case JobState.Canceling:
                case JobState.Queued:
                case JobState.Scheduled:
                case JobState.Processing:
                    Console.WriteLine("Please wait...\n");
                    break;
                case JobState.Canceled:
                case JobState.Error:

                    // Cast sender as a job.
                    IJob job = (IJob)sender;

                    // Display or log error details as needed.
                    break;
                default:
                    break;
            }
        }

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

ConsideracionesConsiderations

Se aplican las siguientes consideraciones:The following considerations apply:

  • El uso de marcas de tiempo explícitas para inicio/paso/intervalo asume que el origen de la entrada tiene al menos 1 minuto de duración.The use of explicit timestamps for Start/Step/Range assumes that the input source is at least 1 minute long.

  • Los elementos Jpg/Png/BmpImage tienen atributos de cadena Start, Step y Range, que se pueden interpretar como:Jpg/Png/BmpImage elements have Start, Step, and Range string attributes – these can be interpreted as:

    • Número de marco si son enteros no negativos, por ejemplo, "Start": "120",Frame Number if they are non-negative integers, for example "Start": "120",

    • Relativos a la duración de origen si se expresan como sufijo de %, por ejemplo, "Start": "15%", o bienRelative to source duration if expressed as %-suffixed, for example "Start": "15%", OR

    • Marca de tiempo si seTimestamp if expressed as HH:MM:SS… expresa como formato HH:MM:SS…format. Por ejemplo "Start": "00:01:00"For example "Start" : "00:01:00"

      Puede mezclar y hacer coincidir notaciones a su conveniencia.You can mix and match notations as you please.

      Además, Start también admite una macro especial:{Best}, que intenta determinar el primer marco "interesante" del contenido. NOTA: (Step y Range se omiten cuando Start se establece en {Best}).Additionally, Start also supports a special Macro:{Best}, which attempts to determine the first “interesting” frame of the content NOTE: (Step and Range are ignored when Start is set to {Best})

    • Valores predeterminados: Start:{Best}Defaults: Start:{Best}

  • Es necesario proporcionar explícitamente el formato de salida para cada formato de imagen: Jpg, Png o BmpFormat.Output format needs to be explicitly provided for each Image format: Jpg/Png/BmpFormat. Cuando está presente, MES hará coincidir JpgVideo con JpgFormat y así sucesivamente.When present, MES matches JpgVideo to JpgFormat and so on. OutputFormat presenta una nueva macro específica de códec de imagen: {Index}, que debe estar presente (una vez y sólo una vez) para formatos de salida de imagen.OutputFormat introduces a new image-codec specific Macro: {Index}, which needs to be present (once and only once) for image output formats.

Pasos siguientesNext steps

Puede comprobar el progreso del trabajo mientras el trabajo de codificación está pendiente.You can check the job progress while the encoding job is pending.

Rutas de aprendizaje de Media ServicesMedia Services learning paths

Media Services v3 (más reciente)Media Services v3 (latest)

Eche un vistazo a la versión más reciente de Azure Media Services.Check out the latest version of Azure Media Services!

Media Services v2 (heredado)Media Services v2 (legacy)

Envío de comentariosProvide feedback

Emplee el foro UserVoice para proporcionar comentarios y realizar sugerencias sobre cómo mejorar Azure Media Services.Use the User Voice forum to provide feedback and make suggestions on how to improve Azure Media Services. También puede ir directamente a una de las siguientes categorías:You also can go directly to one of the following categories:

Consulte tambiénSee Also

Información general sobre la codificación de Media ServicesMedia Services Encoding Overview