Comment encoder avec une transformation personnalisée - .NETHow to encode with a custom transform - .NET

Lors de l’encodage avec Azure Media Services, vous pouvez commencer rapidement avec l’un des préréglages intégrés recommandés et basés sur les bonnes pratiques, comme illustré dans le didacticiel Streaming de fichiers.When encoding with Azure Media Services, you can get started quickly with one of the recommended built-in presets based on industry best practices as demonstrated in the Streaming files tutorial. Vous pouvez également créer un préréglage personnalisé pour les besoins de votre scénario ou votre appareil.You can also build a custom preset to target your specific scenario or device requirements.

ConsidérationsConsiderations

Lorsque vous créez des préréglages personnalisés, les considérations suivantes s’appliquent :When creating custom presets, the following considerations apply:

  • Toutes les valeurs de hauteur et de largeur de contenu AVC doivent être un multiple de 4.All values for height and width on AVC content must be a multiple of 4.
  • Dans Azure Media Services v3, toutes les vitesses d’encodage sont données en bits par seconde.In Azure Media Services v3, all of the encoding bitrates are in bits per second. Cela diffère des préréglages avec nos API v2, qui utilisaient des kilobits par seconde comme unité.This is different from the presets with our v2 APIs, which used kilobits/second as the unit. Par exemple, si la vitesse de transmission dans v2 était de 128 (kilobits/seconde), elle sera définie sur 12 8000 (bits/seconde) dans v3.For example, if the bitrate in v2 was specified as 128 (kilobits/second), in v3 it would be set to 128000 (bits/second).

Conditions préalables requisesPrerequisites

Créer un compte Media ServicesCreate a Media Services account

Télécharger l’exempleDownload the sample

Clonez un dépôt GitHub qui contient l’exemple .NET Core complet sur votre machine avec la commande suivante :Clone a GitHub repository that contains the full .NET Core sample to your machine using the following command:

git clone https://github.com/Azure-Samples/media-services-v3-dotnet-core-tutorials.git

L’exemple de préréglage personnalisé se trouve dans le dossier EncodeCustomTransform.The custom preset sample is located in the EncodeCustomTransform folder.

Créer une transformation avec un préréglage personnaliséCreate a transform with a custom preset

Quand vous créez une transformation, vous devez spécifier ce qu’elle doit produire comme sortie.When creating a new Transform, you need to specify what you want it to produce as an output. Le paramètre requis est un objet TransformOutput, comme indiqué dans le code ci-dessous.The required parameter is a TransformOutput object, as shown in the code below. Chaque objet TransformOutput contient un préréglage.Each TransformOutput contains a Preset. Le préréglage décrit les instructions détaillées concernant les opérations de traitement vidéo et/ou audio qui doivent être utilisées pour générer l’objet TransformOutput souhaité.The Preset describes the step-by-step instructions of video and/or audio processing operations that are to be used to generate the desired TransformOutput. Le TransformOutput suivant crée des valeurs de sortie de codecs et de couche personnalisés.The following TransformOutput creates custom codec and layer output settings.

Lorsque vous créez une transformation, vous devez tout d’abord vérifier s’il en existe déjà une à l’aide de la méthode Get, comme indiqué dans le code qui suit.When creating a Transform, you should first check if one already exists using the Get method, as shown in the code that follows. Dans Media Services v3, les méthodes Get appliquées sur des entités retournent null si l’entité n’existe pas (une vérification du nom ne respectant pas la casse).In Media Services v3, Get methods on entities return null if the entity doesn't exist (a case-insensitive check on the name).

ExempleExample

L’exemple suivant définit un ensemble de sorties à générer lorsque cette transformation est utilisée.The following example defines a set of outputs that we want to be generated when this Transform is used. Nous ajoutons tout d’abord une couche AacAudio pour l’encodage audio et deux couches H264Video pour l’encodage vidéo.We first add an AacAudio layer for the audio encoding and two H264Video layers for the video encoding. Dans les couches vidéo, nous attribuons des étiquettes pour pouvoir les utiliser dans les noms de fichiers de sortie.In the video layers, we assign labels so that they can be used in the output file names. Nous souhaitons ensuite que la sortie inclue également des miniatures.Next, we want the output to also include thumbnails. Dans l’exemple ci-dessous, nous spécifions des images au format PNG, générées à 50 % de la résolution de la vidéo d’entrée et à trois horodatages {25 %, 50 %, 75} de la longueur de la vidéo d’entrée.In the example below we specify images in PNG format, generated at 50% of the resolution of the input video, and at three timestamps - {25%, 50%, 75} of the length of the input video. Pour fini, nous spécifions le format des fichiers de sortie : un pour la vidéo + audio et un autre pour les miniatures.Lastly, we specify the format for the output files - one for video + audio, and another for the thumbnails. Étant donné que nous avons plusieurs couches H264, nous devons utiliser des macros qui produisent des noms uniques par couche.Since we have multiple H264Layers, we have to use macros that produce unique names per layer. Nous pouvons utiliser une macro {Label} ou {Bitrate} ; l’exemple montre la première.We can either use a {Label} or {Bitrate} macro, the example shows the former.

private static Transform EnsureTransformExists(IAzureMediaServicesClient client, string resourceGroupName, string accountName, string transformName)
{
    // Does a Transform already exist with the desired name? Assume that an existing Transform with the desired name
    // also uses the same recipe or Preset for processing content.
    Transform transform = client.Transforms.Get(resourceGroupName, accountName, transformName);

    if (transform == null)
    {
        // Create a new Transform Outputs array - this defines the set of outputs for the Transform
        TransformOutput[] outputs = new TransformOutput[]
        {
            // Create a new TransformOutput with a custom Standard Encoder Preset
            // This demonstrates how to create custom codec and layer output settings

          new TransformOutput(
                new StandardEncoderPreset(
                    codecs: new Codec[]
                    {
                        // Add an AAC Audio layer for the audio encoding
                        new AacAudio(
                            channels: 2,
                            samplingRate: 48000,
                            bitrate: 128000,
                            profile: AacAudioProfile.AacLc
                        ),
                        // Next, add a H264Video for the video encoding
                       new H264Video (
                            // Set the GOP interval to 2 seconds for both H264Layers
                            keyFrameInterval:TimeSpan.FromSeconds(2),
                             // Add H264Layers, one at HD and the other at SD. Assign a label that you can use for the output filename
                            layers:  new H264Layer[]
                            {
                                new H264Layer (
                                    bitrate: 1000000, // Units are in bits per second
                                    width: "1280",
                                    height: "720",
                                    label: "HD" // This label is used to modify the file name in the output formats
                                ),
                                new H264Layer (
                                    bitrate: 600000, 
                                    width: "640",
                                    height: "360",
                                    label: "SD"
                                )
                            }
                        ),
                        // Also generate a set of PNG thumbnails
                        new PngImage(
                            start: "25%",
                            step: "25%",
                            range: "80%",
                            layers: new PngLayer[]{
                                new PngLayer(
                                    width: "50%", 
                                    height: "50%"
                                )
                            }
                        )
                    },
                    // Specify the format for the output files - one for video+audio, and another for the thumbnails
                    formats: new Format[]
                    {
                        // Mux the H.264 video and AAC audio into MP4 files, using basename, label, bitrate and extension macros
                        // Note that since you have multiple H264Layers defined above, you have to use a macro that produces unique names per H264Layer
                        // Either {Label} or {Bitrate} should suffice
                         
                        new Mp4Format(
                            filenamePattern:"Video-{Basename}-{Label}-{Bitrate}{Extension}"
                        ),
                        new PngFormat(
                            filenamePattern:"Thumbnail-{Basename}-{Index}{Extension}"
                        )
                    }
                ),
                onError: OnErrorType.StopProcessingJob,
                relativePriority: Priority.Normal
            )
        };

        string description = "A simple custom encoding transform with 2 MP4 bitrates";
        // Create the custom Transform with the outputs defined above
        transform = client.Transforms.CreateOrUpdate(resourceGroupName, accountName, transformName, outputs, description);
    }

    return transform;
}

Étapes suivantesNext steps

Streaming de fichiersStreaming files