Esercitazioni avanzate del flusso di lavoro Premium del codificatore multimedialeAdvanced Media Encoder Premium Workflow tutorials

PanoramicaOverview

Questo documento contiene procedure dettagliate che illustrano come personalizzare i flussi di lavoro con Progettazione flussi di lavoro.This document contains walkthroughs that show how to customize workflows with Workflow Designer. I file dei flussi di lavoro effettivi sono disponibili qui.You can find the actual workflow files here.

SommarioTOC

Vengono trattati gli argomenti seguenti:The following topics are covered:

Codifica di un file MXF in un MP4 a velocità in bit singolaEncoding MXF into a single bitrate MP4

In questa sezione viene descritto come creare un file MP4 a velocità in bit singola con audio con codifica AAC-HE da un file di input MXF.This section demonstrates how to create a single bitrate .MP4 file with AAC-HE encoded audio from an .MXF input file.

Avvio di un nuovo flusso di lavoroStarting a new workflow

Aprire Progettazione flussi di lavoro e selezionare File > Nuova area di lavoro > Transcode BlueprintOpen Workflow Designer and select File > New Workspace > Transcode Blueprint

Il nuovo flusso di lavoro visualizzerà 3 elementi:The new workflow shows three elements:

  • Primary Source FilePrimary Source File
  • Clip List XMLClip List XML
  • Output File/AssetOutput File/Asset

Nuovo flusso di lavoro della codifica

Nuovo flusso di lavoro della codificaNew Encoding Workflow

Uso di Media File InputUsing the Media File Input

Per accettare il file multimediale di input, si inizia aggiungendo un componente Media File Input.In order to accept the input media file, one starts with adding a Media File Input component. Per aggiungere un componente al flusso di lavoro, cercarlo nella casella di ricerca del repository e trascinare la voce desiderata sul riquadro della finestra di progettazione.To add a component to the workflow, look for it in the Repository search box and drag the desired entry onto the designer pane. Ripetere l'operazione per Media File Input e connettere il componente Primary Source File al pin di input Filename da Media File Input.Repeat the action for the Media File Input and connect the Primary Source File component to the Filename input pin from the Media File Input.

Media File Input connesso

Media File Input connessoConnected Media File Input

Inizialmente, identificare un file di esempio appropriato da usare quando si progetta un flusso di lavoro personalizzato.Initially, identify an appropriate sample file to use when designing a custom workflow. A questo scopo, fare clic sullo sfondo del riquadro della finestra di progettazione e cercare la proprietà Primary Source File nel riquadro delle proprietà sulla destra.To do so, click the designer pane background and look for the Primary Source File property on the right-hand property pane. Fare clic sull'icona della cartella e selezionare il file desiderato per testare il flusso di lavoro.Click the folder icon and select the desired file for testing the workflow. Il componente Media File Input esaminerà il file e popolerà i pin di output in base ai dettagli del file di esempio esaminato.The Media File Input component inspects the file and populates its output pins to reflect the details of the sample file it inspected.

Media File Input popolato

Media File Input popolatoPopulated Media File Input

A questo punto l'input è popolato. Il passaggio successivo prevede la configurazione delle impostazioni di codifica di output.Now that the input is populated, the next step is to set up output encoding settings. Come è stato configurato Primary Source File, configurare ora la proprietà Output Folder Variable, appena sotto.Similar to how the Primary Source File was configured, now configure the Output Folder Variable property, just below it.

Proprietà di input e output configurate

Proprietà di input e output configurateConfigured Input and Output properties

Analisi di flussi multimedialiInspecting media streams

Spesso si vuole sapere come appare il flusso che scorre nel flusso di lavoro.Often it's desired to know how the stream looks like as it flows through the workflow. Per esaminare un flusso in qualsiasi punto del flusso di lavoro, è sufficiente fare clic su un pin di output o di input in uno dei componenti.To inspect a stream at any point in the workflow, just click an output or input pin on any of the components. In questo caso, provare a fare clic sul pin di output Uncompressed Video da Media File Input.In this case, try clicking on the Uncompressed Video output pin from the Media File Input. Verrà aperta una finestra di dialogo che consente di esaminare il video in uscita.A dialog opens up that allows to inspect the outbound video.

Analisi del pin di output Uncompressed Video

Analisi del pin di output Uncompressed VideoInspecting the Uncompressed Video output pin

In questo caso, è indicato che il video contiene un input 1920x1080 a 24 fotogrammi al secondo nel campionamento 4:2:2 per un video di almeno 2 minuti.In this case, it shows that the video contains a 1920x1080 input at 24 frames-per-second in 4:2:2 sampling for a video of almost 2 minutes.

Aggiunta di un codificatore video per la generazione di file MP4Adding a video encoder for .MP4 file generation

Ora in Media File Input sono disponibili per l'uso un pin Uncompressed Video e più pin di output Uncompressed Audio.Now, an Uncompressed Video and multiple Uncompressed Audio output pins are available for use on the Media File Input. Per codificare il video in entrata, al flusso di lavoro è necessario aggiungere un componente di codifica, in questo caso per generare i file MP4.In order to encode the inbound video, an encoding component needs to be added to the workflow - in this case for generating .MP4 files.

Per codificare il flusso video in H.264, aggiungere il componente AVC Video Encoder all'area di progettazione.To encode the video stream to H.264, add the AVC Video Encoder component to the designer surface. Questo componente accetta un flusso video non compresso e genera un flusso video compresso AVC nel pin di output.This component takes an uncompress video stream as input and delivers an AVC compressed video stream on its output pin.

Codificatore AVC non connesso

Codificatore AVC non connessoUnconnected AVC Encoder

Le proprietà determinano come avviene esattamente la codifica.Its properties determine how the encoding exactly happens. Ecco alcune delle impostazioni più importanti:Let's have a look at some of the more important settings:

  • Output width e Output height: determinano la risoluzione del video codificato.Output width and Output height: determines the resolution of the encoded video. In questo caso, 640x360 è un'impostazione valida.In this case, 640x360 is a good setting.
  • Frame Rate: se viene impostata su passthrough, adotterà la frequenza dei fotogrammi di origine, anche se è possibile eseguirne l'override.Frame Rate: when set to passthrough it will just adopt the source frame rate, it's possible to override this though. Tale conversione della frequenza dei fotogrammi non è compensata dal movimento.Such framerate conversion is not motion-compensated.
  • Profile e Level: determinano il profilo e il livello AVC.Profile and Level: determines the AVC profile and level. Per ottenere facilmente altre informazioni sui diversi livelli e profili, fare clic sull'icona del punto di domanda nel componente AVC Video Encoder. La pagina della Guida mostrerà altri dettagli su ogni livello.To conveniently get more information about the different levels and profiles, click the question mark icon on the AVC Video Encoder component and the help page will show more detail about each of the levels. Per questo esempio, usare Main Profile impostato sul livello 3.2 (impostazione predefinita).For this example, use Main Profile at level 3.2 (the default).
  • Rate Control Mode e Bitrate (kbps): in questo scenario viene usato un output con velocità in bit costante (CBR) a 1200 kbps.Rate Control Mode and Bitrate (kbps): in this scenario, opt for a constant bitrate (CBR) output at 1200 kbps
  • Video Format: visualizza le informazioni sull'usabilità video che vengono scritte nel flusso H.264 (informazioni secondarie che possono essere usate da un decodificatore per migliorare la visualizzazione, ma non indispensabili per una corretta decodifica):Video Format: provides information about the VUI (Video Usability Information) that gets written into the H.264 stream (side information that might be used by a decoder to enhance the display but not essential to correctly decode):
  • NTSC (tipico per Stati Uniti o Giappone, usa 30 fps)NTSC (typical for US or Japan, using 30 fps)
  • PAL (tipico per l'Europa, usa 25 fps)PAL (typical for Europe, using 25 fps)
  • GOP Size Mode: in questo caso, configurare una dimensione GOP fissa con un intervallo chiave di 2 secondi con GOP chiusi.GOP Size Mode: set Fixed GOP Size for our purposes with a Key Interval of 2 seconds with Closed GOPs. L'impostazione di 2 secondi assicura la compatibilità con la creazione dinamica di pacchetti fornita da Servizi multimediali di Azure.The setting of 2 seconds ensures compatibility with the dynamic packaging Azure Media Services provides.

Per alimentare il codificatore AVC, connettere il pin di output Uncompressed Video del componente Media File Input al pin di input Uncompressed Video del codificatore AVC.To feed the AVC encoder, connect the Uncompressed Video output pin from the Media File Input component to the Uncompressed Video input pin from the AVC encoder.

Codificatore AVC connesso

Codificatore principale AVC connessoConnected AVC Main encoder

Codifica del flusso audioEncoding the audio stream

A questo punto, il flusso audio non compresso originale deve ancora essere compresso.At this point, the original uncompressed audio stream still needs to be compressed. Per la compressione del flusso audio aggiungere un componente codificatore AAC (Dolby) al flusso di lavoro.For compression of the audio stream add an AAC Encoder (Dolby) component to the workflow.

Codificatore AVC non connesso

Codificatore AAC non connessoUnconnected AAC encoder

Ora esiste un'incompatibilità: è presente un solo pin di input audio non compresso dal codificatore AAC, ma molto probabilmente per Media File Input saranno disponibili due diversi flussi audio non compressi: uno per il canale audio sinistro e uno per quello destro.Now there's an incompatibility: there's only a single uncompressed audio input pin from the AAC Encoder while more than likely the Media File Input will have two different uncompressed audio streams available: one for the left audio channel and one for the right. Se si usa un sistema audio di tipo surround, i canali saranno addirittura sei. Quindi non è possibile connettere direttamente l'audio dall'origine Media File Input al codificatore audio AAC.(If you're dealing with surround sound, that's six channels.) So it's not possible to directly connect the audio from the Media File Input source into the AAC audio encoder. Per il componente AAC è previsto un flusso audio cosiddetto "con interleave": un solo flusso con entrambi i canali sinistro e destro con interleave reciproco.The AAC component expects a so-called "interleaved" audio stream: a single stream that has both the left and the right channels interleaved with each other. Una volta conosciuta dal file multimediale di origine la posizione nell'origine di ogni traccia audio, è possibile generare tale flusso audio con interleave con le posizioni degli altoparlanti assegnate correttamente per la sinistra e la destra.Once we know from our source media file that audio tracks are on what position in the source, we can generate such interleaved audio stream with the correctly assigned speaker positions for left and right.

Prima si genererà un flusso con interleave dai canali audio di origine necessari.First, one wants to generate an interleaved stream from the required source audio channels. Il componente Audio Stream Interleaver lo gestirà automaticamente.The Audio Stream Interleaver component handles this for us. Aggiungerlo al flusso di lavoro e connettere gli output audio da Media File Input a esso.Add it to the workflow and connect the audio outputs from the Media File Input into it.

Audio Stream Interleaver connesso

Audio Stream Interleaver connessoConnected Audio Stream Interleaver

Ora che è disponibile un flusso audio con interleave, non si è tuttavia specificato a quali posizioni assegnare l'altoparlante sinistro o destro.Now that we have an interleaved audio stream, we still didn't specify where to assign the left or right speaker positions to. Per specificarlo, è possibile sfruttare Speaker Position Assigner.In order to specify this, we can leverage the Speaker Position Assigner.

Aggiunta di Speaker Position Assigner

Aggiunta di Speaker Position AssignerAdding a Speaker Position Assigner

Configurare Speaker Position Assigner per l'uso con un flusso di input stereo usando un filtro del set di impostazioni del codificatore "Custom" e il set di impostazioni del canale denominato "2.0 (L,R)".Configure the Speaker Position Assigner for use with a stereo input stream through an Encoder Preset Filter of "Custom" and the Channel Preset called "2.0 (L,R)." La posizione dell'altoparlante sinistro verrà assegnata al canale 1 e la posizione dell'altoparlante destro al canale 2.(This assigns the left speaker position to channel 1 and the right speaker position to channel 2.)

Connettere l'output di Speaker Position Assigner all'input del codificatore AAC.Connect the output of the Speaker Position Assigner to the input of the AAC Encoder. Indicare quindi al codificatore AAC di usare un set di impostazioni del canale "2.0 (L,R)", in modo che usi l'audio stereo come input.Then, tell the AAC Encoder to work with a "2.0 (L,R)" Channel Preset, so it knows to deal with stereo audio as input.

Multiplexing di flussi audio e video in un contenitore MP4Multiplexing Audio and Video streams into an MP4 container

È possibile acquisire sia il flusso video con codifica AVC che il flusso audio con codifica AAC in un contenitore MP4.Given our AVC encoded video stream and our AAC encoded audio stream, we can capture both into an .MP4 container. Il processo di missaggio di flussi diversi in uno solo è chiamato "multiplexing" (o "muxing").The process of mixing different streams into a single one is called "multiplexing" (or "muxing"). In questo caso verrà eseguito l'interleave dei flussi audio e video in un solo pacchetto MP4 coerente.In this case, we're interleaving the audio and the video streams in a single coherent .MP4 package. Il componente che coordina questa operazione per un contenitore MP4 è chiamato ISO MPEG-4 Multiplexer.The component that coordinates this for an .MP4 container is called the ISO MPEG-4 Multiplexer. Aggiungerne uno all'area di progettazione e connettere sia AVC Video Encoder che il codificatore AAC agli input.Add one to the designer surface and connect both the AVC Video Encoder and the AAC Encoder to its inputs.

MPEG4 Multiplexer connesso

MPEG4 Multiplexer connessoConnected MPEG4 Multiplexer

Scrittura del file MP4Writing the MP4 file

Quando si scrive un file di output, viene usato il componente File Output.When writing an output file, the File Output component is used. È possibile connetterlo all'output di ISO MPEG-4 Multiplexer in modo che l'output venga scritto sul disco.We can connect this to the output of the ISO MPEG-4 Multiplexer so that its output gets written to disk. A questo scopo, connettere il pin di output Container (MPEG-4) al pin di input Write di File Output.To do this, connect the Container (MPEG-4) output pin to the Write input pin of the File Output.

File Output connesso

File Output connessoConnected File Output

Il nome file usato viene determinato dalla proprietà File.The filename that is used is determined by the File property. Anche se tale proprietà può essere hardcoded in un determinato valore, molto probabilmente si preferirà invece impostarla usando un'espressione.While that property can be hardcoded to a given value, most likely one wants to set it through an expression instead.

Per fare in modo che il flusso di lavoro determini automaticamente la proprietà File name di output da un'espressione, fare clic sul pulsante accanto al nome file (accanto all'icona della cartella).To have the workflow automatically determine the output File name property from an expression, click the button next to the File name (next to the folder icon). Quindi scegliere "Expression" dal menu a discesa.From the drop-down menu then select "Expression." Verrà visualizzato l'editor espressioni.This brings up the expression editor. Prima di tutto cancellare i contenuti dell'editor.Clear the contents of the editor first.

Expression Editor vuoto

Expression Editor vuotoEmpty Expression Editor

L'editor espressioni consente di immettere qualsiasi valore letterale, combinato con una o più variabili.The expression editor allows you to enter any literal value, mixed with one, or more variables. Le variabili iniziano con un simbolo di dollaro.Variables start with a dollar sign. Quando si preme il tasto $, l'editor visualizzerà una casella a discesa con le variabili disponibili.As you hit the $ key, the editor shows a drop-down box with a choice of available variables. In questo caso si userà una combinazione tra la variabile della directory di output e la variabile del nome file di input di base:In our case we'll use a combination of the output directory variable and the base input file name variable:

${ROOT_outputWriteDirectory}\\${ROOT_sourceFileBaseName}.MP4

Expression Editor compilato

Expression Editor compilatoFilled out Expression Editor

Nota

Per visualizzare un file di output del processo di codifica in Azure, è necessario specificare un valore nell'editor espressioni.In order to see an output file of your encoding job in Azure, you must provide a value in the expression editor.

Quando si conferma l'espressione facendo clic su OK, la finestra delle proprietà visualizzerà in anteprima il valore in cui viene attualmente risolta la proprietà File.When you confirm the expression by hitting ok, the property window previews what value the File property resolves at this point in time.

L'espressione File risolve la directory di output

L'espressione File risolve la directory di outputFile Expression resolves output dir

Creazione di un asset di Servizi multimediali dal file di outputCreating a Media Services Asset from the output file

Anche se è stato scritto un file di output MP4, tuttavia è necessario indicare che questo file appartiene all'asset di output che Servizi multimediali genererà come risultato dell'esecuzione del flusso di lavoro.While we have written an MP4 output file, we still need to indicate that this file belongs to the output asset which media services generates as a result of executing this workflow. A questo scopo, viene usato il nodo Output File/Asset nel canvas del flusso di lavoro.To this end, the Output File/Asset node on the workflow canvas is used. Tutti i file in arrivo in questo nodo faranno parte dell'asset di Servizi multimediali di Azure risultante.All incoming files into this node make part of the resulting Azure Media Services asset.

Connettere il componente File Output al componente Output File/Asset per completare il flusso di lavoro.Connect the File Output component to the Output File/Asset component to finish the workflow.

Flusso di lavoro completato

Flusso di lavoro completatoFinished Workflow

Testare il flusso di lavoro completato in localeTest the finished workflow locally

Per testare il flusso di lavoro in locale, fare clic sul pulsante play nella barra degli strumenti in alto.To test the workflow locally, hit the play button in the toolbar at the top. Al termine dell'esecuzione del flusso di lavoro, esaminare l'output generato nella cartella di output configurata.When the workflow finished executing, inspect the output generated in the configured output folder. Verrà visualizzato il file di output MP4 completato codificato dal file di origine di input MXF.You'll see the finished MP4 output file that was encoded from the MXF input source file.

Codifica di un file MXF in MP4 - Creazione dinamica dei pacchetti a velocità in bit multipla abilitataEncoding MXF into MP4 - multibitrate dynamic packaging enabled

In questa procedura dettagliata si crea un set di file MP4 a velocità in bit multipla con audio con codifica AAC da un solo file di input MXF.This walkthrough creates a set of multiple bitrate MP4 files with AAC encoded audio from a single .MXF input file.

Quando si vuole usare un output di asset a velocità in bit multipla in combinazione con le funzionalità di Creazione dinamica dei pacchetti offerte da Servizi multimediali di Azure, dovranno essere generati più file MP4 allineati con GOP per ogni diversa velocità in bit e risoluzione.When a multi-bitrate asset output is desired for use in combination with the Dynamic Packaging features offered by Azure Media Services, multiple GOP-aligned MP4 files of each a different bitrate and resolution will need to be generated. A questo scopo, la procedura dettagliata Codifica di un file MXF in un MP4 a velocità in bit singola costituisce un valido punto di partenza.To do so, the Encoding MXF into a single bitrate MP4 walkthrough provides us with a good starting point.

Flusso di lavoro iniziale

Flusso di lavoro inizialeStarting Workflow

Aggiunta di uno o più output MP4Adding one or more additional MP4 outputs

Ogni file MP4 nell'asset di Servizi multimediali di Azure risultante supporterà una velocità in bit e una risoluzione diversa.Every MP4 file in our resulting Azure Media Services asset supports a different bitrate and resolution. Ora verrà aggiunto uno o più file di output MP4 al flusso di lavoro.Let's add one or more MP4 output files to the workflow.

Per verificare che tutti i codificatori video creati abbiano le stesse impostazioni, la soluzione più comoda consiste nel duplicare il componente AVC Video Encoder esistente e configurare un'altra combinazione di risoluzione e velocità in bit (ne verrà aggiunta una pari a 960 x 540 a 25 fotogrammi al secondo a 2,5 Mbps).To make sure we have all our video encoders created with the same settings, it's most convenient to duplicate the already existing AVC Video Encoder and configure another combination of resolution and bitrate (let's add one of 960 x 540 at 25 frames per second at 2.5 Mbps). Per duplicare il codificatore esistente, copiarlo e incollarlo nell'area di progettazione.To duplicate the existing encoder, copy paste it on the designer surface.

Connettere il pin di output Uncompressed Video di Media File Input nel nuovo componente AVC.Connect the Uncompressed Video output pin of the Media File Input into our new AVC component.

Secondo codificatore AVC connesso

Secondo codificatore AVC connessoSecond AVC encoder connected

Adattare ora la configurazione del nuovo codificatore AVC all'output 960x540 a 2,5 Mbps.Now adapt the configuration for our new AVC encoder to output 960x540 at 2.5 Mbps. usando le proprietà "Output width", "Output height" e "Bitrate (kbps)".(Use its properties "Output width", "Output height", and "Bitrate (kbps)" for this.)

Poiché si vuole usare l'asset risultante con la creazione dinamica dei pacchetti di Servizi multimediali di Azure, l'endpoint di streaming deve poter generare da questi file MP4 frammenti DASH/MP4 frammentati/HLS esattamente allineati tra loro in modo che i client che passano da una velocità in bit a un'altra ottengano un'esperienza video e audio continua e uniforme.Given we want to use the resulting asset together with Azure Media Services' dynamic packaging, the streaming endpoint needs to be capable of generating from these MP4 files HLS/Fragmented MP4/DASH fragments that are exactly aligned to each other in a way that clients that are switching between different bitrates get a single smooth continuous video and audio experience. A questo scopo, è necessario assicurarsi che nelle proprietà di entrambi i codificatori AVC la dimensione GOP ("Group of Pictures") per entrambi i file MP4 sia impostata su 2 secondi, come indicato di seguito:To make that happen, we need to ensure that, in the properties of both AVC encoders the GOP ("group of pictures") size for both MP4 files is set to 2 seconds, which can be done by:

  • impostare GOP Size Mode sulla dimensione Fixed GOP esetting the GOP Size Mode to Fixed GOP size and
  • Key Frame Interval su due secondithe Key Frame Interval to two seconds.
  • impostare anche GOP IDR Control su Closed GOP per assicurarsi che tutti i GOP siano autonomi senza dipendenzealso set the GOP IDR Control to Closed GOP to ensure all GOPs are standing on their own without dependencies

Per rendere più comprensibile il flusso di lavoro, rinominare il primo codificatore AVC "AVC Video Encoder 640x360 1200 kbps" e il secondo codificatore AVC "AVC Video Encoder 960x540 2500 kbps".To make this workflow easier to understand, rename the first AVC encoder to "AVC Video Encoder 640x360 1200 kbps" and the second AVC encoder "AVC Video Encoder 960x540 2500 kbps."

Ora aggiungere un secondo componente ISO MPEG-4 Multiplexer e un secondo componente File Output.Now add a second ISO MPEG-4 Multiplexer and a second File Output. Connettere il multiplexer al nuovo codificatore AVC e verificare che l'output sia diretto a File Output.Connect the multiplexer to the new AVC encoder and make sure its output is directed into the File Output. Quindi connettere anche l'output del codificatore audio AAC all'input del nuovo multiplexer.Then also connect the AAC audio encoder output to the new multiplexer's input. File Output a sua volta può essere connesso al nodo Output File/Asset per aggiungerlo all'asset di Servizi multimediali che verrà creato.The File Output in turn can then be connected to the Output File/Asset node to add it to the Media Services Asset that will be created.

Secondo muxer e File Output connessi

Secondo muxer e File Output connessiSecond Muxer and File Output connected

Per assicurare la compatibilità con la creazione dinamica dei pacchetti di Servizi multimediali di Azure, impostare Chunk Mode del multiplexer su GOP count o su Duration e impostare i GOP per ogni blocco su 1.For compatibility with Azure Media Services dynamic packaging, configure the multiplexer's Chunk Mode to GOP count or duration and set the GOPs per chunk to 1. Questa dovrebbe essere l'impostazione predefinita.(This should be the default.)

Modalità blocco del muxer

Modalità blocco del muxerMuxer Chunk Modes

Nota: è possibile ripetere questo processo per tutte le altre combinazioni di velocità in bit e risoluzione che si vuole aggiungere all'output dell'asset.Note: you may want to repeat this process for any other bitrate and resolution combinations you want to have added to the asset output.

Configurazione dei nomi di output dei fileConfiguring the file output names

È stato aggiunto più di un file all'asset di output.We have more than one single file added to the output asset. Per questo è necessario verificare che i nomi di ogni file di output siano tutti diversi ed eventualmente applicare anche una convenzione di denominazione file in modo che dal nome file risulti chiaro di che cosa si tratta.This provides a need to make sure the filenames for each of the output files are different from each other and maybe even apply a file-naming convention so it becomes clear from the file name what you're dealing with.

La denominazione dell'output dei file può essere controllata con le espressioni nella finestra di progettazione.File output naming can be controlled through expressions in the designer. Aprire il riquadro delle proprietà per uno dei componenti File Output e aprire l'editor espressioni per la proprietà File.Open the property pane for one of the File Output components and open the expression editor for the File property. Il primo file di output è stato configurato con l'espressione seguente (vedere l'esercitazione per la codifica da un file MXF in un MP4 a velocità in bit singola):Our first output file was configured through the following expression (see the tutorial for going from MXF to a single bitrate MP4 output):

${ROOT_outputWriteDirectory}\${ROOT_sourceFileBaseName}.MP4

Il nome file viene quindi determinato da due variabili: la directory di output in cui scrivere e il nome di base del file di origine.This means that our filename is determined by two variables: the output directory to write in and the source file base name. La prima viene esposta come proprietà nella radice del flusso di lavoro e il secondo viene determinato dal file in arrivo.The former is exposed as a property on the workflow root and the latter is determined by the incoming file. La directory di output è quella usata per il test locale. Il motore del flusso di lavoro eseguirà l'override di questa proprietà quando il flusso di lavoro verrà eseguito dal processore multimediale basato sul cloud in Servizi multimediali di Azure.The output directory is what you use for local testing; this property will be overridden by the workflow engine when the workflow is executed by the cloud-based media processor in Azure Media Services. Per assegnare a entrambi i file di output una denominazione di output coerente, modificare l'espressione di denominazione del primo file in:To give both our output files a consistent output naming, change the first file naming expression to:

${ROOT_outputWriteDirectory}\${ROOT_sourceFileBaseName}_640x360_1.MP4

e la seconda in:and the second to:

${ROOT_outputWriteDirectory}\${ROOT_sourceFileBaseName}_960x540_2.MP4

Effettuare un'esecuzione di test intermedia per verificare che entrambi i file di output MP4 vengano generati correttamente.Execute an intermediate test run to make sure both MP4 output files are properly generated.

Aggiunta di una traccia audio separataAdding a separate Audio Track

Come sarà illustrato in seguito, quando si genera un file con estensione ISM da usare con i file di output MP4, sarà necessario anche un file MP4 solo audio come traccia audio per il flusso adattivo.As we'll see later when we generate an .ism file to go with our MP4 output files, we will also require an audio-only MP4 file as the audio track for our adaptive streaming. Per creare questo file, aggiungere un altro muxer al flusso di lavoro (ISO-MPEG-4 Multiplexer) e connettere il pin di output del codificatore AAC al pin di input per Track 1.To create this file, add an additional muxer to the workflow (ISO-MPEG-4 Multiplexer) and connect the AAC encoder's output pin with its input pin for Track 1.

Muxer audio aggiunto

Muxer audio aggiuntoAudio Muxer Added

Creare un terzo componente File Output per l'output del flusso in uscita dal muxer e configurare l'espressione di denominazione file come:Create a third File Output component to output the outbound stream from the muxer and configure the file naming expression as:

${ROOT_outputWriteDirectory}\${ROOT_sourceFileBaseName}_128kbps_audio.MP4

Creazione di File Output con il muxer audio

Creazione di File Output con il muxer audioAudio Muxer creating File Output

Aggiunta del file SMIL ISMAdding the .ISM SMIL File

Per il funzionamento della creazione dinamica dei pacchetti con entrambi i file MP4 (e l'MP4 solo audio) nell'asset di Servizi multimediali, è necessario anche un file manifesto (chiamato anche file "SMIL": Synchronized Multimedia Integration Language).For the dynamic packaging to work in combination with both MP4 files (and the audio-only MP4) in our Media Services asset, we also need a manifest file (also called a "SMIL" file: Synchronized Multimedia Integration Language). Questo file indica a Servizi multimediali di Azure quali file MP4 sono disponibili per la creazione dinamica dei pacchetti e quali tenere in considerazione per il flusso audio.This file indicates to Azure Media Services what MP4 files are available for dynamic packaging and which of those to consider for the audio streaming. Un file manifesto tipico per un set di MP4 con un solo flusso audio sarà simile al seguente:A typical manifest file for a set of MP4's with a single audio stream looks like this:

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <smil xmlns="http://www.w3.org/2001/SMIL20/Language">
      <head>
        <meta name="formats" content="mp4" />
      </head>
      <body>
        <switch>
          <video src="H264_1900kbps_AAC_und_ch2_96kbps.mp4" />
          <video src="H264_1300kbps_AAC_und_ch2_96kbps.mp4" />
          <video src="H264_900kbps_AAC_und_ch2_96kbps.mp4" />
          <audio src="AAC_ch2_96kbps.mp4" title="AAC_und_ch2_96kbps" />
        </switch>
      </body>
    </smil>

Il file ism contiene in un'istruzione switch un riferimento a ogni singolo file video MP4 e, oltre a questi, anche uno o più file audio fanno riferimento a un MP4 contenente solo l'audio.The .ism file contains within a switch statement, a reference to each of the individual MP4 video files and in addition to those also one (or more) audio file references to an MP4 that only contains the audio.

La generazione del file manifesto per il set di MP4 può essere eseguita con un componente denominato "AMS Manifest Writer".Generating the manifest file for our set of MP4's can be done through a component called the "AMS Manifest Writer." Per usarlo, trascinarlo sulla superficie e connettere i pin di output "Write Complete" dai tre componenti File Output all'input di AMS Manifest Writer.To use it, drag it onto the surface and connect the "Write Complete" output pins from the three File Output components to the AMS Manifest Writer input. Verificare quindi di connettere l'output di AMS Manifest Writer ad Output File/Asset.Then make sure to connect the output of the AMS Manifest Writer to the Output File/Asset.

Come per gli altri componenti di output dei file, configurare il nome di output del file ism con un'espressione:As with our other file output components, configure the .ism file output name with an expression:

${ROOT_outputWriteDirectory}\\${ROOT_sourceFileBaseName}_manifest.ism

Il flusso di lavoro completato è simile al seguente:Our finished workflow looks like the below:

File MXF completato nel flusso di lavoro MP4 a velocità in bit multipla

File MXF completato nel flusso di lavoro MP4 a velocità in bit multiplaFinished MXF to multibitrate MP4 workflow

Codifica di un file MXF in un MP4 a velocità in bit multipla - Progetto avanzatoEncoding MXF into multibitrate MP4 - enhanced blueprint

Nella procedura dettagliata sul flusso di lavoro precedente è stato illustrato come un solo asset di input MXF possa essere convertito in un asset di output con file MP4 a velocità in bit multipla, un file MP4 solo audio e un file manifesto da usare con la creazione dinamica dei pacchetti di Servizi multimediali di Azure.In the previous workflow walkthrough we've seen how a single MXF input asset can be converted into an output asset with multi-bitrate MP4 files, an audio-only MP4 file, and a manifest file for use in conjunction with Azure Media Services dynamic packaging.

Questa procedura dettagliata illustra come alcuni aspetti possano essere migliorati e diventare più pratici.This walkthrough shows how some of the aspects can be enhanced and made more convenient.

Panoramica del flusso di lavoro da migliorareWorkflow overview to enhance

Flusso di lavoro MP4 a velocità in bit multipla da migliorare

Flusso di lavoro MP4 a velocità in bit multipla da migliorareMultibitrate MP4 workflow to enhance

Convenzioni di denominazione dei fileFile Naming Conventions

Nel flusso di lavoro precedente è stata specificata una semplice espressione come base per la generazione dei nomi file di output,In the previous workflow, we specified a simple expression as the basis for generating output file names. ma ci sono state alcune duplicazioni: tutti i singoli componenti dei file di output hanno specificato tale espressione.We have some duplication though: all of the individual output file components specified such expression.

Ad esempio, il componente File Output per il primo file video è configurato con questa espressione:For example, our file output component for the first video file is configured with this expression:

${ROOT_outputWriteDirectory}\${ROOT_sourceFileBaseName}_640x360_1.MP4

Invece per il secondo video di output, l'espressione è:While for the second output video, we have an expression like:

${ROOT_outputWriteDirectory}\\${ROOT_sourceFileBaseName}_960x540_2.MP4

Non sarebbe più lineare, meno soggetto a errori e più pratico, se fosse possibile rimuovere alcune duplicazioni e rendere il tutto più facilmente configurabile?Wouldn't it be cleaner, less error prone, and more convenient if we could remove some of this duplication and make things more configurable instead? Fortunatamente è possibile: le funzionalità delle espressioni della finestra di progettazione unite alla possibilità di creare proprietà personalizzate nella radice del flusso di lavoro offrono un livello di praticità aggiuntivo.Luckily we can: the designer's expression capabilities in combination with the ability to create custom properties on our workflow root will provide an added layer of convenience.

Si supponga che la configurazione dei nomi file si basi sulle velocità in bit dei singoli file MP4.Let's assume we'll drive filename configuration from the bitrates of the individual MP4 files. Queste velocità in bit dovranno essere configurate in una posizione centrale (nella radice del grafico), da dove saranno accessibili per configurare e determinare la generazione dei nomi file.These bitrates we'll aim to configure in one central place (on the root of our graph), from where they'll be accessed to configure and drive file name generation. A questo scopo, iniziare pubblicando la proprietà della velocità in bit da entrambi i codificatori AVC nella radice del flusso di lavoro, in modo che sia accessibile da entrambe le radici oltre che dai codificatori AVC.To do this, we start by publishing the bitrate property from both AVC encoders to the root of our workflow, so that it becomes accessible from both the root as well as from the AVC encoders. Anche se visualizzata in due punti diversi, esiste un solo valore sottostante.(Even if displayed in two different spots, there's only one underlying value.)

Pubblicazione delle proprietà dei componenti nella radice del flusso di lavoroPublishing component properties onto the workflow root

Aprire il primo codificatore AVC, andare alla proprietà Bitrate (kbps) e nel menu a discesa scegliere Publish.Open the first AVC encoder, go to the Bitrate (kbps) property and from the dropdown choose Publish.

Pubblicazione della proprietà della velocità in bit

Pubblicazione della proprietà della velocità in bitPublishing the bitrate property

Configurare la finestra di dialogo di pubblicazione per la pubblicazione nella radice del grafico del flusso di lavoro, con il nome pubblicato "video1bitrate" e il nome visualizzato leggibile "Video 1 Bitrate".Configure the publish dialog to publish to the root of our workflow graph, with a published name of "video1bitrate" and a readable display name of "Video 1 Bitrate". Configurare un nome gruppo denominato "Streaming Bitrates" e fare clic su Publish.Configure a custom group name called "Streaming Bitrates" and hit Publish.

Pubblicazione della proprietà della velocità in bit

Finestra di dialogo di pubblicazione per la proprietà della velocità in bitPublishing dialog for bitrate property

Ripetere le stesse operazioni per la proprietà della velocità in bit del secondo codificatore AVC e denominarla "video2bitrate" con il nome visualizzato "Video 2 Bitrate", nello stesso gruppo personalizzato "Streaming Bitrates".Repeat the same for the bitrate property of the second AVC encoder and name it "video2bitrate" with a display name of "Video 2 Bitrate", in the same custom group "Streaming Bitrates".

Se ora si esaminano le proprietà della radice del flusso di lavoro, si noterà il gruppo personalizzato con le due proprietà pubblicate visualizzate.If we now inspect the workflow root properties, we'll see our custom group with the two published properties show up. Entrambe mostrano il valore della velocità in bit del rispettivo codificatore AVC.Both are reflecting the value of their respective AVC encoder bitrate.

Proprietà della velocità in bit pubblicate nella radice del flusso di lavoro

Quando si vuole accedere a queste proprietà dal codice o da un'espressione, è possibile eseguire questa operazione:Whenever we want to access these properties from code or from an expression, we can do so like this:

  • dal codice inline da un componente direttamente sotto la radice: node.getPropertyAsString('../video1bitrate',null)from inline code from a component right below the root: node.getPropertyAsString('../video1bitrate', null)
  • in un'espressione: ${ROOT_video1bitrate}within an expression: ${ROOT_video1bitrate}

Completare ora il gruppo "Streaming Bitrates" pubblicando anche la velocità in bit della traccia audio.Let's complete the "Streaming Bitrates" group by publishing our audio track bitrate on it as well. Nelle proprietà del codificatore AAC cercare l'impostazione Bitrate e scegliere Publish dal menu a discesa accanto a essa.Within the properties of the AAC Encoder, search for the Bitrate setting and select Publish from the dropdown next to it. Eseguire la pubblicazione nella radice del grafico con il nome "audio1bitrate" e il nome visualizzato "Audio 1 Bitrate" nel gruppo personalizzato "Streaming Bitrates".Publish to the root of the graph with name "audio1bitrate" and display name "Audio 1 Bitrate" within our custom group "Streaming Bitrates".

Finestra di dialogo di pubblicazione per la velocità in bit audio

Finestra di dialogo di pubblicazione per la velocità in bit audioPublishing dialog for audio bitrate

Proprietà video e audio risultanti nella radice

Proprietà video e audio risultanti nella radiceResulting video and audio props on root

Modificando uno dei tre valori vengono riconfigurati e modificati anche i valori nei rispettivi componenti a cui sono collegati (e da cui sono stati pubblicati).Changing any of those three values also reconfigures and changes the values on the respective components they are linked with (and where published from).

Fare in modo che i nomi file di output generati si basino sui valori delle proprietà pubblicatiHave generated output file names rely on published property values

Invece di impostare come hardcoded i nomi file generati, ora è possibile modificare l'espressione del nome file in ogni componente File Output in modo che si basi sulle proprietà delle velocità in bit pubblicate nella radice del grafico.Instead of hardcoding our generated file names, we can now change our filename expression on each of the File Output components to rely on the bitrate properties we published on the graph root. Iniziando dal primo componente File Output, trovare la proprietà File e modificare l'espressione in questo modo:Starting with our first file output, find the File property and edit the expression like this:

${ROOT_outputWriteDirectory}\${ROOT_sourceFileBaseName}_${ROOT_video1bitrate}kbps.MP4

I diversi parametri di questa espressione sono accessibili e possono essere immessi premendo il simbolo di dollaro sulla tastiera mentre è attiva la finestra dell'espressione.The different parameters in this expression can be accessed and entered by hitting the dollar sign on the keyboard while in the expression window. Uno dei parametri disponibili è la proprietà video1bitrate pubblicata prima.One of the available parameters is our video1bitrate property that we published earlier.

Accesso ai parametri in un'espressione

Accesso ai parametri in un'espressioneAccessing parameters within an expression

Eseguire le stesse operazioni per il componente File Output per il secondo video:Do the same for the file output for our second video:

${ROOT_outputWriteDirectory}\${ROOT_sourceFileBaseName}_${ROOT_video2bitrate}kbps.MP4

e per il componente File Output solo audio:and for the audio-only file output:

${ROOT_outputWriteDirectory}\${ROOT_sourceFileBaseName}_${ROOT_audio1bitrate}bps_audio.MP4

Se ora si modifica la velocità in bit per uno dei file video o audio, il rispettivo codificatore verrà riconfigurato e la convenzione dei nomi file basata sulla velocità in bit verrà rispettata automaticamente.If we now change the bitrate for any of the video or audio files, the respective encoder will be reconfigured and the bitrate-based file name convention will be honored all automatic.

Aggiunta di anteprime all'output MP4 a velocità in bit multiplaAdding thumbnails to multibitrate MP4 output

Partendo da un flusso di lavoro che genera un output MP4 a velocità in bit multipla da un input MXF, verrà ora esaminata l'aggiunta di anteprime all'output.Starting from a workflow that generates a multibitrate MP4 output from an MXF input, we will now be looking into adding thumbnails to the output.

Panoramica del flusso di lavoro a cui aggiungere le anteprimeWorkflow overview to add thumbnails to

Flusso di lavoro MP4 a velocità in bit multipla da cui iniziare

Flusso di lavoro MP4 a velocità in bit multipla da cui iniziareMultibitrate MP4 workflow to start from

Aggiunta della codifica JPGAdding JPG Encoding

La base della generazione delle anteprime sarà il componente JPG Encoder, usato per l'output di file JPG.The heart of our thumbnail generation will be the JPG Encoder component, able to output JPG files.

JPG Encoder

JPG EncoderJPG Encoder

Non è tuttavia possibile connettere direttamente il flusso Uncompressed Video dal componente Media File Input al codificatore JPG.We cannot however directly connect our Uncompressed Video stream from the Media File Input into the JPG encoder. È invece previsto che gli vengano passati i singoli fotogrammi.Instead, it expects to be handed individual frames. Questa operazione può essere eseguita con il componente Video Frame Gate.This, we can do through the Video Frame Gate component.

Connessione di un'attività di controllo dei fotogrammi al codificatore JPG

Connessione di un'attività di controllo dei fotogrammi al codificatore JPGConnecting a frame gate to the JPG encoder

L'attività di controllo dei fotogrammi consente a un fotogramma video di passare dopo un intervallo stabilito di secondi o di fotogrammi.The frame gate once every so many seconds or frames allows a video frame to pass. L'intervallo e l'offset temporale con cui questa operazione viene eseguita sono configurabili nelle proprietà.The interval and the time offset with which this happens is configurable in the properties.

Proprietà di Video Frame Gate

Proprietà di Video Frame GateVideo Frame Gate properties

Verrà ora creata un'anteprima ogni minuto impostando la modalità su Time (seconds) e l'intervallo su 60.Let's create a thumbnail every minute by setting the mode to Time (seconds) and the Interval to 60.

Gestione della conversione dello spazio coloreDealing with Color Space conversion

Anche se a questo punto può sembrare logico connettere entrambi i pin Uncompressed Video dell'attività di controllo dei fotogrammi e di Media File Input, se si esegue l'operazione viene visualizzato un avviso.While it would seem logical both Uncompressed Video pins of the frame gate and the Media File Input can now be connected, we would get a warning if we would do so.

Errore relativo allo spazio color di input

Errore relativo allo spazio color di inputInput color space error

Infatti il modo in cui le informazioni sui colori sono rappresentate nel flusso video non compresso e non elaborato originale, proveniente dal file MXF, è diverso da quello previsto per il codificatore JPG.This is because the way in which color information is represented in our original raw uncompressed video stream, coming from our MXF, is different from what the JPG Encoder is expecting. In particolare, è previsto il flusso di un cosiddetto "spazio colore" "RGB" o "gradazioni di grigio".More specifically, a so-called "color space" of "RGB" or "Grayscale" is expected to flow in. Al flusso video in entrata di Video Frame Gate dovrà quindi essere prima applicata una conversione relativa allo spazio colore.This means that the Video Frame Gate's inbound video stream needs to have a conversion applied regarding its color space first.

Trascinare nel flusso di lavoro Color Space Converter - Intel e connetterlo all'attività di controllo dei fotogrammi.Drag onto the workflow the Color Space Converter - Intel and connect it to our frame gate.

Connessione di un convertitore dello spazio colore

Connessione di un convertitore dello spazio coloreConnecting a Color Space Convertor

Nella finestra delle proprietà selezionare la voce BGR 24 nell'elenco Preset.In the properties window, pick the BGR 24 entry from the Preset list.

Scrittura delle anteprimeWriting the thumbnails

Diversamente dai video MP4, il componente JPG Encoder genererà più di un file.Different from our MP4 video's, the JPG Encoder component outputs more than one file. Per gestire i file, è possibile usare un componente Scene Search JPG File Writer, che accetterà le anteprime JPG in ingresso e le trascriverà, con un numero diverso come suffisso per ogni nome file.In order to deal with this, a Scene Search JPG File Writer component can be used: it takes the incoming JPG thumbnails and writes them out, each filename being suffixed by a different number. Il numero indica in genere il numero di secondi/unità nel flusso da cui l'anteprima è stata disegnata.(The number typically indicating the number of seconds/units in the stream that the thumbnail was drawn from.)

Introduzione di Scene Search JPG File Writer

Introduzione di Scene Search JPG File WriterIntroducing the Scene Search JPG File Writer

Configurare la proprietà Output Folder Path con l'espressione: ${ROOT_outputWriteDirectory}Configure the Output Folder Path property with the expression: ${ROOT_outputWriteDirectory}

e la proprietà Filename Prefix con:and the Filename Prefix property with:

${ROOT_sourceFileBaseName}_thumb_

Il prefisso determinerà come vengono denominati i file delle anteprime.The prefix determines how the thumbnail files are being named. Come suffisso verrà usato un numero indicante la posizione dell'anteprima nel flusso.They are suffixed with a number indicating the thumb's position in the stream.

Proprietà di Scene Search JPG File Writer

Proprietà di Scene Search JPG File WriterScene Search JPG File Writer properties

Connettere Scene Search JPG File Writer al nodo Output File/Asset.Connect the Scene Search JPG File Writer to the Output File/Asset node.

Rilevamento di errori in un flusso di lavoroDetecting errors in a workflow

Connettere l'input di Color Space Converter nell'output video non compresso non elaborato.Connect the input of the color space converter to the raw uncompressed video output. Ora effettuare un'esecuzione di test locale per il flusso di lavoro.Now perform a local test run for the workflow. È probabile che l'esecuzione del flusso di lavoro venga arrestata improvvisamente e il componente in cui si è verificato un errore venga indicato con un bordo rosso:There's a good chance the workflow will suddenly stop executing and indicate with a red outline on the component that encountered an error:

Errore di Color Space Converter

Errore di Color Space ConverterColor Space Converter error

Fare clic sull'icona con la "E" rossa nell'angolo in alto a destra del componente Color Space Converter per visualizzare il motivo per cui il tentativo di codifica non è riuscito.Click the little red "E" icon in the top right corner of the Color Space Converter component to see what's the reason the encoding attempt failed.

Finestra di dialogo dell'errore di Color Space Converter

Finestra di dialogo dell'errore di Color Space ConverterColor Space Converter error dialog

Come si può notare, lo standard dello spazio colore in entrata per Color Space Converter deve essere rec601 per la conversione richiesta di YUV in RGB.It turns out, as you can see, that the incoming color space standard for the color space converter has to be rec601 for our requested conversion of YUV to RGB. Sembra che il flusso non indichi rec601.Apparently our stream doesn't indicate its rec601. Rec 601 è uno standard per la codifica dei segnali video analogici interlacciati nel formato video digitale.(Rec 601 is a standard for encoding interlaced analog video signals in digital video form. Specifica un'area attiva che copre 720 campioni di luminanza e 360 campioni di crominanza per linea.It specifies an active region covering 720 luminance samples and 360 chrominance samples per line. Il sistema di codifica dei colori è noto come YCbCr 4:2:2.The color encoding system is known as YCbCr 4:2:2.)

Per risolvere il problema, si indicherà nei metadati del flusso che si sta usando contenuto rec601.To fix this, we'll indicate on the metadata of our stream that we're dealing with rec601 content. A questo scopo, verrà usato un componente Video Data Type Updater, che verrà inserito tra l'origine non elaborata e il componente di conversione dello spazio colore.To do so we'll use a Video Data Type Updater component, which we'll put in between our raw source and the color space conversion component. Questo strumento di aggiornamento del tipo di dati consente l'aggiornamento manuale di alcune proprietà del tipo di dati video.This data type updater allows for the manual update of certain video data type properties. Configurarlo in modo che Color Space Standard indichi "Rec 601".Configure it to indicate a Color Space Standard of "Rec 601". In questo modo Video Data Type Updater contrassegnerà il flusso con lo spazio colore "Rec 601" se non è ancora stato definito alcuno spazio colore.This causes the Video Data Type Updater to tag the stream with the "Rec 601" color space if there was no color space defined yet. Eseguirà l'override dei metadati esistenti, solo se è stata selezionata la casella di controllo Override.(It will not override any existing metadata, unless the Override checkbox was checked.)

Aggiornamento di Color Space Standard in Data Type Updater

Aggiornamento di Color Space Standard in Data Type UpdaterUpdating Color Space Standard on the Data Type Updater

Flusso di lavoro completatoFinished Workflow

Ora che il flusso di lavoro è stato completato, effettuare un'altra esecuzione di test per assicurarsi che vengano superati.Now that our workflow is finished, do another test run to see it passes.

Flusso di lavoro completato per l'output di più MP4 con anteprime

Flusso di lavoro completato per l'output di più MP4 con anteprimeFinished workflow for multi-mp4 output with thumbnails

Taglio basato sull'ora dell'output MP4 a velocità in bit multiplaTime-based trimming of multibitrate MP4 output

Partendo da un flusso di lavoro che genera un output MP4 a velocità in bit multipla da un input MXF, verrà ora esaminato il taglio del video di origine basato su timestamp.Starting from a workflow that generates a multibitrate MP4 output from an MXF input, we will now be looking into trimming the source video based on time-stamps.

Panoramica del flusso di lavoro a cui iniziare ad aggiungere il taglioWorkflow overview to start adding trimming to

Flusso di lavoro iniziale a cui aggiungere il taglio

Flusso di lavoro iniziale a cui aggiungere il taglioStarting workflow to add trimming to

Uso di Stream TrimmerUsing the Stream Trimmer

Il componente Stream Trimmer consente anche di tagliare l'inizio e la fine di un flusso di input in base alle informazioni sugli intervalli (secondi, minuti...). Il trimmer non supporta il taglio basato su fotogramma.The Stream Trimmer component allows you to trim the beginning and ending of an input stream base on timing information (seconds, minutes, ...). The trimmer does not support frame-based trimming.

Stream Trimmer

Stream TrimmerStream Trimmer

Invece di collegare direttamente i codificatori AVC e Speaker Position Assigner a Media File Input, tra di essi verrà inserito Stream TrimmerInstead of linking the AVC encoders and speaker position assigner to the Media File Input directly, we'll put in between those the stream trimmer. (uno per il segnale video e uno per il segnale audio con interleave).(One for the video signal and one for the interleaved audio signal.)

Inserire Stream Trimmer in mezzo

Inserire Stream Trimmer in mezzoPut Stream Trimmer in between

Ora il trimmer verrà configurato per poter elaborare solo il video e l'audio tra 15 secondi e 60 secondi nel video.Let's configure the trimmer so that we will only process video and audio between 15 seconds and 60 seconds in the video.

Andare alle proprietà di Video Stream Trimmer e configurare entrambe le proprietà Start Time (15 secondi) ed End Time (60 secondi).Go to the properties of the Video Stream Trimmer and configure both Start Time (15 s) and End Time (60 s) properties. Entrambi i trimmer audio e video verranno pubblicati nella radice del flusso di lavoro per verificare che siano sempre configurati sugli stessi valori di inizio e di fine.To make sure both our audio and video trimmer are always configured to the same start and end values, we publish those to the root of the workflow.

Pubblicare la proprietà Start Time da Stream Trimmer

Pubblicare la proprietà Start Time da Stream TrimmerPublish start time property from Stream Trimmer

Finestra di dialogo Publish Property per Start Time

Finestra di dialogo Publish Property per Start TimePublish property dialog for start time

Finestra di dialogo Publish Property per End Time

Finestra di dialogo Publish Property per End TimePublish property dialog for end time

Se ora si osserva la radice del flusso di lavoro, si noterà che entrambe le proprietà sono ben visualizzate e configurabili direttamente.If we now inspect the root of our workflow, both properties are neatly displayed and configurable from there.

Proprietà pubblicate disponibili nella radice

Proprietà pubblicate disponibili nella radicePublished properties available on root

Aprire ora le proprietà di taglio dal trimmer audio e configurare sia l'ora di inizio che quella di fine con un'espressione che faccia riferimento alle proprietà pubblicate nella radice del flusso di lavoro.Now open the trimming properties from the audio trimmer and configure both start and end times with an expression that refers to the published properties on the root of our workflow.

Per l'ora di inizio del taglio dell'audio:For the audio trimming start time:

${ROOT_TrimmingStartTime}

e per l'ora di fine:and for its end time:

${ROOT_TrimmingEndTime}

Flusso di lavoro completatoFinished Workflow

Flusso di lavoro completato

Flusso di lavoro completatoFinished Workflow

Introduzione al componente con scriptIntroducing the Scripted Component

I componenti con script possono eseguire script arbitrari durante le fasi di esecuzione del flusso di lavoro.Scripted Components can execute arbitrary scripts during the execution phases of our workflow. Possono essere eseguiti quattro diversi script, tutti con caratteristiche specifiche e con la propria posizione nel ciclo di vita del flusso di lavoro:There are four different scripts that can be executed, each with specific characteristics, and their own place in the workflow life-cycle:

  • commandScriptcommandScript
  • realizeScriptrealizeScript
  • processInputScriptprocessInputScript
  • lifeCycleScriptlifeCycleScript

La documentazione del componente con script li illustra più dettagliatamente.The documentation of the Scripted Component goes in more detail for each of the above. Nella sezione seguente, il componente di scripting realizeScript viene usato per costruire un file xml con un elenco di clip non appena il flusso di lavoro viene avviato.In the following section, the realizeScript scripting component is used to construct a cliplist xml on the fly when the workflow starts. Questo script viene chiamato durante la configurazione del componente, che viene eseguita solo una volta nel ciclo di vita.This script is called during the component setup, which happens only once in its lifecycle.

Scripting in un flusso di lavoro: hello worldScripting within a workflow: hello world

Trascinare un componente con script sull'area di progettazione e rinominarlo (ad esempio, "SetClipListXML").Drag a Scripted Component onto the designer surface and rename it (for example, "SetClipListXML").

Aggiunta di un componente con script

Aggiunta di un componente con scriptAdding a Scripted Component

Quando si esaminano le proprietà del componente con script, vengono visualizzati i quattro diversi tipi di script, tutti configurabili in uno script diverso.When you inspect the properties of the Scripted Component, the four different script types will be shown, each configurable to a different script.

Proprietà del componente con script

Proprietà del componente con scriptScripted Component properties

Cancellare il contenuto di processInputScript e aprire l'editor per realizeScript.Clear the processInputScript and open the editor for the realizeScript. La configurazione è stata eseguita ed è possibile avviare lo script.Now we're set up and ready to start scripting.

Gli script vengono scritti in Groovy, un linguaggio di scripting compilato in modo dinamico per la piattaforma Java, che mantiene la compatibilità con Java.Scripts are written in Groovy, a dynamically compiled scripting language for the Java platform that retains compatibility with Java. La maggior parte del codice Java è effettivamente codice Groovy valido.Actually, most Java code is valid Groovy code.

Verrà ora scritto un semplice script di Groovy hello world nel contesto di realizeScript.Let's write a simple hello world groovy script in the context of our realizeScript. Immettere nell'editor quanto segue:Enter the following in the editor:

node.log("hello world");

Ora effettuare un'esecuzione di test locale.Now execute a local test run. Dopo questa esecuzione, esaminare (nella scheda System del componente con script) la proprietà Logs.After this run, inspect (through the System tab on the Scripted Component) the Logs property.

Output di log hello world

Output di log hello worldHello world log output

L'oggetto nodo su cui viene chiamato il metodo log, fa riferimento al "nodo" corrente, ovvero al componente in cui si sta creando lo script.The node object we call the log method on, refers to our current "node" or the component we're scripting within. Ogni componente ha di per sé la possibilità di creare l'output dei dati di registrazione, disponibili nella scheda System. In questo caso, viene creato l'output del valore letterale stringa "hello world".Every component as such has the ability to output logging data, available through the system tab. In this case, we output the string literal "hello world." È importante comprendere che questo si rivela un prezioso strumento di debug perché offre informazioni dettagliate sulle operazioni effettivamente eseguite dallo script.Important to understand here is that this can prove to be an invaluable debugging tool, providing you with insight on what the script is actually doing.

Dall'ambiente di scripting è anche possibile accedere alle proprietà degli altri componenti.From within our scripting environment, we also have access to properties on other components. Provare a eseguire quanto segue:Try this:

    //inspect current node:
    def nodepath = node.getNodePath();
    node.log("this node path: " + nodepath);

    //walking up to other nodes:
    def parentnode = node.getParentNode();
    def parentnodepath = parentnode.getNodePath();
    node.log("parent node path: " + parentnodepath);

    //read properties from a node:
    def sourceFileExt = parentnode.getPropertyAsString( "sourceFileExtension", null );
    def sourceFileName = parentnode.getPropertyAsString("sourceFileBaseName", null);
    node.log("source file name with extension " + sourceFileExt + " is: " + sourceFileName);

La finestra dei log visualizzerà quanto segue:Our log window shows us the following:

Output dei log per l'accesso ai percorsi dei nodi

Output dei log per l'accesso ai percorsi dei nodiLog output for accessing node paths

Taglio basato sul fotogramma dell'output MP4 a velocità in bit multiplaFrame-based trimming of multibitrate MP4 output

Partendo da un flusso di lavoro che genera un output MP4 a velocità in bit multipla da un input MXF, verrà ora esaminato il taglio del video di origine basato sui conteggi dei fotogrammi.Starting from a workflow that generates a multibitrate MP4 output from an MXF input, we will now be looking into trimming the source video based on frame counts.

Panoramica del progetto a cui iniziare ad aggiungere il taglioBlueprint overview to start adding trimming to

Flusso di lavoro a cui iniziare ad aggiungere il taglio

Flusso di lavoro a cui iniziare ad aggiungere il taglioWorkflow to start adding trimming to

Uso di Clip List XMLUsing the Clip List XML

In tutte le esercitazioni precedenti sul flusso di lavoro è stato usato il componente Media File Input come origine di input video.In all previous workflow tutorials, we used the Media File Input component as our video input source. Per questo specifico scenario, si userà invece il componente Clip List Source.For this specific scenario though, we'll be using the Clip List Source component instead. Questo non è il modo migliore di procedere. Usare Clip List Source solo quando è effettivamente necessario (come nel caso seguente, in cui si usano le funzionalità di taglio dell'elenco di clip).This should not be the preferred way of working; only use the Clip List Source when there's a real reason to do so (like in the following case, where we're making use of the clip list trimming capabilities).

Per passare da Media File Input a Clip List Source, trascinare il componente Clip List Source sull'area di progettazione e connettere il pin Clip List XML al nodo Clip List XML di Progettazione flussi di lavoro.To switch from our Media File Input to the Clip List Source, drag the Clip List Source component onto the design surface and connect the Clip List XML pin to the Clip List XML node of the workflow designer. Clip List Source verrà popolato con i pin di output, in base al video di input.This populates the Clip List Source with output pins, according to our input video. Connettere ora i pin Uncompressed Video e Uncompressed Audio da Clip List Source ai rispettivi codificatori AVC e ad Audio Stream Interleaver.Now connect the Uncompressed Video and Uncompressed Audio pins from the Clip List Source to the respective AVC Encoders and Audio Stream Interleaver. Ora rimuovere Media File Input.Now remove the Media File Input.

Sostituire Media File Input con Clip List Source

Sostituire Media File Input con Clip List SourceReplaced the Media File Input with the Clip List Source

Il componente Clip List Source accetta "Clip List XML" come input.The Clip List Source component takes as its input a "Clip List XML." Quando si seleziona il file di origine con cui eseguire il test in locale, questo file XML dell'elenco di clip viene automaticamente popolato.When selecting the source file to test with locally, this clip list xml is auto-populated for you.

Proprietà Clip List XML popolata automaticamente

Proprietà Clip List XML popolata automaticamenteAuto-populated Clip List XML property

Se si osserva meglio il file XML, ecco come appare:Looking a bit closer to the xml, this is how it looks like:

Finestra di dialogo di modifica dell'elenco di clip

Finestra di dialogo di modifica dell'elenco di clipEdit clip list dialog

Questo, tuttavia, non rispecchia le funzionalità del file XML dell'elenco di clip.This however does not reflect the capabilities of the clip list xml. Una possibilità è quella di aggiungere un elemento "Trim" sia sotto l'origine video che sotto quella audio, in questo modo:One option we have is to add a "Trim" element under both the video and audio source, like this:

Aggiunta di un elemento trim all'elenco di clip

Aggiunta di un elemento trim all'elenco di clipAdding a trim element to the clip list

Se si modifica il file XML dell'elenco di clip come indicato sopra e si esegue un test locale, si noterà che il video è stato tagliato correttamente tra i 10 e i 20 secondi.If you modify the clip list xml like this above and perform a local test run, you'll see the video correctly been trimmed between 10 and 20 seconds in the video.

Contrariamente a quanto accade quando si effettua un'esecuzione locale, questo stesso file XML dell'elenco di clip non avrà lo stesso effetto se applicato a un flusso di lavoro eseguito in Servizi multimediali di Azure.Contrary to what happens when you do a local run though, this same cliplist xml would not have the same effect when applied in a workflow that runs in Azure Media Services. Quando Codificatore premium di Azure viene avviato, il file XML dell'elenco di clip viene generato di nuovo ogni volta, in base al file di input assegnato al processo di codifica.When Azure Premium Encoder starts, the cliplist xml is generated every time again, based on the input file the encoding job was given. Quindi verrà purtroppo eseguito l'override delle eventuali modifiche apportate al file XML.This means that any changes we do on the xml would unfortunately be overridden.

Per evitare che il file XML dell'elenco di clip venga cancellato quando viene avviato un processo di codifica, è possibile rigenerarlo subito dopo l'avvio del flusso di lavoro.To counter the cliplist xml being wiped when an encoding job is started, we can regenerate it on the fly just after the start of our workflow. Tali azioni personalizzate possono essere eseguite con un cosiddetto "componente con script".Such custom actions can be taken through what is called a "Scripted Component." Per altre informazioni, vedere Introduzione al componente con script.For more information, see Introducing the Scripted Component.

Trascinare un componente con script sull'area di progettazione e rinominarlo "SetClipListXML".Drag a Scripted Component onto the designer surface and rename it to "SetClipListXML."

Aggiunta di un componente con script

Aggiunta di un componente con scriptAdding a Scripted Component

Quando si esaminano le proprietà del componente con script, vengono visualizzati i quattro diversi tipi di script, tutti configurabili in uno script diverso.When you inspect the properties of the Scripted Component, the four different script types are shown, each configurable to a different script.

Proprietà del componente con script

Proprietà del componente con scriptScripted Component properties

Modifica dell'elenco di clip da un componente con scriptModifying the clip list from a Scripted Component

Prima di poter riscrivere il file XML dell'elenco di clip generato durante l'avvio del flusso di lavoro, sarà necessario l'accesso alla proprietà e ai contenuti del file XML.Before we can rewrite the cliplist xml that is generated during workflow startup, we'll need to have access to the cliplist xml property and contents. A questo scopo, è possibile usare il codice seguente:We can do so like this:

    // get cliplist xml:
    def clipListXML = node.getProperty("../clipListXml");
    node.log("clip list xml coming in: " + clipListXML);

Elenco di clip in entrata da registrare

Elenco di clip in entrata da registrareIncoming clip list being logged

Prima di tutto è necessario determinare da quale punto a quale punto si vuole tagliare il video.First we need a way to determine from which point until which point we want to trim the video. Per facilitare l'operazione agli utenti del flusso di lavoro meno esperti, pubblicare due proprietà nella radice del grafico.To make this convenient to the less-technical user of the workflow, publish two properties to the root of the graph. A questo scopo, fare clic con il pulsante destro del mouse sull'area di progettazione e scegliere "Add Property":To do this, right-click the designer surface and select "Add Property":

  • Prima proprietà: "ClippingTimeStart" di tipo: "TIMECODE"First property: "ClippingTimeStart" of type: "TIMECODE"
  • Seconda proprietà: "ClippingTimeEnd" di tipo: "TIMECODE"Second property: "ClippingTimeEnd" of type: "TIMECODE"

Finestra di dialogo Add Property per l'ora di inizio del ritaglio

Finestra di dialogo Add Property per l'ora di inizio del ritaglioAdd Property dialog for clipping start time

Proprietà degli orari di ritaglio pubblicate nella radice del flusso di lavoro

Proprietà degli orari di ritaglio pubblicate nella radice del flusso di lavoroPublished clipping time props on workflow root

Configurare entrambe le proprietà su un valore appropriato:Configure both properties to a suitable value:

Configurare le proprietà di inizio e di fine del ritaglio

Configurare le proprietà di inizio e di fine del ritaglioConfigure the clipping start and end properties

Ora dallo script è possibile accedere a entrambe le proprietà, in questo modo:Now, from within our script, we can access both properties, like this:

    // get start and end of clipping:
    def clipstart = node.getProperty("../ClippingTimeStart").toString();
    def clipend = node.getProperty("../ClippingTimeEnd").toString();

    node.log("clipping start: " + clipstart);
    node.log("clipping end: " + clipend);

Finestra dei log che mostra l'inizio e la fine del ritaglio

Finestra dei log che mostra l'inizio e la fine del ritaglioLog window showing start and end of clipping

Verranno ora analizzate le stringhe del time code in un formato più facile da usare, con una semplice espressione regolare:Let's parse the timecode strings into a more convenient to use form, using a simple regular expression:

    //parse the start timing:
    def startregresult = (~/(\d\d:\d\d:\d\d:\d\d)\/(\d\d)/).matcher(clipstart);
    startregresult.matches();
    def starttimecode = startregresult.group(1);
    node.log("timecode start is: " + starttimecode);
    def startframerate = startregresult.group(2);
    node.log("framerate start is: " + startframerate);

    //parse the end timing:
    def endregresult = (~/(\d\d:\d\d:\d\d:\d\d)\/(\d\d)/).matcher(clipend);
    endregresult.matches();
    def endtimecode = endregresult.group(1);
    node.log("timecode end is: " + endtimecode);
    def endframerate = endregresult.group(2);
    node.log("framerate end is: " + endframerate);

Finestra dei log con l'output del time code analizzato

Finestra dei log con l'output del time code analizzatoLog window with output of parsed timecode

Con queste informazioni a disposizione, ora è possibile modificare il file XML dell'elenco di clip per poter rispecchiare le ore di inizio e di fine per il ritaglio accurato dei fotogrammi desiderati del filmato.With this information at hand, we can now modify the cliplist xml to reflect the start and end times for the desired frame-accurate clipping of the movie.

Codice di script per aggiungere elementi trim

Codice di script per aggiungere elementi trimScript code to add trim elements

Queste modifiche sono state apportate con normali operazioni di manipolazione delle stringhe.This was done through normal string manipulation operations. Il file XML dell'elenco di clip modificato risultante è stato scritto di nuovo nella proprietà clipListXML nella radice del flusso di lavoro con il metodo "setProperty".The resulting modified clip list xml is written back to the clipListXML property on the workflow root through the "setProperty" method. La finestra dei log dopo un'altra esecuzione di test visualizzerà quanto segue:The log window after another test run would show us the following:

Registrazione dell'elenco di clip risultante

Registrazione dell'elenco di clip risultanteLogging the resulting clip list

Effettuare un'esecuzione di test per visualizzare come i flussi video e audio sono stati tagliati.Do a test-run to see how the video and audio streams have been clipped. Quando si effettueranno altre esecuzioni di test con valori diversi per i punti di taglio, si noterà che tali valori non verranno tenuti in considerazioneAs you'll do more than one test-run with different values for the trimming points, you'll notice that those will not be taken into account however! perché la finestra di progettazione, diversamente dal runtime di Azure, NON esegue l'override del file XML dell'elenco di clip a ogni esecuzione.The reason for this is that the designer, unlike the Azure runtime, does NOT override the cliplist xml every run. Per questo motivo solo la prima volta che si impostano i punti di entrata e di uscita il file XML viene trasformato, invece tutte le altre volte la clausola guard (if(clipListXML.indexOf("") == -1)) impedirà al flusso di lavoro di aggiungere un altro elemento trim se ne è già presente uno.This means that only the first time you have set the in and out points, will cause the xml to transform, all the other times, our guard clause (if(clipListXML.indexOf("") == -1)) will prevent the workflow from adding another trim element when there's already one present.

Per semplificare il test locale del flusso di lavoro, è consigliabile aggiungere un codice di manutenzione che controlla se è già presente un elemento trim.To make our workflow convenient to test locally, we best add some house-keeping code that inspects if a trim element was already present. In questo caso, è possibile rimuoverlo prima di continuare a modificare il file XML con i nuovi valori.If so, we can remove it before continuing by modifying the xml with the new values. Invece di usare le normali manipolazioni di stringa, è probabilmente più sicuro eseguire questa operazione con l'analisi del modello a oggetti XML effettivo.Rather than using plain string manipulations, it's probably safer to do this through real xml object model parsing.

Prima di poter aggiungere tale codice, è tuttavia necessario aggiungere alcune istruzioni import all'inizio dello script:Before we can add such code though, we'll need to add a number of import statements at the start of our script first:

    import javax.xml.parsers.*;
    import org.xml.sax.*;
    import org.w3c.dom.*;
    import javax.xml.*;
    import javax.xml.xpath.*;
    import javax.xml.transform.*;
    import javax.xml.transform.stream.*;
    import javax.xml.transform.dom.*;

Ora è possibile aggiungere il codice di pulizia necessario:After this, we can add the required cleaning code:

    //for local testing: delete any pre-existing trim elements from the clip list xml by parsing the xml into a DOM:
    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
    DocumentBuilder builder=factory.newDocumentBuilder();
    InputSource is=new InputSource(new StringReader(clipListXML));
    Document dom=builder.parse(is);

    //find the trim element inside videoSource and audioSource and remove it if it exists already:
    XPath xpath = XPathFactory.newInstance().newXPath();
    String findAllTrimElements = "//trim";
    NodeList trimelems = xpath.evaluate(findAllTrimElements,dom,XPathConstants.NODESET);

    //copy trim nodes into a "to-be-deleted" collection
    Set<Element> elementsToDelete = new HashSet<Element>();
    for (int i = 0; i < trimelems.getLength(); i++) {
        Element e = (Element)trimelems.item(i);
        elementsToDelete.add(e);
    }

    node.log("about to delete any existing trim nodes");
     //delete the trim nodes:
    elementsToDelete.each{
        e -> e.getParentNode().removeChild(e);
    };
    node.log("deleted any existing trim nodes");

    //serialize the modified clip list xml dom into a string:
    def transformer = TransformerFactory.newInstance().newTransformer();
    StreamResult result = new StreamResult(new StringWriter());
    DOMSource source = new DOMSource(dom);
    transformer.transform(source, result);
    clipListXML = result.getWriter().toString();

Questo codice viene inserito esattamente sopra il punto in cui si aggiungono gli elementi trim nel file XML dell'elenco di clip.This code goes just above the point at which we add the trim elements to the cliplist xml.

A questo punto, è possibile eseguire e modificare il flusso di lavoro come si preferisce, applicando ogni volta le modifiche.At this point, we can run and modify our workflow as much as we want while having the changes applied ever time.

Aggiunta di una pratica proprietà ClippingEnabledAdding a ClippingEnabled convenience property

Poiché non sempre è necessario usare la funzionalità di taglio, il flusso di lavoro verrà completato aggiungendo un pratico flag booleano che indica se si vuole abilitare o meno il taglio/ritaglio.As you might not always want trimming to happen, let's finish off our workflow by adding a convenient boolean flag that indicates whether or not we want to enable trimming / clipping.

Come prima, pubblicare nella radice del flusso di lavoro una nuova proprietà denominata "ClippingEnabled" di tipo "BOOLEAN".As before, publish a new property to the root of our workflow called "ClippingEnabled" of type "BOOLEAN".

Pubblicare una proprietà per l'abilitazione del ritaglio

Pubblicare una proprietà per l'abilitazione del ritaglioPublished a property for enabling clipping

Con la semplice clausola guard seguente, è possibile controllare se il taglio è necessario e decidere se l'elenco di clip deve essere modificato o meno.With the below simple guard clause, we can check if trimming is required and decide if our clip list as such needs to be modified or not.

    //check if clipping is required:
    def clippingrequired = node.getProperty("../ClippingEnabled");
    node.log("clipping required: " + clippingrequired.toString());
    if(clippingrequired == null || clippingrequired == false)
    {
        node.setProperty("../clipListXml",clipListXML);
        node.log("no clipping required");
        return;
    }

Codice completoComplete code

    import javax.xml.parsers.*;
    import org.xml.sax.*;
    import org.w3c.dom.*;
    import javax.xml.*;
    import javax.xml.xpath.*;
    import javax.xml.transform.*;
    import javax.xml.transform.stream.*;
    import javax.xml.transform.dom.*;

    // get cliplist xml:
    def clipListXML = node.getProperty("../clipListXml");
    node.log("clip list xml coming in: \n" + clipListXML);
    // get start and end of clipping:
    def clipstart = node.getProperty("../ClippingTimeStart").toString();
    def clipend = node.getProperty("../ClippingTimeEnd").toString();

    //parse the start timing:
    def startregresult = (~/(\d\d:\d\d:\d\d:\d\d)\/(\d\d)/).matcher(clipstart);
    startregresult.matches();
    def starttimecode = startregresult.group(1);
    node.log("timecode start is: " + starttimecode);
    def startframerate = startregresult.group(2);
    node.log("framerate start is: " + startframerate);

    //parse the end timing:
    def endregresult = (~/(\d\d:\d\d:\d\d:\d\d)\/(\d\d)/).matcher(clipend);
    endregresult.matches();
    def endtimecode = endregresult.group(1);
    node.log("timecode end is: " + endtimecode);
    def endframerate = endregresult.group(2);

    node.log("framerate end is: " + endframerate);

    //for local testing: delete any pre-existing trim elements
    //from the clip list xml by parsing the xml into a DOM:

    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
    DocumentBuilder builder=factory.newDocumentBuilder();
    InputSource is=new InputSource(new StringReader(clipListXML));
    Document dom=builder.parse(is);

    //find the trim element inside videoSource and audioSource and remove it if it exists already:
    XPath xpath = XPathFactory.newInstance().newXPath();
    String findAllTrimElements = "//trim";
    NodeList trimelems = xpath.evaluate(findAllTrimElements, dom, XPathConstants.NODESET);

    //copy trim nodes into a "to-be-deleted" collection
    Set<Element> elementsToDelete = new HashSet<Element>();
    for (int i = 0; i < trimelems.getLength(); i++) {
        Element e = (Element)trimelems.item(i);
        elementsToDelete.add(e);
    }

    node.log("about to delete any existing trim nodes");
    //delete the trim nodes:
    elementsToDelete.each{ e ->
        e.getParentNode().removeChild(e);
    };
    node.log("deleted any existing trim nodes");

    //serialize the modified clip list xml dom into a string:
    def transformer = TransformerFactory.newInstance().newTransformer();
    StreamResult result = new StreamResult(new StringWriter());
    DOMSource source = new DOMSource(dom);
    transformer.transform(source, result);
    clipListXML = result.getWriter().toString();

    //check if clipping is required:
    def clippingrequired = node.getProperty("../ClippingEnabled");
    node.log("clipping required: " + clippingrequired.toString());
    if(clippingrequired == null || clippingrequired == false)
    {
        node.setProperty("../clipListXml",clipListXML);
        node.log("no clipping required");
        return;
    }

    //add trim elements to cliplist xml
    if ( clipListXML.indexOf("<trim>") == -1 )
    {
        //trim video
        clipListXML = clipListXML.replace("<videoSource>","<videoSource>\n <trim>\n <inPoint fps=\""+
            startframerate +"\">" + starttimecode +
            "</inPoint>\n" + "<outPoint fps=\"" + endframerate +"\"> " + endtimecode +
            " </outPoint>\n </trim> \n");
        //trim audio
        clipListXML = clipListXML.replace("<audioSource>","<audioSource>\n <trim>\n <inPoint fps=\""+
            startframerate +"\">" + starttimecode +
            "</inPoint>\n" + "<outPoint fps=\""+ endframerate +"\">" +
            endtimecode + "</outPoint>\n </trim>\n");
        node.log( "clip list going out: \n" +clipListXML );
        node.setProperty("../clipListXml",clipListXML);
    }

Vedere ancheAlso see

Introduzione alla codifica Premium in Servizi multimediali di AzureIntroducing Premium Encoding in Azure Media Services

Come usare la codifica Premium in Servizi multimediali di AzureHow to Use Premium Encoding in Azure Media Services

Codifica di contenuti su richiesta con Servizi multimediali di AzureEncoding On-Demand Content with Azure Media Service

Codec e formati del flusso di lavoro Premium del codificatore multimedialeMedia Encoder Premium Workflow Formats and Codecs

File del flusso di lavoro di esempioSample workflow files

Strumento di esplorazione di Servizi multimediali di AzureAzure Media Services Explorer tool

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: