Coderen met een aangepaste transformatie - .NET

media services logo v3


Zoekt u Media Services v2-documentatie?

Wanneer u codeert met Azure Media Services, kunt u snel aan de slag met een van de aanbevolen ingebouwde voorinstellingen op basis van de aanbevolen procedures voor de branche, zoals wordt gedemonstreerd in de zelfstudie Streaming-bestanden. U kunt ook een aangepaste voorinstelling maken die is gericht op uw specifieke scenario of apparaatvereisten.

Overwegingen

Bij het maken van aangepaste voorinstellingen zijn de volgende overwegingen van toepassing:

  • Alle waarden voor hoogte en breedte voor AVC-inhoud moeten een veelvoud van 4 zijn.
  • In Azure Media Services v3 zijn alle coderingsbitrates in bits per seconde. Dit verschilt van de voorinstellingen met onze v2-API's, die kilobits/seconde als eenheid hebben gebruikt. Als de bitrate in v2 bijvoorbeeld is opgegeven als 128 (kilobits/seconde), wordt deze in v3 ingesteld op 128000 (bits per seconde).

Vereisten

Een Azure Media Services-account maken

Het voorbeeld downloaden

Kloon een GitHub-opslagplaats met het volledige .NET Core-voorbeeld op uw computer met behulp van de volgende opdracht:

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

Het aangepaste vooraf ingestelde voorbeeld bevindt zich in de map Encoding met een aangepaste voorinstelling met behulp van .NET.

Een transformatie maken met een aangepaste voorinstelling

Wanneer u een nieuwe transformatie maakt,moet u opgeven wat u wilt dat deze als uitvoer produceert. De vereiste parameter is een TransformOutput-object, zoals weergegeven in de onderstaande code. Elke transformatie-uitvoer bevat een voorinstelling. De voorinstelling beschrijft de stapsgewijs instructies van video- en/of audioverwerkingsbewerkingen die moeten worden gebruikt om de gewenste TransformOutput te genereren. Met de volgende TransformOutput worden aangepaste codec- en laaguitvoerinstellingen gemaakt.

Bij het maken van een transformatie moet u controleren of er al een bestaat met de methode Ophalen zoals weergegeven in de volgende code. In Media Services v3 retourneren De methoden voor het op halen van entiteiten null als de entiteit niet bestaat (een niet-casegevoelige controle op de naam).

Voorbeeld van aangepaste transformatie

Het volgende voorbeeld definieert een set uitvoer die we willen genereren wanneer deze transformatie wordt gebruikt. We voegen eerst een AacAudio-laag toe voor de audiocoderen en twee H264Video-lagen voor de videocoderen. In de videolagen wijzen we labels toe, zodat ze kunnen worden gebruikt in de namen van het uitvoerbestand. Vervolgens willen we dat de uitvoer ook miniaturen bevat. In het onderstaande voorbeeld geven we afbeeldingen op in PNG-indeling, gegenereerd op 50% van de resolutie van de invoervideo en op drie tijdstempels: {25%, 50%, 75%} van de lengte van de invoervideo. Ten laatste geven we de indeling voor de uitvoerbestanden op: één voor video en audio en een voor de miniaturen. Omdat we meerdere H264Layers hebben, moeten we macro's gebruiken die unieke namen per laag produceren. We kunnen een macro of {Label} {Bitrate} gebruiken. In het voorbeeld ziet u de eerste macro.

/// <summary>
/// If the specified transform exists, return that transform. If the it does not
/// exist, creates a new transform with the specified output. In this case, the
/// output is set to encode a video using a custom preset.
/// </summary>
/// <param name="client">The Media Services client.</param>
/// <param name="resourceGroupName">The name of the resource group within the Azure subscription.</param>
/// <param name="accountName"> The Media Services account name.</param>
/// <param name="transformName">The transform name.</param>
/// <returns></returns>
private static async Task<Transform> CreateCustomTransform(IAzureMediaServicesClient client, string resourceGroupName, string accountName, string transformName)
{

    Console.WriteLine("Creating a custom transform...");

    // 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 all H264Layers
                            keyFrameInterval:TimeSpan.FromSeconds(2),
                             // Add H264Layers. Assign a label that you can use for the output filename
                            layers:  new H264Layer[]
                            {
                                new H264Layer (
                                    bitrate: 3600000, // Units are in bits per second and not kbps or Mbps - 3.6 Mbps or 3,600 kbps
                                    width: "1280",
                                    height: "720",
                                    label: "HD-3600kbps" // This label is used to modify the file name in the output formats
                                ),
                                new H264Layer (
                                    bitrate: 1600000, // Units are in bits per second and not kbps or Mbps - 1.6 Mbps or 1600 kbps
                                    width: "960",
                                    height: "540",
                                    label: "SD-1600kbps" // This label is used to modify the file name in the output formats
                                ),
                                new H264Layer (
                                    bitrate: 600000, // Units are in bits per second and not kbps or Mbps - 0.6 Mbps or 600 kbps
                                    width: "640",
                                    height: "360",
                                    label: "SD-600kbps" // This label is used to modify the file name in the output formats
                                ),
                            }
                        ),
                        // 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";

    // Does a Transform already exist with the desired name? This method will just overwrite (Update) the Transform if it exists already. 
    // In production code, you may want to be cautious about that. It really depends on your scenario.
    Transform transform = await client.Transforms.CreateOrUpdateAsync(resourceGroupName, accountName, transformName, outputs, description);

    return transform;
}

Volgende stappen

Bestanden streamen