Come generare anteprime utilizzando Media Encoder Standard con .NETHow to generate thumbnails using Media Encoder Standard with .NET

È possibile usare Media Encoder Standard per generare una o più anteprime dal video di input in un formato file di immagine a scelta tra JPEG, PNG e 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. È possibile inviare attività che producono solo immagini oppure combinare la generazione di anteprime con la codifica.You can submit Tasks that produce only images, or you can combine thumbnail generation with encoding. Questo argomento offre alcuni set di impostazioni di anteprima XML e JSON di esempio per questi scenari.This topic provides a few sample XML and JSON thumbnail presets for such scenarios. Nella sezione finale dell'argomento è disponibile un codice di esempio che illustra come usare Media Services .NET SDK per eseguire l'attività di codifica.At the end of the topic, there is a sample code that shows how to use the Media Services .NET SDK to accomplish the encoding task.

Per altre informazioni sugli elementi usati nei set di impostazioni di esempio, è necessario rivedere l'argomento Schema di Media Encoder Standard.For more details on the elements that are used in sample presets, you should review Media Encoder Standard schema.

Assicurarsi di esaminare la sezione Considerazioni .Make sure to review the Considerations section.

Esempio di set di impostazioni per un singolo file PNGExample of a "single PNG file" preset

È possibile usare il set di impostazioni JSON e XML seguente per produrre un singolo file PNG di output dai primi secondi del video di input, in cui il codificatore tenta in tutti i modi di trovare un frame "interessante".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. Osservare come le dimensioni dell'immagine di output siano state impostate su 100% in modo che corrispondano alle dimensioni del video di input.Note that the output image dimensions have been set to 100%, meaning these will match the dimensions of the input video. Si noti anche che è necessario che l'impostazione "Format" in "Outputs" corrisponda all'uso di "PngLayers" nella sezione "Codec".Note also how the “Format” setting in "Outputs" is required to match the use of "PngLayers" in the “Codecs” section.

Set di impostazioni 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"
      }
    }
  ]
}

Set di impostazioni XMLXML preset

<?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>
    <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>

Esempio di set di impostazioni per una serie di immagini JPEGExample of a "series of JPEG images" preset

Il set di impostazioni JSON e XML consente di produrre un set di 10 immagini in corrispondenza dei timestamp 5%, 15%,..., 95% della sequenza temporale di input e in cui le dimensioni dell'immagine sono impostate su un quarto del video di input.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.

Set di impostazioni 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"
      }
    }
  ]
}

Set di impostazioni XMLXML preset

<?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="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>

Esempio di set di impostazioni per un'immagine in corrispondenza di un timestamp specificoExample of a "one image at a specific timestamp" preset

Il set di impostazioni JSON e XML seguente consente di produrre una singola immagine JPEG ogni 30 secondi di riproduzione del video di input.The following JSON and XML preset can be used to produce a single JPEG image at the 30 second mark of the input video. Questo set di impostazioni prevede che il video di input abbia una durata maggiore di 30 secondi. In caso contrario, il processo non riesce.This preset expects the input video to be more than 30 seconds in duration (else the job will fail).

Set di impostazioni 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"
      }
    }
  ]
}

Set di impostazioni XMLXML preset

<?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: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>

Esempio di set di impostazioni per anteprime con risoluzioni diverseExample of a "thumbnails at different resolutions" preset

È possibile usare il set di impostazioni seguente per generare anteprime con risoluzioni diverse in un'unica attività.The following preset can be used to generate thumbnails at different resolutions in one task. Nell'esempio, in corrispondenza delle posizioni 5%, 15%, …, 95% della sequenza temporale di input, il codificatore genera due immagini, una con risoluzione video di input al 100% e l'altra al 50%.In the example, at positions 5%, 15%, …, 95% of the input timeline, the encoder will generate two images – one at 100% of the input video resolution and the other at 50%.

Si noti l'uso della macro {Resolution} in FileName, che indica al codificatore di usare la larghezza e l'altezza specificate nella sezioneEncoding del set di impostazioni durante la generazione del nome file delle immagini di output.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. In questo modo, è possibile distinguere facilmente tra le diverse immaginiThis also helps you distinguish between the different images easily

Set di impostazioni 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"
      }
    }
  ]
}

Set di impostazioni XMLXML preset

<?xml version="1.0" encoding="utf-8"?>
<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="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>

Esempio di generazione di un'anteprima durante la codificaExample of generating a thumbnail while encoding

Mentre tutti gli esempi precedenti hanno descritto come inviare un'attività di codifica che produce solo immagini, è anche possibile combinare la codifica audio/video con la generazione di anteprime.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. Il set di impostazioni JSON e XML seguenti indica a Media Encoder Standard di generare un'anteprima durante la codifica.The following JSON and XML preset tell Media Encoder Standard to generate a thumbnail during encoding.

Set di impostazioni JSONJSON preset

Per informazioni sullo schema, vedere questo argomento.For information about schema, see this topic.

{
  "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"
      }
    }
  ]
}

Set di impostazioni XMLXML preset

Per informazioni sullo schema, vedere questo argomento.For information about schema, see this topic.

<?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>
    <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>   

Codificare il video e generare l'anteprima con .NETEncode video and generate thumbnail with .NET

Il seguente codice usa l'SDK .NET di Servizi multimediali per eseguire le seguenti attività: The following code example uses Media Services .NET SDK to perform the following tasks:

  • Creare un processo di codifica.Create an encoding job.
  • Ottenere un riferimento al codificatore Media Encoder Standard.Get a reference to the Media Encoder Standard encoder.
  • Caricare il set di impostazioni XML o JSON che contiene la codifica dei set di impostazioni e le informazioni necessarie per generare anteprime.Load the preset XML or JSON that contain the encoding preset as well as information needed to generate thumbnails. È possibile salvare questo XML o JSON in un file e usare il codice seguente per caricare il file.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);  
    
  • Aggiungere una singola attività di codifica al processo.Add a single encoding task to the job.
  • Specificare l’asset di input da codificare.Specify the input asset to be encoded.
  • Creare un asset di output che conterrà l'asset codificato.Create an output asset that will contain the encoded asset.
  • Aggiungere un gestore eventi per controllare l'avanzamento del processo.Add an event handler to check the job progress.
  • Inviare il processo.Submit the job.

Vedere l'argomento Sviluppo di applicazioni di Servizi multimediali con .NET per istruzioni su come configurare l'ambiente di sviluppo.See the Media Services development with .NET topic 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["AADTenantDomain"];
        private static readonly string _RESTAPIEndpoint =
        ConfigurationManager.AppSettings["MediaServiceRESTAPIEndpoint"];

        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)
        {
        var tokenCredentials = new AzureAdTokenCredentials(_AADTenantDomain, 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;
        }
    }

ConsiderazioniConsiderations

Si applicano le considerazioni seguenti:The following considerations apply:

  • L'utilizzo di timestamp espliciti per Inizio/Passaggio/Intervallo presuppone che l'origine dell'input duri almeno 1 minuto.The use of explicit timestamps for Start/Step/Range assumes that the input source is at least 1 minute long.
  • Gli elementi Jpg/Png/BmpImage hanno gli attributi inizio, passaggio e intervallo della stringa, che possono essere interpretati come:Jpg/Png/BmpImage elements have Start, Step and Range string attributes – these can be interpreted as:

    • Se sono numeri interi non negativi, numero di frame, ad esempioFrame Number if they are non-negative integers, eg. "Start": "120","Start": "120",
    • Relativi alla durata di origine se espressi con il suffisso %, ad esempio.Relative to source duration if expressed as %-suffixed, eg. "Start": "15%", OPPURE"Start": "15%", OR
    • Timestamp se espresso come HH:MM:SSTimestamp if expressed as HH:MM:SS… (formato).format. ed esempioEg. "Start" : "00:01:00""Start" : "00:01:00"

      È possibile combinare e associare le notazioni a piacimento.You can mix and match notations as you please.

      Inoltre, Inizio supporta anche una Macro speciale: {Best}, che tenta di determinare il primo fotogramma "interessante" della NOTA contenuto: (Passaggio e Intervallo vengono ignorati quando Inizio è impostato su {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})

    • Impostazioni predefinite: Start: {Best}Defaults: Start:{Best}
  • Il formato di output deve essere specificato in modo esplicito per ogni formato immagine: Jpg/Png/BmpFormat.Output format needs to be explicitly provided for each Image format: Jpg/Png/BmpFormat. Quando è presente, MES collegherà JpgVideo a JpgFormat e così via.When present, MES will match JpgVideo to JpgFormat and so on. OutputFormat presenta una nuova Macro specifica di codec di immagine : {Index}, che deve essere presente (una volta e una sola volta) per i formati immagine.OutputFormat introduces a new image-codec specific Macro: {Index}, which needs to be present (once and only once) for image output formats.

Passaggi successiviNext steps

Mentre è in corso il processo di codifica, è possibile controllarne lo stato di avanzamento.You can check the job progress while the encoding job is pending.

Percorsi di apprendimento di Servizi multimedialiMedia Services learning paths

Altre informazioni sui percorsi di apprendimento di Servizi multimediali di Azure:Read about the Azure Media Services learning paths:

Fornire commenti e suggerimentiProvide feedback

Usare il forum di suggerimenti degli utenti per fornire commenti e suggerimenti su come migliorare Servizi multimediali di Azure.Use the User Voice forum to provide feedback and make suggestions on how to improve Azure Media Services. È anche possibile passare direttamente a una delle categorie seguenti:You also can go directly to one of the following categories:

Vedere ancheSee Also

Panoramica sulla codifica dei servizi multimedialiMedia Services Encoding Overview