Jak kódovat pomocí vlastní transformace – .NET

logo Media Services verze 3


hledáte dokumentaci k Media Services v2?

Při kódování pomocí Azure Media Services můžete rychle začít s jedním z doporučených integrovaných přednastavení na základě doporučených osvědčených postupů, jak je znázorněno v kurzu streamování souborů . Můžete také vytvořit vlastní předvolby, která bude cílit na konkrétní scénář nebo požadavky na zařízení.

Požadavky

Při vytváření vlastních přednastavení platí následující požadavky:

  • Všechny hodnoty pro výšku a šířku v obsahu AVC musí být násobkem 4.
  • V Azure Media Services V3 jsou všechny přenosové rychlosti kódování v bitech za sekundu. To se liší od přednastavení s našimi rozhraními API v2, která jako jednotku používala kilobity za sekundu. Pokud je například přenosová rychlost v v2 zadaná jako 128 (kilobit/s), ve verzi V3 by se nastavila na 128000 (bity za sekundu).

Požadavky

Vytvoření účtu Media Services

Stažení ukázky

Naklonujte úložiště GitHub, které obsahuje úplný vzorek .NET Core pro váš počítač, pomocí následujícího příkazu:

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

Ukázka vlastní předvolby se nachází v kódování s vlastní předvolbu pomocí složky .NET .

Vytvoření transformace pomocí vlastní předvolby

Když vytváříte novou transformaci, je potřeba určit, co má vytvořit jako výstup. Objekt TransformOutput v níže uvedeném kódu je povinný parametr. Každý objekt TransformOutput obsahuje Předvolbu. Přednastavení popisuje podrobné pokyny k operacím zpracování videa nebo zvuku, které se mají použít ke generování požadovaných TransformOutput. Následující TransformOutput vytvoří vlastní kodek a výstupní nastavení vrstvy.

Než začnete vytvářet transformaci, ověřte si nejdřív pomocí metody Get, jestli už neexistuje (viz kód níže). V Media Services V3 vrátí metody Get v entitách hodnotu null , pokud entita neexistuje (u názvu se nerozlišuje malá a velká písmena).

Ukázka vlastní transformace

Následující příklad definuje sadu výstupů, které chceme vygenerovat při použití této transformace. Nejprve přidáme AacAudio vrstvu pro kódování zvuku a dvě vrstvy H264Video pro kódování videa. Ve vrstvách videa přiřadíme popisky, aby je bylo možné použít v názvech výstupních souborů. Dále chceme, aby výstup zahrnoval také miniatury. V následujícím příkladu určíme obrázky ve formátu PNG, které se generují při 50 % rozlišení vstupního videa a se třemi časovými razítky – {25 %, 50 %, 75 % } délky vstupního videa. Nakonec určíme formát výstupních souborů – jeden pro video + zvuk a druhý pro miniatury. Vzhledem k tomu, že máme více vrstev H264Layer, musíme použít makra, která vytvářejí jedinečné názvy pro každou vrstvu. Můžeme použít buď makro {Label} nebo , příklad ukazuje {Bitrate} první.

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

Další kroky

Streamování souborů